altos/lisp: Do better checking for un-evaluated macros in ROM
[fw/altos] / src / lisp / ao_lisp_lambda.c
index 6020a8b8b1a8482e970d891c49306171d7e593b5..8b7617144b61d4625ab56d0719f46fcc2b92826b 100644 (file)
@@ -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);
@@ -168,6 +168,7 @@ ao_lisp_lambda_eval(void)
                        args = ao_lisp_poly_cons(args->cdr);
                        vals = ao_lisp_poly_cons(vals->cdr);
                }
+               ao_lisp_cons_free(cons);
                break;
        }
        case AO_LISP_FUNC_LEXPR:
@@ -178,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);