+
+dope_object *
+vec_dope (const vector_object * o)
+{
+ return (dope_object *) & HEAP_OBJECT (o->val.body)[o->val.len];
+}
+
+dope_object *
+uv_dope (const uvector_object * o)
+{
+ return (dope_object *) & HEAP_OBJECT (o->val.body)[(o->val.len + 1) / 2 +
+ 1];
+}
+
+vector_object
+vector_create (uint32_t capacity)
+{
+ heap_ptr body = heap_alloc (capacity);
+ memset (HEAP_OBJECT (body), '\0', capacity * sizeof (object));
+ return new_vector (body + capacity, 0);
+}
+
+object *
+stack_push (vector_object * v)
+{
+ if (vec_dope (v)->len > v->val.len)
+ {
+ // TODO
+ assert (0 && "not implemented: GROW in stack_push");
+ }
+ v->val.len++;
+ return HEAP_OBJECT (--(v->val.body));
+}
+
+object
+uv_get (const uvector_object * o, uint32_t i)
+{
+ return (object)
+ {.type = utype (o),.uv_val = UV_VAL (o->val.body)[i]};
+}