Compute the version number dynamically
[muddle-interpreter.git] / src / object.c
index ff65f41651060c96e103a875cc06d96c1d6f53e3..5b115c0b89ffbcfc78c5b9e249f8488d573aa25d 100644 (file)
@@ -1,5 +1,5 @@
 /*
-Copyright (C) 2017 Keziah Wesley
+Copyright (C) 2017-2018 Keziah Wesley
 
 You can redistribute and/or modify this file under the terms of the
 GNU Affero General Public License as published by the Free Software
@@ -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)
 {
@@ -64,3 +66,43 @@ static object rest(const object *lst) {
     return o;
 }
 */
+
+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]};
+}