Add class support with constructors, fields, and methods
This commit is contained in:
@@ -3,11 +3,10 @@
|
||||
|
||||
#include "../memory/allocator.h"
|
||||
|
||||
|
||||
#define JLANG_RESOLVE(alloc, offset) \
|
||||
((void *)(((JLANG_memory_allocator *)(alloc))->memory + (offset)))
|
||||
|
||||
typedef enum { OBJ_INT, OBJ_FLOAT, OBJ_STRING, OBJ_LIST, OBJ_NONE } ObjectType;
|
||||
typedef enum { OBJ_INT, OBJ_FLOAT, OBJ_STRING, OBJ_LIST, OBJ_NONE, OBJ_INSTANCE } ObjectType;
|
||||
|
||||
typedef struct Object {
|
||||
ObjectType type;
|
||||
@@ -23,9 +22,38 @@ typedef struct Object {
|
||||
int count;
|
||||
int capacity;
|
||||
} list_val;
|
||||
struct {
|
||||
int class_index; // indice en Chunk.classes[]
|
||||
size_t field_names; // heap offset -> array de int
|
||||
size_t field_values; // heap offset -> array de Value
|
||||
int field_count;
|
||||
int field_capacity;
|
||||
} instance_val;
|
||||
} data;
|
||||
} Object;
|
||||
|
||||
size_t obj_new_instance(void *allocator, int class_index, int capacity, size_t value_size) {
|
||||
size_t offset = JLANG_malloc(allocator, sizeof(Object));
|
||||
Object *objPtr = (Object *)JLANG_RESOLVE(allocator, offset);
|
||||
objPtr->type = OBJ_INSTANCE;
|
||||
objPtr->data.instance_val.class_index = class_index;
|
||||
objPtr->data.instance_val.field_count = 0;
|
||||
objPtr->data.instance_val.field_capacity = capacity;
|
||||
|
||||
// alloc array de nombres
|
||||
size_t namesOffset = JLANG_malloc(allocator, capacity * sizeof(int));
|
||||
objPtr = (Object *) JLANG_RESOLVE(allocator, offset); // re-resolve
|
||||
|
||||
// alloc array de valores
|
||||
size_t valuesOffset = JLANG_malloc(allocator, capacity * value_size);
|
||||
objPtr = (Object *) JLANG_RESOLVE(allocator, offset); // re-resolve
|
||||
|
||||
objPtr->data.instance_val.field_names = namesOffset;
|
||||
objPtr->data.instance_val.field_values = valuesOffset;
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
size_t obj_new_int(void *allocator, int value) {
|
||||
// Object *objPtr = (Object *)JLANG_malloc(allocator, sizeof(Object));
|
||||
size_t offset = JLANG_malloc(allocator, sizeof(Object));
|
||||
@@ -91,10 +119,16 @@ void obj_free(void *allocator, size_t offset) {
|
||||
JLANG_free(allocator, obj->data.list_val.items);
|
||||
}
|
||||
|
||||
if (obj->type == OBJ_INSTANCE) {
|
||||
JLANG_free(allocator, obj->data.instance_val.field_names);
|
||||
JLANG_free(allocator, obj->data.instance_val.field_values);
|
||||
}
|
||||
|
||||
JLANG_free(allocator, offset);
|
||||
}
|
||||
|
||||
void obj_print(void *allocator, size_t offset, const char *preffix, const char *suffix) {
|
||||
void obj_print(void *allocator, size_t offset, const char *preffix,
|
||||
const char *suffix) {
|
||||
Object *obj = (Object *)JLANG_RESOLVE(allocator, offset);
|
||||
|
||||
switch (obj->type) {
|
||||
|
||||
Reference in New Issue
Block a user