summaryrefslogtreecommitdiff
path: root/src/scheme
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2017-12-12 18:00:12 -0800
committerKeith Packard <keithp@keithp.com>2017-12-12 18:09:11 -0800
commitc490efdf90befdf048ff7d9cbbe26bcc6f942820 (patch)
treead35813e4de9382f17dd25d7978ed9d58fc5ce98 /src/scheme
parentca27d467198c556be483961a6ca3b8f97bbe96a6 (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')
-rw-r--r--src/scheme/ao_scheme_frame.c18
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;