From 101c6fdce11e26cd43ec85d7ae0590957cbe1c51 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 13 Oct 2021 20:16:07 +0200 Subject: Add a function to duplicate objects --- src/bootstrap/objects.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'src/bootstrap') 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) { obj->string_n += sv.n; } +Object * +obj_duplicate(Object *obj) { + Object *copy = obj_err; + switch (obj->type) { + case OBJ_TYPE_BOOL: + case OBJ_TYPE_NIL: + case OBJ_TYPE_PROCEDURE: + case OBJ_TYPE_ERR: { + copy = obj; + } break; + case OBJ_TYPE_FIXNUM: { + copy = make_fixnum(obj->fixnum); + } break; + case OBJ_TYPE_SYMBOL: { + copy = make_symbol((StringView){obj->symbol, obj->symbol_n}); + } break; + case OBJ_TYPE_STRING: { + copy = make_string(); + append_string(copy, (StringView){obj->string, obj->string_n}); + } break; + case OBJ_TYPE_PAIR: { + Object *root = make_pair(obj_duplicate(obj->car), obj_nil); + copy = root; + obj = obj->cdr; + while (obj != obj_nil) { + root->cdr = make_pair(obj_duplicate(obj->car), obj_nil); + root = root->cdr; + obj = obj->cdr; + } + } break; + } + return copy; +} + void free_objects(Object *root) { switch (root->type) { -- cgit v1.2.1