summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib.c5
-rw-r--r--parser.c25
2 files changed, 30 insertions, 0 deletions
diff --git a/lib.c b/lib.c
index ef781a89..c0ad5c96 100644
--- a/lib.c
+++ b/lib.c
@@ -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:
diff --git a/parser.c b/parser.c
index 7661d60c..03e99750 100644
--- a/parser.c
+++ b/parser.c
@@ -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) {