summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-11-18 21:14:47 -0800
committerKeith Packard <keithp@keithp.com>2016-11-18 21:14:47 -0800
commit048a610f42cef7f3422baaab2ba2d4ce03e59768 (patch)
tree8b6f01c026877d5f4f3cfd8b1204e0fde41ee86a
parentae2f70e6162b99de40155ff9f12ee2396cd7802c (diff)
altos/lisp: Use poly stashes for stacks
Saves some memory. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--src/lisp/ao_lisp.h24
-rw-r--r--src/lisp/ao_lisp_mem.c49
-rw-r--r--src/lisp/ao_lisp_string.c2
3 files changed, 29 insertions, 46 deletions
diff --git a/src/lisp/ao_lisp.h b/src/lisp/ao_lisp.h
index cea834fc..e238d4fe 100644
--- a/src/lisp/ao_lisp.h
+++ b/src/lisp/ao_lisp.h
@@ -468,22 +468,26 @@ struct ao_lisp_cons *
ao_lisp_cons_fetch(int id);
void
-ao_lisp_string_stash(int id, char *string);
+ao_lisp_poly_stash(int id, ao_poly poly);
-char *
-ao_lisp_string_fetch(int id);
+ao_poly
+ao_lisp_poly_fetch(int id);
void
-ao_lisp_stack_stash(int id, struct ao_lisp_stack *stack);
+ao_lisp_string_stash(int id, char *string);
-struct ao_lisp_stack *
-ao_lisp_stack_fetch(int id);
+char *
+ao_lisp_string_fetch(int id);
-void
-ao_lisp_poly_stash(int id, ao_poly poly);
+static inline void
+ao_lisp_stack_stash(int id, struct ao_lisp_stack *stack) {
+ ao_lisp_poly_stash(id, ao_lisp_stack_poly(stack));
+}
-ao_poly
-ao_lisp_poly_fetch(int id);
+static inline struct ao_lisp_stack *
+ao_lisp_stack_fetch(int id) {
+ return ao_lisp_poly_stack(ao_lisp_poly_fetch(id));
+}
/* cons */
extern const struct ao_lisp_type ao_lisp_cons_type;
diff --git a/src/lisp/ao_lisp_mem.c b/src/lisp/ao_lisp_mem.c
index 0dfad1d7..2599f719 100644
--- a/src/lisp/ao_lisp_mem.c
+++ b/src/lisp/ao_lisp_mem.c
@@ -144,8 +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 ao_poly save_poly[3];
static const struct ao_lisp_root ao_lisp_root[] = {
{
@@ -157,24 +156,12 @@ static const struct ao_lisp_root ao_lisp_root[] = {
.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]
+ .addr = (void **) &save_string[0],
},
{
.type = &ao_lisp_string_type,
- .addr = (void **) &save_string[1]
+ .addr = (void **) &save_string[1],
},
{
.type = NULL,
@@ -185,6 +172,10 @@ static const struct ao_lisp_root ao_lisp_root[] = {
.addr = (void **) &save_poly[1]
},
{
+ .type = NULL,
+ .addr = (void **) &save_poly[2]
+ },
+ {
.type = &ao_lisp_atom_type,
.addr = (void **) &ao_lisp_atoms
},
@@ -833,17 +824,17 @@ ao_lisp_cons_fetch(int id)
}
void
-ao_lisp_stack_stash(int id, struct ao_lisp_stack *stack)
+ao_lisp_poly_stash(int id, ao_poly poly)
{
- save_stack[id] = stack;
+ save_poly[id] = poly;
}
-struct ao_lisp_stack *
-ao_lisp_stack_fetch(int id)
+ao_poly
+ao_lisp_poly_fetch(int id)
{
- struct ao_lisp_stack *stack = save_stack[id];
- save_stack[id] = NULL;
- return stack;
+ ao_poly poly = save_poly[id];
+ save_poly[id] = AO_LISP_NIL;
+ return poly;
}
void
@@ -859,16 +850,4 @@ ao_lisp_string_fetch(int id)
save_string[id] = NULL;
return string;
}
-void
-ao_lisp_poly_stash(int id, ao_poly poly)
-{
- save_poly[id] = poly;
-}
-ao_poly
-ao_lisp_poly_fetch(int id)
-{
- ao_poly poly = save_poly[id];
- save_poly[id] = AO_LISP_NIL;
- return poly;
-}
diff --git a/src/lisp/ao_lisp_string.c b/src/lisp/ao_lisp_string.c
index 207d4f3b..cd7b27a9 100644
--- a/src/lisp/ao_lisp_string.c
+++ b/src/lisp/ao_lisp_string.c
@@ -104,9 +104,9 @@ ao_lisp_string_unpack(char *a)
ao_lisp_cons_stash(1, tail);
ao_lisp_string_stash(0, a);
struct ao_lisp_cons *n = ao_lisp_cons_cons(ao_lisp_int_poly(c), NULL);
+ a = ao_lisp_string_fetch(0);
cons = ao_lisp_cons_fetch(0);
tail = ao_lisp_cons_fetch(1);
- a = ao_lisp_string_fetch(0);
if (!n) {
cons = NULL;