]> Nishi Git Mirror - gwion.git/commitdiff
:art: Rename VM_Object => RefCount
authorfennecdjay <astor.jeremie@wanadoo.fr>
Sun, 19 May 2019 00:52:11 +0000 (02:52 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Sun, 19 May 2019 00:52:11 +0000 (02:52 +0200)
include/nspc.h
include/oo.h
src/oo/context.c
src/oo/nspc.c
src/oo/type.c
src/oo/value.c
src/parse/func.c
src/parse/scan0.c
src/vm/vm_code.c

index 8ef12eaaf68bcdecf5524e074d678043763f0bf3..f0cd52fa6dbccbac2ba36c1dc8169e8c886a9326 100644 (file)
@@ -17,8 +17,8 @@ struct Nspc_ {
   struct VM_Code_*   pre_ctor;
   struct VM_Code_*   dtor;
   struct NspcInfo_* info;
-  uint ref;
   HAS_OBJ
+  uint is_union;
 };
 
 extern ANEW ANN Nspc new_nspc(MemPool p, const m_str name);
index b2af7536dc5933284259cd87cda9d84a8dc4c7fa..6ca6a63b0ab1f813368c5bf598dbfcf6c166f88f 100644 (file)
@@ -6,19 +6,25 @@ typedef struct Nspc_      * Nspc;
 typedef struct Value_     * Value;
 typedef struct Func_      * Func;
 
-struct VM_Object_ {
+typedef struct RefCount_ {
   void (*free)(void*,void*);
-  uint16_t ref_count; // could be an unsigned short
-};
+  uint16_t count; // could be an unsigned short
+} RefCount;
 
-#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)
+#define HAS_OBJ RefCount* ref;
+ANN static inline RefCount* new_refcount(MemPool mp, void(*free)(void*,void*)) {
+  RefCount *ref = mp_alloc(mp, RefCount);
+  ref->count = 1;
+  ref->free= free;
+  return ref;
+}
+#define new_refcount(a, b) new_refcount(a, (void(*)(void*,void*))b)
+ANN static inline void rem_ref(MemPool mp, RefCount* a, void* ptr, void *gwion) {
+  if(--a->count)
     return;
   a->free(ptr, gwion);
-  mp_free(mp, VM_Object, a);
+  mp_free(mp, RefCount, a);
 }
-#define ADD_REF(a)    { ++(a)->obj->ref_count; }
-#define REM_REF(a, b)    { rem_ref(((Gwion)(b))->mp, (a)->obj, (a), (b)); }
+#define ADD_REF(a)    { ++(a)->ref->count; }
+#define REM_REF(a, b)    { rem_ref(((Gwion)(b))->mp, (a)->ref, (a), (b)); }
 #endif
index 7d7aca3875e7af0565b0ebb81a12193d84ea9770..b940aa9089ff643ecf3a31509f684d174d24ebf1 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(p, context, free_context);
+  context->ref = new_refcount(p, free_context);
   return context;
 }
 
index 16cb8673a9337f4f61dabde830e3c2cdf38cfb89..9d8477a8902c4079cfd937b727ef8d244458988a 100644 (file)
@@ -30,7 +30,7 @@ ANN static inline void nspc_release_object(const Nspc a, Value value, Gwion gwio
 ANN static void free_nspc_value(const Nspc a, Gwion gwion) {
   struct scope_iter iter = { a->info->value, 0, 0 };
   Value v;
-  if(!a->ref) {
+  if(!a->is_union) {
     while(scope_iter(&iter, &v) > 0) {
       if(isa(v->type, t_object) > 0)
         nspc_release_object(a, v, gwion);
@@ -78,6 +78,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(p, a, free_nspc);
+  a->ref = new_refcount(p, free_nspc);
   return a;
 }
index a31d611a6e2ecf42bc57abf5b327921eccc91f90..3c0071a1445aa2cae322e6481d1ca87cd5fa58f8 100644 (file)
@@ -25,7 +25,7 @@ Type new_type(MemPool p, const m_uint xid, const m_str name, const Type parent)
   type->e->parent = parent;
   if(type->e->parent)
     type->size = parent->size;
-  INIT_OO(p, type, free_type);
+  type->ref = new_refcount(p, free_type);
   return type;
 }
 
index 7da32239e6ff495351aa15d4c57a679a3c6524b7..07a0f9496744ae74368f4d2fb2a390775d7037d4 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(p, a, free_value);
+  a->ref = new_refcount(p, free_value);
   return a;
 }
index 40871c2f7b49407091283bab4402520032d49114..0ee82dd0c615f80a7185437cdff94a70d636099e 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(p, func, free_func);
+  func->ref = new_refcount(p, free_func);
   return func;
 }
 
index dfdf78032f9bcbe454202b065b21199bfc9f18c2..9c8ebbdfe3cf886dfbd66262ac0a98f90b6fc136 100644 (file)
@@ -100,7 +100,7 @@ ANN static Type union_type(const Env env, const Nspc nspc, const Symbol s, const
   t->name = name;
   t->nspc = new_nspc(env->gwion->mp, name);
   t->nspc->parent = nspc;
-  t->nspc->ref = 1;
+  t->nspc->is_union = 1;
   t->e->owner = nspc;
   t->e->parent = t_union;
   if(add) {
index 802c981caf7878ede437abaf242a7ae63c3a5e40..092caadbd910ffdca28ec158efaf24099e33233e 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(p, code, free_vm_code)
+  code->ref = new_refcount(p, free_vm_code);
   return code;
 }