-static const struct ao_lisp_type const *ao_lisp_types[AO_LISP_NUM_TYPE] = {
- [AO_LISP_CONS] = &ao_lisp_cons_type,
- [AO_LISP_INT] = NULL,
- [AO_LISP_STRING] = &ao_lisp_string_type,
- [AO_LISP_OTHER] = (void *) 0x1,
- [AO_LISP_ATOM] = &ao_lisp_atom_type,
- [AO_LISP_BUILTIN] = &ao_lisp_builtin_type,
- [AO_LISP_FRAME] = &ao_lisp_frame_type,
-};
-
-int
-ao_lisp_poly_mark(ao_poly p)
-{
- const struct ao_lisp_type *lisp_type = ao_lisp_types[ao_lisp_poly_type(p)];
- if (lisp_type)
- return ao_lisp_mark(lisp_type, ao_lisp_ref(p));
- return 1;
-}
-
-int
-ao_lisp_poly_move(ao_poly *ref)
-{
- uint8_t type;
- ao_poly p = *ref;
- const struct ao_lisp_type *lisp_type;
- int ret;
- void *addr;
-
- if (!p)
- return 1;
-
- type = p & AO_LISP_TYPE_MASK;
- if (type == AO_LISP_OTHER)
- type = ao_lisp_other_type(ao_lisp_move_map(ao_lisp_poly_other(p)));
-
- if (type >= AO_LISP_NUM_TYPE)
- abort();
-
- lisp_type = ao_lisp_types[type];
- if (!lisp_type)
- return 1;
- addr = ao_lisp_ref(p);
- ret = ao_lisp_move(lisp_type, &addr);
- if (addr != ao_lisp_ref(p)) {
- ao_poly np = ao_lisp_poly(addr, p & AO_LISP_TYPE_MASK);
- DBG("poly %d moved %04x -> %04x\n",
- type, p, np);
- *ref = np;
- }
- return ret;
-}