diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bootstrap/objects.c | 34 |
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 | ||
114 | Object * | ||
115 | obj_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 | |||
114 | void | 148 | void |
115 | free_objects(Object *root) { | 149 | free_objects(Object *root) { |
116 | switch (root->type) { | 150 | switch (root->type) { |