summaryrefslogtreecommitdiff
path: root/src/lisp/ao_lisp_lambda.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-11-15 20:18:59 -0800
committerKeith Packard <keithp@keithp.com>2017-02-20 11:16:51 -0800
commit881161fe1c5fb0e2b1220c30572eb2c45bedbafe (patch)
tree36070649f2e3d46de239f769cc67cc765f3b9c9a /src/lisp/ao_lisp_lambda.c
parent994adc7a47cbf3cbf6041eca7430273f8018de08 (diff)
altos/lisp: re-use small frames
This saves a pile more use of the allocator by noting when frames have not been referenced from another frame and freeing them when they go out of scope. Frames with references are left to the allocator to deal with. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_lambda.c')
-rw-r--r--src/lisp/ao_lisp_lambda.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/lisp/ao_lisp_lambda.c b/src/lisp/ao_lisp_lambda.c
index 0dd8c698..8b761714 100644
--- a/src/lisp/ao_lisp_lambda.c
+++ b/src/lisp/ao_lisp_lambda.c
@@ -94,7 +94,7 @@ ao_lisp_lambda_alloc(struct ao_lisp_cons *code, int args)
lambda->type = AO_LISP_LAMBDA;
lambda->args = args;
lambda->code = ao_lisp_cons_poly(code);
- lambda->frame = ao_lisp_frame_poly(ao_lisp_frame_current);
+ lambda->frame = ao_lisp_frame_mark(ao_lisp_frame_current);
DBGI("build frame: "); DBG_POLY(lambda->frame); DBG("\n");
DBG_STACK();
return ao_lisp_lambda_poly(lambda);
@@ -179,7 +179,7 @@ ao_lisp_lambda_eval(void)
next_frame->vals[0].val = cons->cdr;
break;
}
- next_frame->next = lambda->frame;
+ next_frame->prev = lambda->frame;
DBGI("eval frame: "); DBG_POLY(ao_lisp_frame_poly(next_frame)); DBG("\n");
ao_lisp_frame_current = next_frame;
ao_lisp_stack->frame = ao_lisp_frame_poly(ao_lisp_frame_current);