+int
+ao_lisp_poly_move(ao_poly *ref, uint8_t do_note_cons)
+{
+ uint8_t type;
+ ao_poly p = *ref;
+ int ret;
+ void *addr;
+
+ if (!p)
+ return 1;
+
+ type = ao_lisp_poly_base_type(p);
+ addr = ao_lisp_ref(p);
+
+ if (!AO_LISP_IS_POOL(addr))
+ return 1;
+
+ if (type == AO_LISP_CONS && do_note_cons) {
+// addr = move_map(addr);
+ MDBG_DO(if (addr != move_map(addr)) MDBG_MOVE("noting cons at old addr %d instead of new addr %d\n", MDBG_OFFSET(addr), MDBG_OFFSET(move_map(addr))););
+
+ note_cons(addr);
+ addr = move_map(addr);
+ ret = 1;
+ } else {
+ const struct ao_lisp_type *lisp_type;
+
+ if (type == AO_LISP_OTHER) {
+ type = ao_lisp_other_type(move_map(ao_lisp_poly_other(p)));
+ if (type <= AO_LISP_OTHER || AO_LISP_NUM_TYPE <= type)
+ ao_lisp_abort();
+ }
+
+ lisp_type = ao_lisp_types[type];
+ if (!lisp_type)
+ return 1;
+ ret = ao_lisp_move(lisp_type, &addr);
+ }
+
+ /* Re-write the poly value */
+ if (addr != ao_lisp_ref(p)) {
+ ao_poly np = ao_lisp_poly(addr, p & AO_LISP_TYPE_MASK);
+ MDBG_MOVE("poly %d moved %d -> %d\n",
+ type, MDBG_OFFSET(ao_lisp_ref(p)), MDBG_OFFSET(ao_lisp_ref(np)));
+ *ref = np;
+ }
+ return ret;
+}
+
+#ifdef MDBG_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
+
+#if DBG_MEM
+void
+ao_lisp_validate(void)
+{
+ chunk_low = 0;
+ memset(ao_lisp_chunk, '\0', sizeof (ao_lisp_chunk));
+ walk(ao_lisp_mark_ref, ao_lisp_poly_mark_ref);
+}
+
+int dbg_allocs;
+
+#endif
+
+