diff options
-rw-r--r-- | lib.c | 5 | ||||
-rw-r--r-- | parser.c | 25 |
2 files changed, 30 insertions, 0 deletions
@@ -11808,6 +11808,11 @@ tail: val sn = car(iter); populate_obj_hash(slot(obj, sn), ctx); } + } else if (treep(obj)) { + val iter = tree_begin(obj); + val node; + while ((node = tree_next(iter))) + populate_obj_hash(key(node), ctx); } break; case FUN: @@ -57,6 +57,7 @@ #include "sysif.h" #include "cadr.h" #include "struct.h" +#include "tree.h" #include "parser.h" #include "regex.h" #include "itypes.h" @@ -400,7 +401,31 @@ tail: else circ_backpatch(p, &cs, sv); } + } else if (treep(obj)) { + val iter = tree_begin(obj); + val node; + val nodes = nil; + + while ((node = tree_next(iter))) { + val k = node->tn.key; + val rk = patch_ref(p, k); + if (rk) + set(mkloc(node->tn.key, node), rk); + else + circ_backpatch(p, &cs, k); + push(node, &nodes); + } + + if (nodes) { + tree_clear(obj); + + while (nodes) { + val node = pop(&nodes); + tree_insert_node(obj, node); + } + } } + break; case FUN: if (obj->f.functype == FINTERP) { |