+static void
+stack_move(void *addr)
+{
+ struct ao_lisp_stack *stack = addr;
+
+ while (stack) {
+ void *prev;
+ int ret;
+ (void) ao_lisp_poly_move(&stack->actuals);
+ (void) ao_lisp_poly_move(&stack->formals);
+ (void) ao_lisp_poly_move(&stack->frame);
+ prev = ao_lisp_poly_stack(stack->prev);
+ ret = ao_lisp_move(&ao_lisp_stack_type, &prev);
+ if (prev != ao_lisp_poly_stack(stack->prev))
+ stack->prev = ao_lisp_stack_poly(prev);
+ if (ret);
+ break;
+ stack = ao_lisp_poly_stack(stack->prev);
+ }
+}
+
+static const struct ao_lisp_type ao_lisp_stack_type = {
+ .size = stack_size,
+ .mark = stack_mark,
+ .move = stack_move
+};
+
+static struct ao_lisp_stack *ao_lisp_stack;
+static ao_poly ao_lisp_v;
+static uint8_t been_here;
+
+ao_poly
+ao_lisp_set_cond(struct ao_lisp_cons *c)
+{
+ ao_lisp_stack->state = eval_cond;
+ ao_lisp_stack->actuals = ao_lisp_cons_poly(c);
+ return AO_LISP_NIL;
+}
+
+void
+ao_lisp_stack_reset(struct ao_lisp_stack *stack)
+{
+ stack->state = eval_sexpr;
+ stack->macro = 0;
+ stack->actuals = AO_LISP_NIL;
+ stack->formals = AO_LISP_NIL;
+ stack->formals_tail = AO_LISP_NIL;
+ stack->frame = ao_lisp_frame_poly(ao_lisp_frame_current);
+}
+
+struct ao_lisp_stack *
+ao_lisp_stack_push(void)
+{
+ struct ao_lisp_stack *stack = ao_lisp_alloc(sizeof (struct ao_lisp_stack));
+ if (!stack)
+ return NULL;
+ stack->prev = ao_lisp_stack_poly(ao_lisp_stack);
+ ao_lisp_stack = stack;
+ ao_lisp_stack_reset(stack);
+ DBGI("stack push\n");
+ DBG_IN();
+ return stack;
+}
+
+struct ao_lisp_stack *
+ao_lisp_stack_pop(void)
+{
+ if (!ao_lisp_stack)
+ return NULL;
+ DBG_OUT();
+ DBGI("stack pop\n");
+ ao_lisp_stack = ao_lisp_poly_stack(ao_lisp_stack->prev);
+ if (ao_lisp_stack)
+ ao_lisp_frame_current = ao_lisp_poly_frame(ao_lisp_stack->frame);
+ else
+ ao_lisp_frame_current = NULL;
+ return ao_lisp_stack;
+}
+
+static void
+ao_lisp_stack_clear(void)
+{
+ ao_lisp_stack = NULL;
+ ao_lisp_frame_current = NULL;
+}