diff options
| author | Keith Packard <keithp@keithp.com> | 2017-12-12 18:00:12 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2017-12-12 18:09:11 -0800 | 
| commit | c490efdf90befdf048ff7d9cbbe26bcc6f942820 (patch) | |
| tree | ad35813e4de9382f17dd25d7978ed9d58fc5ce98 /src/scheme/ao_scheme_frame.c | |
| parent | ca27d467198c556be483961a6ca3b8f97bbe96a6 (diff) | |
altos/scheme: Use direct calls from frame to frame_vals mem functions
Avoids the extra stack depth of the poly versions.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/scheme/ao_scheme_frame.c')
| -rw-r--r-- | src/scheme/ao_scheme_frame.c | 18 | 
1 files changed, 14 insertions, 4 deletions
| diff --git a/src/scheme/ao_scheme_frame.c b/src/scheme/ao_scheme_frame.c index e5d481e7..7f521863 100644 --- a/src/scheme/ao_scheme_frame.c +++ b/src/scheme/ao_scheme_frame.c @@ -84,10 +84,13 @@ frame_mark(void *addr)  	struct ao_scheme_frame	*frame = addr;  	for (;;) { +		struct ao_scheme_frame_vals	*vals = ao_scheme_poly_frame_vals(frame->vals); +  		MDBG_MOVE("frame mark %d\n", MDBG_OFFSET(frame));  		if (!AO_SCHEME_IS_POOL(frame))  			break; -		ao_scheme_poly_mark(frame->vals, 0); +		if (!ao_scheme_mark_memory(&ao_scheme_frame_vals_type, vals)) +			frame_vals_mark(vals);  		frame = ao_scheme_poly_frame(frame->prev);  		MDBG_MOVE("frame next %d\n", MDBG_OFFSET(frame));  		if (!frame) @@ -103,13 +106,20 @@ frame_move(void *addr)  	struct ao_scheme_frame	*frame = addr;  	for (;;) { -		struct ao_scheme_frame	*prev; -		int			ret; +		struct ao_scheme_frame		*prev; +		struct ao_scheme_frame_vals	*vals; +		int				ret;  		MDBG_MOVE("frame move %d\n", MDBG_OFFSET(frame));  		if (!AO_SCHEME_IS_POOL(frame))  			break; -		ao_scheme_poly_move(&frame->vals, 0); + +		vals = ao_scheme_poly_frame_vals(frame->vals); +		if (!ao_scheme_move_memory(&ao_scheme_frame_vals_type, (void **) &vals)) +			frame_vals_move(vals); +		if (vals != ao_scheme_poly_frame_vals(frame->vals)) +			frame->vals = ao_scheme_frame_vals_poly(vals); +  		prev = ao_scheme_poly_frame(frame->prev);  		if (!prev)  			break; | 
