]> Nishi Git Mirror - gwion.git/commitdiff
:art: Use generator for ref functions
authorJérémie Astor <fennecdjay@gmail.com>
Sun, 22 Nov 2020 08:22:46 +0000 (09:22 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Sun, 22 Nov 2020 08:22:46 +0000 (09:22 +0100)
14 files changed:
include/env/context.h
include/env/func.h
include/env/nspc.h
include/env/oo.h
include/env/type.h
include/env/value.h
include/vm.h
src/emit/emitter.c
src/env/func.c
src/gwion.c
src/import/import_cdef.c
src/import/import_special.c
src/lib/ptr.c
src/vm/vm_code.c

index 34b7b2e333006a0364f7d57a74b1ca71292dcee9..0fea1b748e7eb163eef6d035cb83f0f21b7a6505 100644 (file)
@@ -11,9 +11,7 @@ struct Context_ {
   uint16_t ref;
 };
 
-ANN void free_context(const Context, struct Gwion_*const);
-ANN static inline void context_addref(const Context c) { ++c->ref; }
-ANN static inline void context_remref(const Context c, struct Gwion_ *const gwion) { if(!--c->ref) free_context(c, gwion); }
+REF_FUNC(Context, context)
 ANN2(1,3) ANEW Context new_context(MemPool p, const Ast, const m_str);
 ANN void load_context(const Context, const Env);
 ANN void unload_context(const Context, const Env);
index 026ab7c064d4d25f19854452416f3b31f88cac5b..6f0e416a1f9bfd83b5fdfaee413fe15c30e1fb45 100644 (file)
@@ -22,9 +22,7 @@ struct Func_ {
   enum fflag fflag;
 };
 
-ANN void free_func(const Func, struct Gwion_*const);
-ANN static inline void func_addref(const Func f) { ++f->ref; }
-ANN static inline void func_remref(const Func f, struct Gwion_ *const gwion) { if(!--f->ref) free_func(f, gwion); }
+REF_FUNC(Func, func)
 FLAG_FUNC(Func, f)
 
 ANEW ANN Func new_func(MemPool, const m_str, const Func_Def);
index 1a70d73277a050fababb1704627362a7a903f881..1cf9b65a651abd27033fa6c43ab508c7674b0c5e 100644 (file)
@@ -20,9 +20,7 @@ struct Nspc_ {
   uint16_t ref;
 };
 
-ANN void free_nspc(const Nspc, struct Gwion_*const);
-ANN static inline void nspc_addref(const Nspc  n) { ++n->ref; }
-ANN static inline void nspc_remref(const Nspc n, struct Gwion_ *const gwion) { if(!--n->ref) free_nspc(n, gwion); }
+REF_FUNC(Nspc, nspc)
 extern ANEW ANN Nspc new_nspc(MemPool p, const m_str name);
 
 extern ANN void nspc_commit(const Nspc);
index 92f8034309f51f0d8ab90229da9d90e9c517b36d..9ec8eeaac5e9e4f5df777a091c414e40613b633c 100644 (file)
@@ -8,4 +8,8 @@ typedef struct Nspc_      * Nspc;
 typedef struct Value_     * Value;
 typedef struct Func_      * Func;
 
+#define REF_FUNC(A, b)                                                                                       \
+ANN void free_##b(const A, struct Gwion_*const);                                                             \
+ANN static inline void b##_addref(const A a) { ++a->ref; }                                                   \
+ANN static inline void b##_remref(const A a, struct Gwion_ *const gwion) { if(!--a->ref) free_##b(a, gwion); }
 #endif
index 9e1abbaa6c0e52183f7f4545261ef0edba0cead1..4a37b66977fe6ebabfffe9bbdb0a08e5e8fa47fa 100644 (file)
@@ -51,9 +51,7 @@ struct Type_ {
   enum tflag tflag;
 };
 
-ANN void free_type(const Type, struct Gwion_*const);
-ANN static inline void type_addref(const Type t) { ++t->ref; }
-ANN static inline void type_remref(const Type t, struct Gwion_ *const gwion) { if(!--t->ref) free_type(t, gwion); }
+REF_FUNC(Type, type)
 FLAG_FUNC(Type, t)
 
 ANN2(1,3) ANEW Type new_type(MemPool, const m_uint xid, const m_str name, const Type);
index b49cd631922c2b501152aebc570ce3ec626e611e..c87da142e13d5defe0a55f74f5999ff3bf4e46e4 100644 (file)
@@ -35,10 +35,7 @@ struct Value_ {
   enum vflag vflag;
 };
 
-ANN void free_value(const Value, struct Gwion_*const);
-ANN static inline void value_addref(const Value v) { ++v->ref; }
-ANN static inline void value_remref(const Value v, struct Gwion_ *const gwion) { if(!--v->ref) free_value(v, gwion); }
-
+REF_FUNC(Value, value)
 FLAG_FUNC(Value, v)
 
 ANEW ANN Value new_value(MemPool p, const Type type, const m_str name);
index fe802a9ea83d606e0737b7369983524e26ccbc61..156a6b527903fa49773e1737e951e5f934cf0abf 100644 (file)
@@ -70,11 +70,8 @@ struct VM_Shred_ {
   struct ShredTick_ * tick;
   struct ShredInfo_ * info;
 };
-
-ANN void free_vm_code(const VM_Code, struct Gwion_*const);
-ANN static inline void vmcode_addref(const VM_Code c) { ++c->ref; }
-ANN static inline void vmcode_remref(const VM_Code c, struct Gwion_ *const gwion) { if(!--c->ref) free_vm_code(c, gwion); }
-ANN2(1,5) ANEW VM_Code new_vm_code(MemPool p, const Vector instr, const m_uint stack_depth, const int builtin, const m_str name);
+REF_FUNC(VM_Code, vmcode)
+ANN2(1,5) ANEW VM_Code new_vmcode(MemPool p, const Vector instr, const m_uint stack_depth, const int builtin, const m_str name);
 
 ANN VM_Shred shreduler_get(const Shreduler s) __attribute__((hot));
 ANN void shreduler_remove(const Shreduler s, const VM_Shred out, const m_bool erase)__attribute__((hot));
index 142e1b212d87b0f054cda8bad7eabda039a0d64d..e88bc733799ddec66344513175b834350b78e6db 100644 (file)
@@ -9,7 +9,7 @@
 
 static ANEW ANN VM_Code emit_code(const Emitter emit) {
   Code* const c = emit->code;
-  const VM_Code code = new_vm_code(emit->gwion->mp, &c->instr, c->stack_depth, 0, c->name);
+  const VM_Code code = new_vmcode(emit->gwion->mp, &c->instr, c->stack_depth, 0, c->name);
   return code;
 }
 
index c6289ccd037774d87cf2f198f85233aa24cfbd16..da91ce56d8891edb7e1ee93682d06fad79b58455 100644 (file)
@@ -39,6 +39,6 @@ ANN2(1,2) Symbol func_symbol(const Env env, const m_str nspc, const m_str base,
 
 ANN void builtin_func(const MemPool mp, const Func f, void* func_ptr) {
   set_vflag(f->value_ref, vflag_builtin);
-  f->code = new_vm_code(mp, NULL, f->def->stack_depth, 1, f->name);
+  f->code = new_vmcode(mp, NULL, f->def->stack_depth, 1, f->name);
   f->code->native_func = (m_uint)func_ptr;
 }
index f4284dccd45a121170754718574de111a0f974b9..cc0486e7969ad4263e89f0bfb678926a5d0532b2 100644 (file)
@@ -28,7 +28,7 @@ ANN static inline m_bool gwion_engine(const Gwion gwion) {
 }
 
 ANN static void gwion_cleaner(const Gwion gwion) {
-  const VM_Code code = new_vm_code(gwion->mp, NULL, 0, 1, "in code dtor");
+  const VM_Code code = new_vmcode(gwion->mp, NULL, 0, 1, "in code dtor");
   gwion->vm->cleaner_shred = new_vm_shred(gwion->mp, code);
   vm_ini_shred(gwion->vm, gwion->vm->cleaner_shred);
 }
index 27a95019e4789a25b7c233433d3dcec1e9d3c787..d4c12b910a6d99406c64ad894fa38aec1ee61c6b 100644 (file)
@@ -20,7 +20,7 @@
 ANN static m_bool mk_xtor(MemPool p, const Type type, const m_uint d, const enum tflag e) {
   VM_Code* code = e == tflag_ctor ? &type->nspc->pre_ctor : &type->nspc->dtor;
   const m_str name = type->name;
-  *code = new_vm_code(p, NULL, SZ_INT, 1, name);
+  *code = new_vmcode(p, NULL, SZ_INT, 1, name);
   (*code)->native_func = (m_uint)d;
   type->tflag |= e;
   return GW_OK;
index 2c242db34562ed81a0d6d8dd611b357789d38f42..64458839a0051dbc86391f12c72194bdca95b97f 100644 (file)
@@ -42,7 +42,7 @@ ANN void gwi_set_loc(const Gwi gwi, const m_str file, const uint line) {
 }
 
 ANN static m_bool mk_gack(MemPool p, const Type type, const f_gack d) {
-  const VM_Code code = new_vm_code(p, NULL, SZ_INT, 1, "@gack");
+  const VM_Code code = new_vmcode(p, NULL, SZ_INT, 1, "@gack");
   code->native_func = (m_uint)d;
   type->info->gack = code;
   return GW_OK;
index bc8a94e6a714303897242aa518d6cb738571936d..38341deb50dc980fffc8ec6ac387033adf88424b 100644 (file)
@@ -161,7 +161,7 @@ static OP_CHECK(opck_ptr_scan) {
   DECL_ON(const Type, t, = (Type)scan_class(env, ts->t, ts->td))
   const Type base = known_type(env, t->info->cdef->base.tmpl->call->td);
   if(isa(base, env->gwion->type[et_compound]) > 0) {
-    t->nspc->dtor = new_vm_code(env->gwion->mp, NULL, SZ_INT, 1, "@PtrDtor");
+    t->nspc->dtor = new_vmcode(env->gwion->mp, NULL, SZ_INT, 1, "@PtrDtor");
     if(!tflag(base, tflag_struct))
       t->nspc->dtor->native_func = (m_uint)ptr_object_dtor;
     else
index 033a64e813586dc8a2bf4587e1da9efe4e9ce6cf..6e98a156b061f4e54437789bcfb66c412d18402b 100644 (file)
@@ -26,7 +26,7 @@ ANN static void _free_code_instr(const Vector v, const Gwion gwion) {
   free_vector(gwion->mp, v);
 }
 
-ANN void free_vm_code(VM_Code a, Gwion gwion) {
+ANN void free_vmcode(VM_Code a, Gwion gwion) {
   if(a->memoize)
     memoize_end(gwion->mp, a->memoize);
   if(!a->builtin) {
@@ -59,7 +59,7 @@ ANN static m_bit* tobytecode(MemPool p, const VM_Code code) {
 }
 
 
-VM_Code new_vm_code(MemPool p, const Vector instr, const m_uint stack_depth,
+VM_Code new_vmcode(MemPool p, const Vector instr, const m_uint stack_depth,
     const int builtin, const m_str name) {
   VM_Code code           = mp_calloc(p, VM_Code);
   if(instr) {