#include "../memory/allocator.h" 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 { char *chars; int length; } string_val; struct { struct Object **items; int count; int capacity; } list_val; } data; } Object; Object *obj_new_int(void *allocator, int value) { Object *objPtr = (Object *)JLANG_malloc(allocator, sizeof(Object)); objPtr->type = OBJ_INT; objPtr->data.int_val = value; return objPtr; } Object *obj_new_float(void *allocator, float value) { Object *objPtr = (Object *)JLANG_malloc(allocator, sizeof(Object)); objPtr->type = OBJ_FLOAT; objPtr->data.float_val = value; return objPtr; } Object *obj_new_string(void *allocator, const char *str) { Object *objPtr = (Object *)JLANG_malloc(allocator, sizeof(Object)); objPtr->type = OBJ_STRING; int len = strlen(str); char *buffer = (char *)JLANG_malloc(allocator, len + 1); memcpy(buffer, str, len + 1); objPtr->data.string_val.chars = buffer; objPtr->data.string_val.length = len; return objPtr; } Object *obj_new_list(void *allocator) { Object *objPtr = (Object *)JLANG_malloc(allocator, sizeof(Object)); objPtr->type = OBJ_LIST; return objPtr; } void obj_free(void *allocator, Object* obj) { if (obj->type == OBJ_STRING) { JLANG_free(allocator, obj->data.string_val.chars); } JLANG_free(allocator, obj); } void obj_print(Object *obj) { 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", obj->data.string_val.chars); break; default: break; } }