- cdr = ao_lisp_poly_cons(cons->cdr);
- ret = ao_lisp_move_memory((void **) &cdr, sizeof (struct ao_lisp_cons));
- if (cdr != ao_lisp_poly_cons(cons->cdr))
- cons->cdr = ao_lisp_cons_poly(cdr);
+ cdr = cons->cdr;
+ if (!cdr)
+ break;
+ if (ao_lisp_poly_type(cdr) != AO_LISP_CONS) {
+ (void) ao_lisp_poly_move(&cons->cdr, 1);
+ break;
+ }
+ c = ao_lisp_poly_cons(cdr);
+ ret = ao_lisp_move_memory(&ao_lisp_cons_type, (void **) &c);
+ if (c != ao_lisp_poly_cons(cons->cdr))
+ cons->cdr = ao_lisp_cons_poly(c);
+ MDBG_MOVE("cons_move end %d (%d, %d)\n",
+ MDBG_OFFSET(cons), MDBG_OFFSET(ao_lisp_ref(cons->car)), MDBG_OFFSET(ao_lisp_ref(cons->cdr)));