diff options
Diffstat (limited to 'src/bytecode/objects.c')
-rw-r--r-- | src/bytecode/objects.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/src/bytecode/objects.c b/src/bytecode/objects.c index 3b4a2eb..c2fb989 100644 --- a/src/bytecode/objects.c +++ b/src/bytecode/objects.c | |||
@@ -23,11 +23,13 @@ make_symbol(StringView sv) { | |||
23 | } | 23 | } |
24 | 24 | ||
25 | Object | 25 | Object |
26 | make_lambda(StringView name) { | 26 | make_lambda(Chunk *chunk) { |
27 | Object obj = { | 27 | Object obj = { |
28 | .type = OBJ_TYPE_LAMBDA, | 28 | .type = OBJ_TYPE_LAMBDA, |
29 | .chunk = chunk_init(name), | ||
30 | }; | 29 | }; |
30 | obj.closure = malloc(sizeof(Closure)); | ||
31 | obj.closure->chunk = chunk; | ||
32 | array_init(obj.closure->values, 0); | ||
31 | return obj; | 33 | return obj; |
32 | } | 34 | } |
33 | 35 | ||
@@ -58,8 +60,9 @@ object_display(Object obj) { | |||
58 | // printf(")"); | 60 | // printf(")"); |
59 | } break; | 61 | } break; |
60 | case OBJ_TYPE_LAMBDA: { | 62 | case OBJ_TYPE_LAMBDA: { |
63 | Chunk *chunk = obj.closure->chunk; | ||
61 | printf("#{procedure:%.*s}", | 64 | printf("#{procedure:%.*s}", |
62 | (int)array_size(obj.chunk->name), obj.chunk->name); | 65 | (int)array_size(chunk->name), chunk->name); |
63 | } break; | 66 | } break; |
64 | case OBJ_TYPE_ERR: { | 67 | case OBJ_TYPE_ERR: { |
65 | printf("#{error}"); | 68 | printf("#{error}"); |
@@ -69,13 +72,21 @@ object_display(Object obj) { | |||
69 | } | 72 | } |
70 | 73 | ||
71 | void | 74 | void |
72 | object_free(Object obj) { | 75 | object_free(Object *obj) { |
73 | if (IS_STRING(obj) || IS_SYMBOL(obj)) { | 76 | if (IS_STRING(*obj) || IS_SYMBOL(*obj)) { |
74 | array_free(obj.text); | 77 | array_free(obj->text); |
75 | return; | 78 | return; |
76 | } | 79 | } |
77 | if (IS_LAMBDA(obj)) { | 80 | if (IS_LAMBDA(*obj)) { |
78 | chunk_free(obj.chunk); | 81 | Closure *closure = obj->closure; |
82 | for (size_t i = 0; i < array_size(closure->values); i++) { | ||
83 | object_free(&closure->values[i]); | ||
84 | } | ||
85 | array_free(closure->values); | ||
86 | // NOTE: we are leaking memory without this, we'll need a GC | ||
87 | // soon... | ||
88 | // chunk_free(closure->chunk); | ||
89 | free(closure); | ||
79 | } | 90 | } |
80 | } | 91 | } |
81 | 92 | ||
@@ -104,7 +115,7 @@ object_equal(Object a, Object b) { | |||
104 | } | 115 | } |
105 | } break; | 116 | } break; |
106 | case OBJ_TYPE_LAMBDA: { | 117 | case OBJ_TYPE_LAMBDA: { |
107 | return a.chunk == b.chunk; | 118 | return a.closure == b.closure; |
108 | } break; | 119 | } break; |
109 | default: { | 120 | default: { |
110 | return false; | 121 | return false; |