diff options
-rwxr-xr-x | src/bytecode/chunk.h | 6 | ||||
-rwxr-xr-x | src/bytecode/compiler.h | 11 | ||||
-rwxr-xr-x | src/bytecode/darray.h | 2 | ||||
-rwxr-xr-x | src/bytecode/objects.h | 39 |
4 files changed, 43 insertions, 15 deletions
diff --git a/src/bytecode/chunk.h b/src/bytecode/chunk.h index 81fc4cc..aafa0ec 100755 --- a/src/bytecode/chunk.h +++ b/src/bytecode/chunk.h | |||
@@ -32,6 +32,12 @@ chunk_init(void) { | |||
32 | void | 32 | void |
33 | chunk_free(Chunk *chunk) { | 33 | chunk_free(Chunk *chunk) { |
34 | array_free(chunk->code); | 34 | array_free(chunk->code); |
35 | for (size_t i = 0; i < array_size(chunk->constants); i++) { | ||
36 | Object obj = chunk->constants[i]; | ||
37 | if (IS_STRING(obj) || IS_SYMBOL(obj)) { | ||
38 | array_free(obj.text); | ||
39 | } | ||
40 | } | ||
35 | array_free(chunk->constants); | 41 | array_free(chunk->constants); |
36 | array_free(chunk->lines); | 42 | array_free(chunk->lines); |
37 | free(chunk); | 43 | free(chunk); |
diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h index 7a25678..02d938f 100755 --- a/src/bytecode/compiler.h +++ b/src/bytecode/compiler.h | |||
@@ -215,16 +215,13 @@ parse_tree(Chunk *chunk, Visitor *vs) { | |||
215 | return; | 215 | return; |
216 | } break; | 216 | } break; |
217 | case TOKEN_STRING: { | 217 | case TOKEN_STRING: { |
218 | // Object *obj = make_string(); | 218 | Object obj = make_string(tok.value); |
219 | // push_root(obj); | 219 | emit_constant(chunk, tok, obj); |
220 | // append_string(obj, tok.value); | ||
221 | // return obj; | ||
222 | return; | 220 | return; |
223 | } break; | 221 | } break; |
224 | case TOKEN_SYMBOL: { | 222 | case TOKEN_SYMBOL: { |
225 | // Object *obj = make_symbol(tok.value); | 223 | Object obj = make_symbol(tok.value); |
226 | // push_root(obj); | 224 | emit_constant(chunk, tok, obj); |
227 | // return obj; | ||
228 | return; | 225 | return; |
229 | } break; | 226 | } break; |
230 | case TOKEN_NIL: { | 227 | case TOKEN_NIL: { |
diff --git a/src/bytecode/darray.h b/src/bytecode/darray.h index e8cdc36..fa4e293 100755 --- a/src/bytecode/darray.h +++ b/src/bytecode/darray.h | |||
@@ -63,7 +63,7 @@ static inline | |||
63 | char * _array_insert(char *arr, const char *src, size_t n_bytes, size_t type_size) { | 63 | char * _array_insert(char *arr, const char *src, size_t n_bytes, size_t type_size) { |
64 | ArrayHeader *head = array_head(arr); | 64 | ArrayHeader *head = array_head(arr); |
65 | size_t new_size = n_bytes + head->size; | 65 | size_t new_size = n_bytes + head->size; |
66 | if (new_size >= head->cap * type_size) { | 66 | if (new_size > head->cap * type_size) { |
67 | if (head->cap == 0) { | 67 | if (head->cap == 0) { |
68 | head->cap = 1; | 68 | head->cap = 1; |
69 | } | 69 | } |
diff --git a/src/bytecode/objects.h b/src/bytecode/objects.h index 35a954f..17809d5 100755 --- a/src/bytecode/objects.h +++ b/src/bytecode/objects.h | |||
@@ -1,6 +1,9 @@ | |||
1 | #ifndef BDL_OBJECTS_H | 1 | #ifndef BDL_OBJECTS_H |
2 | #define BDL_OBJECTS_H | 2 | #define BDL_OBJECTS_H |
3 | 3 | ||
4 | #include "string_view.h" | ||
5 | #include "darray.h" | ||
6 | |||
4 | typedef enum ObjectType { | 7 | typedef enum ObjectType { |
5 | OBJ_TYPE_NIL, | 8 | OBJ_TYPE_NIL, |
6 | OBJ_TYPE_TRUE, | 9 | OBJ_TYPE_TRUE, |
@@ -24,9 +27,9 @@ typedef struct Object { | |||
24 | 27 | ||
25 | // OBJ_TYPE_STRING | 28 | // OBJ_TYPE_STRING |
26 | // OBJ_TYPE_SYMBOL | 29 | // OBJ_TYPE_SYMBOL |
27 | // struct { | 30 | struct { |
28 | // char *text; | 31 | char *text; |
29 | // }; | 32 | }; |
30 | 33 | ||
31 | // OBJ_TYPE_PAIR | 34 | // OBJ_TYPE_PAIR |
32 | // struct { | 35 | // struct { |
@@ -59,6 +62,28 @@ void display(Object obj); | |||
59 | #define IS_TRUE(VAL) ((VAL).type != OBJ_TYPE_FALSE) | 62 | #define IS_TRUE(VAL) ((VAL).type != OBJ_TYPE_FALSE) |
60 | #define IS_FALSE(VAL) ((VAL).type == OBJ_TYPE_FALSE) | 63 | #define IS_FALSE(VAL) ((VAL).type == OBJ_TYPE_FALSE) |
61 | #define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM) | 64 | #define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM) |
65 | #define IS_STRING(VAL) ((VAL).type == OBJ_TYPE_STRING) | ||
66 | #define IS_SYMBOL(VAL) ((VAL).type == OBJ_TYPE_SYMBOL) | ||
67 | |||
68 | Object make_string(StringView sv) { | ||
69 | Object obj = { | ||
70 | .type = OBJ_TYPE_STRING, | ||
71 | .text = NULL, | ||
72 | }; | ||
73 | array_init(obj.text, sv.n); | ||
74 | array_insert(obj.text, sv.start, sv.n); | ||
75 | return obj; | ||
76 | } | ||
77 | |||
78 | Object make_symbol(StringView sv) { | ||
79 | Object obj = { | ||
80 | .type = OBJ_TYPE_SYMBOL, | ||
81 | .text = NULL, | ||
82 | }; | ||
83 | array_init(obj.text, sv.n); | ||
84 | array_insert(obj.text, sv.start, sv.n); | ||
85 | return obj; | ||
86 | } | ||
62 | 87 | ||
63 | void | 88 | void |
64 | display(Object obj) { | 89 | display(Object obj) { |
@@ -67,19 +92,19 @@ display(Object obj) { | |||
67 | printf("%zd", obj.fixnum); | 92 | printf("%zd", obj.fixnum); |
68 | } break; | 93 | } break; |
69 | case OBJ_TYPE_TRUE: { | 94 | case OBJ_TYPE_TRUE: { |
70 | printf("true"); | 95 | printf("true"); |
71 | } break; | 96 | } break; |
72 | case OBJ_TYPE_FALSE: { | 97 | case OBJ_TYPE_FALSE: { |
73 | printf("false"); | 98 | printf("false"); |
74 | } break; | 99 | } break; |
75 | case OBJ_TYPE_NIL: { | 100 | case OBJ_TYPE_NIL: { |
76 | printf("()"); | 101 | printf("()"); |
77 | } break; | 102 | } break; |
78 | case OBJ_TYPE_STRING: { | 103 | case OBJ_TYPE_STRING: { |
79 | // printf("\"%.*s\"", (int)array_size(obj.string), obj.string); | 104 | printf("\"%.*s\"", (int)array_size(obj.text), obj.text); |
80 | } break; | 105 | } break; |
81 | case OBJ_TYPE_SYMBOL: { | 106 | case OBJ_TYPE_SYMBOL: { |
82 | // printf(":%.*s", (int)array_size(obj.symbol), obj.symbol); | 107 | printf(":%.*s", (int)array_size(obj.text), obj.text); |
83 | } break; | 108 | } break; |
84 | case OBJ_TYPE_PAIR: { | 109 | case OBJ_TYPE_PAIR: { |
85 | // printf("("); | 110 | // printf("("); |