diff options
| author | Keith Packard <keithp@keithp.com> | 2016-11-06 10:53:46 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2017-02-20 11:16:50 -0800 | 
| commit | 6e5c1308ce33a864095eae02e7db18b0e043ab6e (patch) | |
| tree | 3b77c2de9f95b73a39a63533000898196c855c7c /src/lisp/ao_lisp_eval.c | |
| parent | d8cf97fe22acefab40d7bb321138e46d4483fef7 (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.c | 14 | 
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)) | 
