#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 struct Object { ObjectType type; union { int int_val; double float_val; struct { size_t chars; int length; } string_val; struct { struct Object **items; int count; int capacity; } list_val; } data; } Object; 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)); Object *objPtr = (Object *)JLANG_RESOLVE(allocator, offset); objPtr->type = OBJ_INT; objPtr->data.int_val = value; return offset; } size_t obj_new_float(void *allocator, float value) { size_t offset = JLANG_malloc(allocator, sizeof(Object)); Object *objPtr = (Object *)JLANG_RESOLVE(allocator, offset); objPtr->type = OBJ_FLOAT; objPtr->data.float_val = value; return offset; } size_t obj_new_string(void *allocator, const char *str) { size_t offset = JLANG_malloc(allocator, sizeof(Object)); Object *objPtr = (Object *)JLANG_RESOLVE(allocator, offset); objPtr->type = OBJ_STRING; int len = strlen(str); // !! CUIDADO CON ESTE DOBLE MALLOC SI DISPARA EL GROW !! size_t bufferOffset = JLANG_malloc(allocator, len + 1); char *buffer = (char *)JLANG_RESOLVE(allocator, bufferOffset); memcpy(buffer, str, len + 1); objPtr->data.string_val.chars = bufferOffset; objPtr->data.string_val.length = len; return offset; } size_t obj_new_list(void *allocator) { size_t offset = JLANG_malloc(allocator, sizeof(Object)); Object *objPtr = (Object *)JLANG_RESOLVE(allocator, offset); objPtr->type = OBJ_LIST; return offset; } void obj_free(void *allocator, size_t offset) { // if (obj->type == OBJ_STRING) { // JLANG_free(allocator, obj->data.string_val.chars); // } JLANG_free(allocator, offset); } void obj_print(void *allocator, size_t offset) { Object *obj = (Object *)JLANG_RESOLVE(allocator, offset); switch (obj->type) { case OBJ_INT: printf("%d", obj->data.int_val); break; case OBJ_FLOAT: printf("%f", obj->data.float_val); break; // case OBJ_LIST: // for (int i = 0; i < obj->data.list_val.count; i++) { // obj_print(obj->data.list_val.items[i]); // } // break; case OBJ_STRING: printf("%s", (char *)JLANG_RESOLVE(allocator, obj->data.string_val.chars)); break; default: break; } }