]> Nishi Git Mirror - gwion.git/commitdiff
:art: make VM_Object a pointer
authorfennecdjay <astor.jeremie@wanadoo.fr>
Sat, 11 May 2019 19:09:50 +0000 (21:09 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Sat, 11 May 2019 19:09:50 +0000 (21:09 +0200)
include/oo.h
src/oo/context.c
src/oo/nspc.c
src/oo/type.c
src/oo/value.c
src/parse/func.c
src/vm/shreduler.c
src/vm/vm_code.c

index f570a7697fda4c1d34ce10f956bf624617ae07b2..b2af7536dc5933284259cd87cda9d84a8dc4c7fa 100644 (file)
@@ -11,13 +11,14 @@ struct VM_Object_ {
   uint16_t ref_count; // could be an unsigned short
 };
 
-#define HAS_OBJ struct VM_Object_ obj;
-#define INIT_OO(a, b) { (a)->obj.ref_count = 1; (a)->obj.free= (void(*)(void*,void*))b; }
-ANN static inline void rem_ref(struct VM_Object_* a, void* ptr, void *gwion) {
+#define HAS_OBJ struct VM_Object_* obj;
+#define INIT_OO(mp, a, b) { (a)->obj = mp_alloc(mp, VM_Object); (a)->obj->ref_count = 1; (a)->obj->free= (void(*)(void*,void*))b; }
+ANN static inline void rem_ref(MemPool mp, struct VM_Object_* a, void* ptr, void *gwion) {
   if(--a->ref_count)
     return;
   a->free(ptr, gwion);
+  mp_free(mp, VM_Object, a);
 }
-#define ADD_REF(a)    { ++(a)->obj.ref_count; }
-#define REM_REF(a, b)    { rem_ref(&(a)->obj, (a), (b)); }
+#define ADD_REF(a)    { ++(a)->obj->ref_count; }
+#define REM_REF(a, b)    { rem_ref(((Gwion)(b))->mp, (a)->obj, (a), (b)); }
 #endif
index c1bfd5b345fea2ddf8faa6a4360d6f7c2ffeffbe..7d7aca3875e7af0565b0ebb81a12193d84ea9770 100644 (file)
@@ -18,7 +18,7 @@ ANN2(2) Context new_context(MemPool p, const Ast ast, const m_str str) {
   context->nspc = new_nspc(p, str);
   context->tree = ast;
   context->name = str;
-  INIT_OO(context, free_context);
+  INIT_OO(p, context, free_context);
   return context;
 }
 
index 481602c4e400882ec884fc0f7d7dc2536e57eaaa..8745a2fb9d55f13e229f4ad9a6edd0abc7e22c6e 100644 (file)
@@ -79,6 +79,6 @@ ANN Nspc new_nspc(MemPool p, const m_str name) {
   a->info->value = new_scope(p);
   a->info->type = new_scope(p);
   a->info->func = new_scope(p);
-  INIT_OO(a, free_nspc);
+  INIT_OO(p, a, free_nspc);
   return a;
 }
index 73e5a2f59dec215787d4c472d2ff66264a24474a..4595839ea2230760abcd030cbb90f522c90fc3bf 100644 (file)
@@ -24,7 +24,7 @@ Type new_type(MemPool p, const m_uint xid, const m_str name, const Type parent)
   type->parent = parent;
   if(type->parent)
     type->size = parent->size;
-  INIT_OO(type, free_type);
+  INIT_OO(p, type, free_type);
   return type;
 }
 
index 701e6c2c54cd8b2798bccacd5e74246cfa3fca94..7da32239e6ff495351aa15d4c57a679a3c6524b7 100644 (file)
@@ -22,6 +22,6 @@ ANN Value new_value(MemPool p, const Type type, const m_str name) {
   const Value a = mp_alloc(p, Value);
   a->type       = type;
   a->name       = name;
-  INIT_OO(a, free_value);
+  INIT_OO(p, a, free_value);
   return a;
 }
index 6e5f0456215617c07a04754e9d0374c34b744d2c..043b3ff5214ab6a48cd389c7aba18568302f2925 100644 (file)
@@ -25,7 +25,7 @@ ANN Func new_func(MemPool p, const m_str name, const Func_Def def) {
   Func func = mp_alloc(p, Func);
   func->name = name;
   func->def = def;
-  INIT_OO(func, free_func);
+  INIT_OO(p, func, free_func);
   return func;
 }
 
index 1cd894b6c05acc192a510686ffd0b1ad8461c65f..2f8e4b9daffe1f58d319010975da1180728dc830 100644 (file)
@@ -6,6 +6,8 @@
 #include "object.h"
 #include "driver.h"
 #include "shreduler_private.h"
+#include "env.h" // unwind
+#include "gwion.h" // unwind
 #include "instr.h" // unwind
 
 ANN void shreduler_set_loop(const Shreduler s, const m_bool loop) {
index 95a4f8feec25ef80c4a642d1cbfa87ffe53af9cc..802c981caf7878ede437abaf242a7ae63c3a5e40 100644 (file)
@@ -46,7 +46,7 @@ VM_Code new_vm_code(MemPool p, const Vector instr, const m_uint stack_depth,
   code->name             = strdup(name);
   code->stack_depth      = stack_depth;
   code->flag = flag;
-  INIT_OO(code, free_vm_code)
+  INIT_OO(p, code, free_vm_code)
   return code;
 }