summaryrefslogtreecommitdiff
path: root/src/lisp/ao_lisp_frame.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-11-06 10:53:46 -0800
committerKeith Packard <keithp@keithp.com>2016-11-17 22:18:39 -0800
commitb97b9f8199d1f65d2304b035c4f99b5a1c76f61b (patch)
treedf65524df6271dde7107a32c6a3db93dd603f879 /src/lisp/ao_lisp_frame.c
parent954bc72d5822e0f5666e80764e798c10b1eb541d (diff)
altos/lisp: convert GC to non-recursive
Use a boolean array to note cons cells which would otherwise recurse, then loop until that array is empty. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_frame.c')
-rw-r--r--src/lisp/ao_lisp_frame.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/lisp/ao_lisp_frame.c b/src/lisp/ao_lisp_frame.c
index 8bf98571..8791c4de 100644
--- a/src/lisp/ao_lisp_frame.c
+++ b/src/lisp/ao_lisp_frame.c
@@ -48,7 +48,7 @@ frame_mark(void *addr)
for (f = 0; f < frame->num; f++) {
struct ao_lisp_val *v = &frame->vals[f];
- ao_lisp_poly_mark(v->val);
+ ao_lisp_poly_mark(v->val, 0);
DBG ("\tframe mark atom %s %d val %d at %d\n",
ao_lisp_poly_atom(v->atom)->name,
OFFSET(v->atom), OFFSET(v->val), f);
@@ -69,19 +69,28 @@ frame_move(void *addr)
int f;
for (;;) {
+ struct ao_lisp_frame *next;
+ int ret;
+
DBG("frame move %p\n", frame);
if (!AO_LISP_IS_POOL(frame))
break;
for (f = 0; f < frame->num; f++) {
struct ao_lisp_val *v = &frame->vals[f];
- ao_lisp_poly_move(&v->atom);
+ ao_lisp_poly_move(&v->atom, 0);
DBG("moved atom %s\n", ao_lisp_poly_atom(v->atom)->name);
- ao_lisp_poly_move(&v->val);
+ ao_lisp_poly_move(&v->val, 0);
}
- if (ao_lisp_poly_move(&frame->next))
+ next = ao_lisp_poly_frame(frame->next);
+ ret = 1;
+ if (next)
+ ret = ao_lisp_move_memory((void **) &next, frame_size(next));
+ if (next != ao_lisp_poly_frame(frame->next))
+ frame->next = ao_lisp_frame_poly(next);
+ if (ret)
break;
- frame = ao_lisp_poly_frame(frame->next);
+ frame = next;
}
}