/*
-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
*/
#include "alloc.h"
+#include "atom.h"
#include "object.h"
+extern pool_object *pool;
+extern pool_ptr ptop;
+
+extern object *vhp_base;
+extern heap_ptr vhp;
+
+pool_ptr
+pool_alloc (uint32_t len)
+{
+ pool_ptr p = ptop;
+ ptop += len;
+ return p;
+}
+
+pool_object *
+POOL_OBJECT (pool_ptr p)
+{
+ if (!p)
+ return (pool_object *) 0;
+ return &pool[p];
+}
+
+pool_ptr
+pool_copy_array (const pool_object * objs, uint32_t len)
+{
+ if (!len)
+ return 0;
+ pool_ptr p = pool_alloc (len);
+ for (int i = 0; i < len; i++)
+ {
+ pool[p + i] = (pool_object)
+ {
+ .type = objs[i].type,.rest = p + i + 1,.val = objs[i].val};
+ }
+ pool[p + len - 1].rest = 0;
+ return p;
+}
+
pool_ptr
pool_copy_array_rev (const pool_object * objs, uint32_t len)
{
if (!len)
return 0;
- pool_object *xs = pool_alloc (len);
- for (int i = 0; i < (int) len; i++)
+ pool_ptr p = pool_alloc (len);
+ for (int i = 0; i < len; i++)
{
- xs[i].type = objs[len - 1 - (unsigned) i].type;
- xs[i].rest = POOL_PTR (&xs[i + 1]);
- xs[i].val = objs[len - 1 - (unsigned) i].val;
+ pool[p + i] = (pool_object)
+ {
+ .type = objs[len - i - 1].type,.rest = p + i + 1,.val =
+ objs[len - i - 1].val};
}
- xs[len - 1].rest = 0;
- return POOL_PTR (xs);
+ pool[p + len - 1].rest = 0;
+ return p;
+}
+
+object *
+HEAP_OBJECT (heap_ptr p)
+{
+ assert (p > 0);
+ return &vhp_base[p];
+}
+
+heap_ptr
+heap_alloc (uint32_t len)
+{
+ enum
+ { DOPE_LEN = 1 };
+ heap_ptr p = vhp;
+ vhp += len + DOPE_LEN;
+ return p;
}
heap_ptr
heap_copy_array_rev (const object * objs, uint32_t len)
{
- object *xs = heap_alloc (len);
+ heap_ptr p = heap_alloc (len);
+ object *xs = HEAP_OBJECT (p);
for (int i = 0; i < (int) len; i++)
{
xs[i] = objs[len - 1 - (unsigned) i];
}
- return HEAP_PTR_OF_OBJECT (xs);
+ return p;
+}
+
+uv_val *
+UV_VAL (heap_ptr p)
+{
+ assert (p > 0);
+ return (uv_val *) & vhp_base[p];
+}
+
+atom_body *
+ATOM_BODY (heap_ptr p)
+{
+ assert (p);
+ return (atom_body *) (&vhp_base[p]);
}