#include "ao_lisp.h"
#include <assert.h>
+const struct ao_lisp_type ao_lisp_stack_type;
+
static int
stack_size(void *addr)
{
ao_lisp_poly_mark(stack->values, 0);
/* no need to mark values_tail */
ao_lisp_poly_mark(stack->frame, 0);
+ ao_lisp_poly_mark(stack->list, 0);
stack = ao_lisp_poly_stack(stack->prev);
- if (ao_lisp_mark_memory(stack, sizeof (struct ao_lisp_stack)))
+ if (ao_lisp_mark_memory(&ao_lisp_stack_type, stack))
break;
}
}
-static const struct ao_lisp_type ao_lisp_stack_type;
-
static void
stack_move(void *addr)
{
while (stack) {
struct ao_lisp_stack *prev;
- int ret;
+ int ret;
(void) ao_lisp_poly_move(&stack->sexprs, 0);
(void) ao_lisp_poly_move(&stack->values, 0);
(void) ao_lisp_poly_move(&stack->values_tail, 0);
(void) ao_lisp_poly_move(&stack->frame, 0);
+ (void) ao_lisp_poly_move(&stack->list, 0);
prev = ao_lisp_poly_stack(stack->prev);
- ret = ao_lisp_move_memory((void **) &prev,
- sizeof (struct ao_lisp_stack));
+ if (!prev)
+ break;
+ ret = ao_lisp_move_memory(&ao_lisp_stack_type, (void **) &prev);
if (prev != ao_lisp_poly_stack(stack->prev))
stack->prev = ao_lisp_stack_poly(prev);
if (ret)
}
}
-static const struct ao_lisp_type ao_lisp_stack_type = {
+const struct ao_lisp_type ao_lisp_stack_type = {
.size = stack_size,
.mark = stack_mark,
- .move = stack_move
+ .move = stack_move,
+ .name = "stack"
};
struct ao_lisp_stack *ao_lisp_stack;
[eval_while_test] = ao_lisp_eval_while_test,
};
+/*
+ * Called at restore time to reset all execution state
+ */
+
+void
+ao_lisp_eval_clear_globals(void)
+{
+ ao_lisp_stack = NULL;
+ ao_lisp_frame_current = NULL;
+ ao_lisp_v = AO_LISP_NIL;
+}
+
+int
+ao_lisp_eval_restart(void)
+{
+ return ao_lisp_stack_push();
+}
+
ao_poly
ao_lisp_eval(ao_poly _v)
{
- static uint8_t been_here;
-
ao_lisp_v = _v;
- if (!been_here) {
- been_here = 1;
- ao_lisp_root_add(&ao_lisp_stack_type, &ao_lisp_stack);
- ao_lisp_root_poly_add(&ao_lisp_v);
- }
if (!ao_lisp_stack_push())
return AO_LISP_NIL;