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_prim.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_prim.c')
| -rw-r--r-- | src/lisp/ao_lisp_prim.c | 51 | 
1 files changed, 0 insertions, 51 deletions
| diff --git a/src/lisp/ao_lisp_prim.c b/src/lisp/ao_lisp_prim.c index 82386a83..3c081ee8 100644 --- a/src/lisp/ao_lisp_prim.c +++ b/src/lisp/ao_lisp_prim.c @@ -76,54 +76,3 @@ ao_lisp_poly_patom(ao_poly p)  		f->patom(p);  } -static const struct ao_lisp_type const *ao_lisp_types[AO_LISP_NUM_TYPE] = { -	[AO_LISP_CONS] = &ao_lisp_cons_type, -	[AO_LISP_INT] = NULL, -	[AO_LISP_STRING] = &ao_lisp_string_type, -	[AO_LISP_OTHER] = (void *) 0x1, -	[AO_LISP_ATOM] = &ao_lisp_atom_type, -	[AO_LISP_BUILTIN] = &ao_lisp_builtin_type, -	[AO_LISP_FRAME] = &ao_lisp_frame_type, -}; - -int -ao_lisp_poly_mark(ao_poly p) -{ -	const struct ao_lisp_type *lisp_type = ao_lisp_types[ao_lisp_poly_type(p)]; -	if (lisp_type) -		return ao_lisp_mark(lisp_type, ao_lisp_ref(p)); -	return 1; -} - -int -ao_lisp_poly_move(ao_poly *ref) -{ -	uint8_t				type; -	ao_poly				p = *ref; -	const struct ao_lisp_type	*lisp_type; -	int				ret; -	void				*addr; - -	if (!p) -		return 1; - -	type = p & AO_LISP_TYPE_MASK; -	if (type == AO_LISP_OTHER) -		type = ao_lisp_other_type(ao_lisp_move_map(ao_lisp_poly_other(p))); - -	if (type >= AO_LISP_NUM_TYPE) -		abort(); - -	lisp_type = ao_lisp_types[type]; -	if (!lisp_type) -		return 1; -	addr = ao_lisp_ref(p); -	ret = ao_lisp_move(lisp_type, &addr); -	if (addr != ao_lisp_ref(p)) { -		ao_poly np = ao_lisp_poly(addr, p & AO_LISP_TYPE_MASK); -		DBG("poly %d moved %04x -> %04x\n", -		    type, p, np); -		*ref = np; -	} -	return ret; -} | 
