diff options
-rw-r--r-- | gc.c | 11 | ||||
-rw-r--r-- | gc.h | 1 | ||||
-rw-r--r-- | lib.c | 13 | ||||
-rw-r--r-- | tree.c | 4 |
4 files changed, 16 insertions, 13 deletions
@@ -269,6 +269,17 @@ val make_obj(void) abort(); } +val copy_obj(val orig) +{ + val copy = make_obj(); + *copy = *orig; +#if CONFIG_GEN_GC + copy->t.fincount = 0; + copy->t.gen = 0; +#endif + return copy; +} + static void finalize(val obj) { switch (convert(type_t, obj->t.type)) { @@ -30,6 +30,7 @@ void gc_late_init(void); val prot1(val *loc); void protect(val *, ...); val make_obj(void); +val copy_obj(val); void gc(void); int gc_state(int); int gc_inprogress(void); @@ -7494,8 +7494,7 @@ val copy_fun(val ofun) val self = lit("copy-fun"); type_check(self, ofun, FUN); { - val nfun = make_obj(); - nfun->f = ofun->f; + val nfun = copy_obj(ofun); if (nfun->f.env) nfun->f.env = if3(nfun->f.functype == FVM, @@ -9692,9 +9691,7 @@ val copy_cons(val cell) case CONS: case LCONS: { - val obj = make_obj(); - *obj = *cell; - return obj; + return copy_obj(cell); } default: type_mismatch(lit("copy-cons: ~s is not a cons"), cell, nao); @@ -9708,11 +9705,7 @@ val copy_tree(val tree) } else { val car = copy_tree(tree->c.car); val cdr = copy_tree(tree->c.cdr); - val copy = make_obj(); - *copy = *tree; - copy->c.car = car; - copy->c.cdr = cdr; - return copy; + return cons(car, cdr); } } @@ -140,9 +140,7 @@ val set_key(val node, val nkey) val copy_tnode(val node) { - val obj = (type_check(lit("copy-tnode"), node, TNOD), make_obj()); - obj->tn = node->tn; - return obj; + return (type_check(lit("copy-tnode"), node, TNOD), copy_obj(node)); } static ucnum tn_size(val node) |