add JLANG_free and Object
This commit is contained in:
101
src/objects/object.h
Normal file
101
src/objects/object.h
Normal file
@@ -0,0 +1,101 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user