Implement global bindings
[muddle-interpreter.git] / src / object.c
index f7b5526d42037f9f66a8feb69e7ef49877946065..af50edaa191905c920704fc29af899f3117bbc08 100644 (file)
@@ -18,6 +18,8 @@ License along with this file. If not, see
 
 #include "object.h"
 
+#include <string.h>
+
 uint32_t
 list_length (const list_object * o)
 {
@@ -65,9 +67,35 @@ static object rest(const object *lst) {
 }
 */
 
+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));
+}