summaryrefslogtreecommitdiff
path: root/src/lisp/ao_lisp_eval.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_eval.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_eval.c')
-rw-r--r--src/lisp/ao_lisp_eval.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/lisp/ao_lisp_eval.c b/src/lisp/ao_lisp_eval.c
index e3d653b9..a5c74250 100644
--- a/src/lisp/ao_lisp_eval.c
+++ b/src/lisp/ao_lisp_eval.c
@@ -79,10 +79,10 @@ stack_mark(void *addr)
{
struct ao_lisp_stack *stack = addr;
for (;;) {
- ao_lisp_poly_mark(stack->actuals);
- ao_lisp_poly_mark(stack->formals);
+ ao_lisp_poly_mark(stack->actuals, 0);
+ ao_lisp_poly_mark(stack->formals, 0);
/* no need to mark formals_tail */
- ao_lisp_poly_mark(stack->frame);
+ ao_lisp_poly_mark(stack->frame, 0);
stack = ao_lisp_poly_stack(stack->prev);
if (ao_lisp_mark_memory(stack, sizeof (struct ao_lisp_stack)))
break;
@@ -122,10 +122,10 @@ stack_move(void *addr)
while (stack) {
void *prev;
int ret;
- (void) ao_lisp_poly_move(&stack->actuals);
- (void) ao_lisp_poly_move(&stack->formals);
- (void) ao_lisp_poly_move(&stack->formals_tail);
- (void) ao_lisp_poly_move(&stack->frame);
+ (void) ao_lisp_poly_move(&stack->actuals, 0);
+ (void) ao_lisp_poly_move(&stack->formals, 0);
+ (void) ao_lisp_poly_move(&stack->formals_tail, 0);
+ (void) ao_lisp_poly_move(&stack->frame, 0);
prev = ao_lisp_poly_stack(stack->prev);
ret = ao_lisp_move(&ao_lisp_stack_type, &prev);
if (prev != ao_lisp_poly_stack(stack->prev))