summaryrefslogtreecommitdiff
path: root/src/lisp/ao_lisp_prim.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-11-02 22:56:01 -0700
committerKeith Packard <keithp@keithp.com>2016-11-17 22:18:39 -0800
commit71bf5774083e7f0d87ea609a73d6cfb7f60de9d9 (patch)
tree142c088e920ddd3646b685a40741e5358afc19e6 /src/lisp/ao_lisp_prim.c
parentd134a38c57429070ee5d4f74dafca4489e4b1443 (diff)
altos/lisp: Separate out values from atoms
This enables changing values of atoms declared as constants, should enable lets, and with some work, even lexical scoping. this required changing the constant computation to run ao_lisp_collect() before dumping the block of constant data, and that uncovered some minor memory manager bugs. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_prim.c')
-rw-r--r--src/lisp/ao_lisp_prim.c41
1 files changed, 19 insertions, 22 deletions
diff --git a/src/lisp/ao_lisp_prim.c b/src/lisp/ao_lisp_prim.c
index 38dcb961..e9367553 100644
--- a/src/lisp/ao_lisp_prim.c
+++ b/src/lisp/ao_lisp_prim.c
@@ -31,35 +31,32 @@ ao_lisp_poly_print(ao_poly p)
return p;
}
+static const struct ao_lisp_type const *ao_lisp_types[AO_LISP_NUM_TYPE] = {
+ [AO_LISP_CONS] = &ao_lisp_cons_type,
+ [AO_LISP_STRING] = &ao_lisp_string_type,
+ [AO_LISP_ATOM] = &ao_lisp_atom_type,
+ [AO_LISP_BUILTIN] = &ao_lisp_builtin_type,
+};
+
void
ao_lisp_poly_mark(ao_poly p)
{
- switch (ao_lisp_poly_type(p)) {
- case AO_LISP_CONS:
- ao_lisp_mark(&ao_lisp_cons_type, ao_lisp_poly_cons(p));
- break;
- case AO_LISP_STRING:
- ao_lisp_mark(&ao_lisp_string_type, ao_lisp_poly_string(p));
- break;
- case AO_LISP_ATOM:
- ao_lisp_mark(&ao_lisp_atom_type, ao_lisp_poly_atom(p));
- break;
- }
+ const struct ao_lisp_type *lisp_type = ao_lisp_types[ao_lisp_poly_type(p)];
+ if (lisp_type)
+ ao_lisp_mark(lisp_type, ao_lisp_ref(p));
}
ao_poly
ao_lisp_poly_move(ao_poly p)
{
- switch (ao_lisp_poly_type(p)) {
- case AO_LISP_CONS:
- p = ao_lisp_cons_poly(ao_lisp_move(&ao_lisp_cons_type, ao_lisp_poly_cons(p)));
- break;
- case AO_LISP_STRING:
- p = ao_lisp_string_poly(ao_lisp_move(&ao_lisp_string_type, ao_lisp_poly_string(p)));
- break;
- case AO_LISP_ATOM:
- p = ao_lisp_atom_poly(ao_lisp_move(&ao_lisp_atom_type, ao_lisp_poly_atom(p)));
- break;
- }
+ uint8_t type = p & AO_LISP_TYPE_MASK;
+ const struct ao_lisp_type *lisp_type;
+
+ if (type == AO_LISP_OTHER)
+ type = ao_lisp_other_type(ao_lisp_move_map(ao_lisp_poly_other(p)));
+
+ lisp_type = ao_lisp_types[type];
+ if (lisp_type)
+ p = ao_lisp_poly(ao_lisp_move(lisp_type, ao_lisp_ref(p)), p & AO_LISP_TYPE_MASK);
return p;
}