+static int
+frame_vals_size(void *addr)
+{
+ struct ao_lisp_frame_vals *vals = addr;
+ return frame_vals_num_size(vals->size);
+}
+
+static void
+frame_vals_mark(void *addr)
+{
+ struct ao_lisp_frame_vals *vals = addr;
+ int f;
+
+ for (f = 0; f < vals->size; f++) {
+ struct ao_lisp_val *v = &vals->vals[f];
+
+ ao_lisp_poly_mark(v->val, 0);
+ MDBG_MOVE("frame mark atom %s %d val %d at %d\n",
+ ao_lisp_poly_atom(v->atom)->name,
+ MDBG_OFFSET(ao_lisp_ref(v->atom)),
+ MDBG_OFFSET(ao_lisp_ref(v->val)), f);
+ }
+}
+
+static void
+frame_vals_move(void *addr)
+{
+ struct ao_lisp_frame_vals *vals = addr;
+ int f;
+
+ for (f = 0; f < vals->size; f++) {
+ struct ao_lisp_val *v = &vals->vals[f];
+
+ ao_lisp_poly_move(&v->atom, 0);
+ ao_lisp_poly_move(&v->val, 0);
+ MDBG_MOVE("frame move atom %s %d val %d at %d\n",
+ ao_lisp_poly_atom(v->atom)->name,
+ MDBG_OFFSET(ao_lisp_ref(v->atom)),
+ MDBG_OFFSET(ao_lisp_ref(v->val)), f);
+ }
+}
+
+const struct ao_lisp_type ao_lisp_frame_vals_type = {
+ .mark = frame_vals_mark,
+ .size = frame_vals_size,
+ .move = frame_vals_move,
+ .name = "frame_vals"
+};
+