altos/lisp: Add continuations
[fw/altos] / src / lisp / ao_lisp_mem.c
index 12a5ba5502a32e158f284c8864de7028ef5d18cf..0dfad1d7c87bcc6286b924698730a63a849c3dcb 100644 (file)
@@ -144,6 +144,7 @@ struct ao_lisp_root {
 
 static struct ao_lisp_cons     *save_cons[2];
 static char                    *save_string[2];
+static struct ao_lisp_stack    *save_stack[3];
 static ao_poly                 save_poly[2];
 
 static const struct ao_lisp_root       ao_lisp_root[] = {
@@ -155,6 +156,18 @@ static const struct ao_lisp_root   ao_lisp_root[] = {
                .type = &ao_lisp_cons_type,
                .addr = (void **) &save_cons[1],
        },
+       {
+               .type = &ao_lisp_stack_type,
+               .addr = (void **) &save_stack[0]
+       },
+       {
+               .type = &ao_lisp_stack_type,
+               .addr = (void **) &save_stack[1]
+       },
+       {
+               .type = &ao_lisp_stack_type,
+               .addr = (void **) &save_stack[2]
+       },
        {
                .type = &ao_lisp_string_type,
                .addr = (void **) &save_string[0]
@@ -434,6 +447,7 @@ static const struct ao_lisp_type const *ao_lisp_types[AO_LISP_NUM_TYPE] = {
        [AO_LISP_BUILTIN] = &ao_lisp_builtin_type,
        [AO_LISP_FRAME] = &ao_lisp_frame_type,
        [AO_LISP_LAMBDA] = &ao_lisp_lambda_type,
+       [AO_LISP_STACK] = &ao_lisp_stack_type,
 };
 
 static int
@@ -818,6 +832,20 @@ ao_lisp_cons_fetch(int id)
        return cons;
 }
 
+void
+ao_lisp_stack_stash(int id, struct ao_lisp_stack *stack)
+{
+       save_stack[id] = stack;
+}
+
+struct ao_lisp_stack *
+ao_lisp_stack_fetch(int id)
+{
+       struct ao_lisp_stack *stack = save_stack[id];
+       save_stack[id] = NULL;
+       return stack;
+}
+
 void
 ao_lisp_string_stash(int id, char *string)
 {