for (f = 0; f < frame->num; f++) {
struct ao_lisp_val *v = &frame->vals[f];
- ao_lisp_poly_mark(v->val);
+ ao_lisp_poly_mark(v->val, 0);
DBG ("\tframe mark atom %s %d val %d at %d\n",
ao_lisp_poly_atom(v->atom)->name,
OFFSET(v->atom), OFFSET(v->val), f);
int f;
for (;;) {
+ struct ao_lisp_frame *next;
+ int ret;
+
DBG("frame move %p\n", frame);
if (!AO_LISP_IS_POOL(frame))
break;
for (f = 0; f < frame->num; f++) {
struct ao_lisp_val *v = &frame->vals[f];
- ao_lisp_poly_move(&v->atom);
+ ao_lisp_poly_move(&v->atom, 0);
DBG("moved atom %s\n", ao_lisp_poly_atom(v->atom)->name);
- ao_lisp_poly_move(&v->val);
+ ao_lisp_poly_move(&v->val, 0);
}
- if (ao_lisp_poly_move(&frame->next))
+ next = ao_lisp_poly_frame(frame->next);
+ ret = 1;
+ if (next)
+ ret = ao_lisp_move_memory((void **) &next, frame_size(next));
+ if (next != ao_lisp_poly_frame(frame->next))
+ frame->next = ao_lisp_frame_poly(next);
+ if (ret)
break;
- frame = ao_lisp_poly_frame(frame->next);
+ frame = next;
}
}
.move = frame_move
};
+void
+ao_lisp_frame_print(ao_poly p)
+{
+ struct ao_lisp_frame *frame = ao_lisp_poly_frame(p);
+ int f;
+
+ printf ("{");
+ if (frame) {
+ for (f = 0; f < frame->num; f++) {
+ if (f != 0)
+ printf(", ");
+ ao_lisp_poly_print(frame->vals[f].atom);
+ printf(" = ");
+ ao_lisp_poly_print(frame->vals[f].val);
+ }
+ if (frame->next)
+ ao_lisp_poly_print(frame->next);
+ }
+ printf("}");
+}
+
ao_poly *
ao_lisp_frame_ref(struct ao_lisp_frame *frame, ao_poly atom)
{