+int
+ao_lisp_poly_move(ao_poly *ref, uint8_t do_note_cons)
+{
+ uint8_t type;
+ ao_poly p = *ref;
+ const struct ao_lisp_type *lisp_type;
+ int ret;
+ void *addr;
+
+ if (!p)
+ return 1;
+
+ type = ao_lisp_poly_base_type(p);
+ addr = ao_lisp_ref(p);
+ if (type == AO_LISP_CONS && do_note_cons) {
+ note_cons(addr);
+ addr = check_move(addr, sizeof (struct ao_lisp_cons));
+ ret = 1;
+ } else {
+
+ 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;
+ 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;
+}
+
+#ifdef DBG_POOL
+static int AO_LISP_POOL_CUR = AO_LISP_POOL / 8;
+
+static void
+ao_lisp_poison(void)
+{
+ int i;
+
+ printf("poison\n");
+ ao_lisp_mark_busy();
+ for (i = 0; i < AO_LISP_POOL_CUR; i += 4) {
+ uint32_t *a = (uint32_t *) &ao_lisp_pool[i];
+ if (!busy_object(ao_lisp_busy, a))
+ *a = 0xBEEFBEEF;
+ }
+ for (i = 0; i < AO_LISP_POOL_CUR; i += 2) {
+ ao_poly *a = (uint16_t *) &ao_lisp_pool[i];
+ ao_poly p = *a;
+
+ if (!ao_lisp_is_const(p)) {
+ void *r = ao_lisp_ref(p);
+
+ if (ao_lisp_pool <= (uint8_t *) r &&
+ (uint8_t *) r <= ao_lisp_pool + AO_LISP_POOL_CUR)
+ {
+ if (!busy_object(ao_lisp_busy, r)) {
+ printf("missing reference from %d to %d\n",
+ (int) ((uint8_t *) a - ao_lisp_pool),
+ (int) ((uint8_t *) r - ao_lisp_pool));
+ }
+ }
+ }
+ }
+}
+
+#else
+#define AO_LISP_POOL_CUR AO_LISP_POOL
+#endif
+