aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/objects.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-28 10:40:22 +0200
committerBad Diode <bd@badd10de.dev>2021-10-28 10:40:22 +0200
commitd04aea3c5875cd2859d6ab961256b11189c49839 (patch)
tree911b6df338dde38ed28c447cfba999bcc3cb1743 /src/bytecode/objects.c
parent4515d21211263a2c7367ec20ec01ce9efaae1d18 (diff)
downloadbdl-d04aea3c5875cd2859d6ab961256b11189c49839.tar.gz
bdl-d04aea3c5875cd2859d6ab961256b11189c49839.zip
Prepare for closure capture
Diffstat (limited to 'src/bytecode/objects.c')
-rw-r--r--src/bytecode/objects.c29
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
25Object 25Object
26make_lambda(StringView name) { 26make_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
71void 74void
72object_free(Object obj) { 75object_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;