From 1ed74bf56c3f9352dc64a6039958450cbe3c28f1 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 7 Oct 2019 20:16:49 -0700 Subject: tree: circular notation support. * lib.c (populate_obj_hash): Handle tree object. * parser.c (circ_backpatch): Likewise. --- lib.c | 5 +++++ parser.c | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) 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) { -- cgit v1.2.3