aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/objects.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-16 21:22:08 +0200
committerBad Diode <bd@badd10de.dev>2021-10-16 21:22:08 +0200
commitbb58afb57221eb0316d6ee14e19c5f4c4a822ba1 (patch)
treef7e35285282ad2341740a83834bdb521cd61a857 /src/bootstrap/objects.c
parent9a5fceac983db127de876c875a59307f8f2893ba (diff)
downloadbdl-bb58afb57221eb0316d6ee14e19c5f4c4a822ba1.tar.gz
bdl-bb58afb57221eb0316d6ee14e19c5f4c4a822ba1.zip
Add a working GC with mark-and-sweep
Diffstat (limited to 'src/bootstrap/objects.c')
-rw-r--r--src/bootstrap/objects.c35
1 files changed, 0 insertions, 35 deletions
diff --git a/src/bootstrap/objects.c b/src/bootstrap/objects.c
index 2bd5b1a..09076db 100644
--- a/src/bootstrap/objects.c
+++ b/src/bootstrap/objects.c
@@ -116,41 +116,6 @@ append_string(Object *obj, const StringView sv) {
116 obj->string_n += sv.n; 116 obj->string_n += sv.n;
117} 117}
118 118
119Object *
120obj_duplicate(Object *obj) {
121 Object *copy = obj_err;
122 switch (obj->type) {
123 case OBJ_TYPE_BOOL:
124 case OBJ_TYPE_NIL:
125 case OBJ_TYPE_PROCEDURE:
126 case OBJ_TYPE_LAMBDA: // TODO: should we duplicate everything inside?
127 case OBJ_TYPE_ERR: {
128 copy = obj;
129 } break;
130 case OBJ_TYPE_FIXNUM: {
131 copy = make_fixnum(obj->fixnum);
132 } break;
133 case OBJ_TYPE_SYMBOL: {
134 copy = make_symbol((StringView){obj->symbol, obj->symbol_n});
135 } break;
136 case OBJ_TYPE_STRING: {
137 copy = make_string();
138 append_string(copy, (StringView){obj->string, obj->string_n});
139 } break;
140 case OBJ_TYPE_PAIR: {
141 Object *root = make_pair(obj_duplicate(obj->car), obj_nil);
142 copy = root;
143 obj = obj->cdr;
144 while (obj != obj_nil) {
145 root->cdr = make_pair(obj_duplicate(obj->car), obj_nil);
146 root = root->cdr;
147 obj = obj->cdr;
148 }
149 } break;
150 }
151 return copy;
152}
153
154void display(Object *root); 119void display(Object *root);
155 120
156void 121void