projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altos/lisp: Add continuations
[fw/altos]
/
src
/
lisp
/
ao_lisp_mem.c
diff --git
a/src/lisp/ao_lisp_mem.c
b/src/lisp/ao_lisp_mem.c
index 12a5ba5502a32e158f284c8864de7028ef5d18cf..0dfad1d7c87bcc6286b924698730a63a849c3dcb 100644
(file)
--- a/
src/lisp/ao_lisp_mem.c
+++ b/
src/lisp/ao_lisp_mem.c
@@
-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_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[] = {
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_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]
{
.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_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
};
static int
@@
-818,6
+832,20
@@
ao_lisp_cons_fetch(int id)
return cons;
}
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)
{
void
ao_lisp_string_stash(int id, char *string)
{