aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-13 20:16:07 +0200
committerBad Diode <bd@badd10de.dev>2021-10-13 20:16:07 +0200
commit101c6fdce11e26cd43ec85d7ae0590957cbe1c51 (patch)
tree236f22e67be7303afa2b64853624948004208c7f
parente81f139ecd62a7db014ec40ec887abb9afb17664 (diff)
downloadbdl-101c6fdce11e26cd43ec85d7ae0590957cbe1c51.tar.gz
bdl-101c6fdce11e26cd43ec85d7ae0590957cbe1c51.zip
Add a function to duplicate objects
-rw-r--r--src/bootstrap/objects.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/bootstrap/objects.c b/src/bootstrap/objects.c
index 497a04d..fd76166 100644
--- a/src/bootstrap/objects.c
+++ b/src/bootstrap/objects.c
@@ -111,6 +111,40 @@ append_string(Object *obj, const StringView sv) {
111 obj->string_n += sv.n; 111 obj->string_n += sv.n;
112} 112}
113 113
114Object *
115obj_duplicate(Object *obj) {
116 Object *copy = obj_err;
117 switch (obj->type) {
118 case OBJ_TYPE_BOOL:
119 case OBJ_TYPE_NIL:
120 case OBJ_TYPE_PROCEDURE:
121 case OBJ_TYPE_ERR: {
122 copy = obj;
123 } break;
124 case OBJ_TYPE_FIXNUM: {
125 copy = make_fixnum(obj->fixnum);
126 } break;
127 case OBJ_TYPE_SYMBOL: {
128 copy = make_symbol((StringView){obj->symbol, obj->symbol_n});
129 } break;
130 case OBJ_TYPE_STRING: {
131 copy = make_string();
132 append_string(copy, (StringView){obj->string, obj->string_n});
133 } break;
134 case OBJ_TYPE_PAIR: {
135 Object *root = make_pair(obj_duplicate(obj->car), obj_nil);
136 copy = root;
137 obj = obj->cdr;
138 while (obj != obj_nil) {
139 root->cdr = make_pair(obj_duplicate(obj->car), obj_nil);
140 root = root->cdr;
141 obj = obj->cdr;
142 }
143 } break;
144 }
145 return copy;
146}
147
114void 148void
115free_objects(Object *root) { 149free_objects(Object *root) {
116 switch (root->type) { 150 switch (root->type) {