]> Nishi Git Mirror - gwion.git/commitdiff
:art: Few improvements
authorJérémie Astor <fennecdjay@gmail.com>
Tue, 19 Jan 2021 23:17:12 +0000 (00:17 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Tue, 19 Jan 2021 23:17:12 +0000 (00:17 +0100)
ast
include/object.h
include/opcode.h
opcode.txt
src/emit/emit.c
src/lib/object.c
src/lib/object_op.c
src/parse/check.c
src/vm/vm.c

diff --git a/ast b/ast
index 2b7ad3f0e5b241640e7be0576332e3fec0296662..2814d30169430cb2b1bff740b1a806736b11238a 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit 2b7ad3f0e5b241640e7be0576332e3fec0296662
+Subproject commit 2814d30169430cb2b1bff740b1a806736b11238a
index 2ed67898b9067ee30afc1b1bed85d0810facf283..af7043e23cc44309ff90dd2c080e1f269dd8aa9c 100644 (file)
@@ -4,7 +4,7 @@ typedef struct M_Object_  * M_Object;
 struct M_Object_ {
   m_bit* data;
   Type type_ref;
-  Vector vtable;
+  struct Vector_ vtable;
   volatile size_t ref;
 };
 
index d534088eddc1621fd9cc25ba43d0de996685ede0..22ed841fb270a67bd30103ab4a3f822f6afaede3 100644 (file)
@@ -177,7 +177,6 @@ enum {
   eUpvalueOther,
   eUpvalueAddr,
   eDotFunc,
-  eDotStaticFunc,
   eGcIni,
   eGcAdd,
   eGcEnd,
@@ -366,7 +365,6 @@ enum {
 #define  UpvalueOther         (f_instr)eUpvalueOther
 #define  UpvalueAddr          (f_instr)eUpvalueAddr
 #define  DotFunc              (f_instr)eDotFunc
-#define  DotStaticFunc        (f_instr)eDotStaticFunc
 #define  GcIni                (f_instr)eGcIni
 #define  GcAdd                (f_instr)eGcAdd
 #define  GcEnd                (f_instr)eGcEnd
index 850be4159a82dd4e8537d6ffd781bfbf3541502c..11c30d5eeb37dd02b0f802911a0addef3c1bb55a 100644 (file)
@@ -174,7 +174,6 @@ UpvalueFloat
 UpvalueOther
 UpvalueAddr
 DotFunc
-DotStaticFunc
 GcIni
 GcAdd
 GcEnd
index d4b3924e653c6a592b1fe2d6eba00e3475156f21..4203d5a4d8f24c322d3a14f75586e9c1728b7956 100644 (file)
@@ -1164,7 +1164,7 @@ ANN m_bool emit_exp_call1(const Emitter emit, const Func f) {
     push_func_code(emit, f);
   else if(vector_size(&emit->code->instr)) {
     const Instr back = (Instr)vector_back(&emit->code->instr);
-    if((f_instr)(m_uint)back->opcode == DotFunc || (f_instr)(m_uint)back->opcode == DotStaticFunc)
+    if((f_instr)(m_uint)back->opcode == DotFunc)
       back->m_val = f->vt_index;
   }
   if(vector_size(&emit->code->instr) && vflag(f->value_ref, vflag_member) &&
@@ -1790,10 +1790,10 @@ ANN static Symbol case_op(const Emitter emit, const Exp base, const Exp e, const
         return CASE_PASS;
       }
     }
-  } else if(isa(actual_type(emit->gwion, base->type), emit->gwion->type[et_union]) > 0 && e->exp_type == ae_exp_call) {
+  } else if(isa(base->type, emit->gwion->type[et_union]) > 0 && e->exp_type == ae_exp_call) {
     const Exp func = e->d.exp_call.func;
     if(func->d.prim.prim_type == ae_prim_id) {
-      const Map map = &actual_type(emit->gwion, base->type)->nspc->info->value->map;
+      const Map map = &base->type->nspc->info->value->map;
       for(m_uint i = 0; i < map_size(map); ++i) {
          if(VKEY(map, i) == (m_uint)func->d.prim.d.var) {
           const Value v = (Value)VVAL(map, i);
index be66223d3d8bb532617e25cde56604284e44a870..d69f6695a0ec5816cf9476648a87109ef1de3b8a 100644 (file)
@@ -30,7 +30,7 @@ M_Object new_object(MemPool p, const VM_Shred shred, const Type t) {
   a->ref = 1;
   a->type_ref = t;
   if(t->nspc) {
-    a->vtable = &t->nspc->info->vtable;
+    a->vtable.ptr = t->nspc->info->vtable.ptr;
     if(t->nspc->info->offset)
       a->data = (m_bit*)_mp_calloc(p, t->nspc->info->offset);
   }
index 5daf42e4fd0f59000424616eea4d19c6098adad5..0f9ab262452b606c826053c0e7360750a0271998 100644 (file)
@@ -116,8 +116,14 @@ else
     func_i->m_val = (m_uint)f->code ?: (m_uint)f;
       return;
     }
-    const Instr instr = emit_add_instr(emit, vflag(f->value_ref, vflag_member) ? DotFunc : DotStaticFunc);
+    const Instr instr = emit_add_instr(emit, DotFunc);
     instr->m_val = f->vt_index;
+    if(!vflag(f->value_ref, vflag_member))
+      instr->m_val2 = -SZ_INT;
+    else {
+      const Instr instr = emit_add_instr(emit, RegMove);
+      instr->m_val = SZ_INT;
+    }
   }
   return;
 }
index 7680c1bb2ed966d4a9725f06c36ca6b7275afb68..5d7d39b84e518d8910a6417682f5d37f36833aa3 100644 (file)
@@ -1018,10 +1018,10 @@ ANN static Symbol case_op(const Env env, const Type base, const Exp e) {
         return NULL;
       }
     }
-  } else if(isa(actual_type(env->gwion, base), env->gwion->type[et_union]) > 0 && e->exp_type == ae_exp_call) {
+  } else if(isa(base, env->gwion->type[et_union]) > 0 && e->exp_type == ae_exp_call) {
     const Exp func = e->d.exp_call.func;
     if(func->d.prim.prim_type == ae_prim_id) {
-      const Value v= find_value(actual_type(env->gwion, base), func->d.prim.d.var);
+      const Value v= find_value(base, func->d.prim.d.var);
       if(v) {
         e->type = v->type;
         case_op(env, v->type, e->d.exp_call.args);
index b8f7d341a81215ac7aec6927d231b4b08738ef33..c1d1549071f603613adee581c6a2104d8506a0ff 100644 (file)
@@ -329,7 +329,7 @@ ANN void vm_run(const VM* vm) { // lgtm [cpp/use-of-goto]
     &&unioncheck, &&unionint, &&unionfloat, &&unionother, &&unionaddr,
     &&staticint, &&staticfloat, &&staticother,
     &&upvalueint, &&upvaluefloat, &&upvalueother, &&upvalueaddr,
-    &&dotfunc, &&dotstaticfunc,
+    &&dotfunc,
     &&gcini, &&gcadd, &&gcend,
     &&gacktype, &&gackend, &&gack, &&noop, &&eoc, &&other, &&regpushimm
   };
@@ -903,15 +903,7 @@ upvalueaddr:
   reg += SZ_INT;
   DISPATCH()
 dotfunc:
-PRAGMA_PUSH()
-  *(VM_Code*)(reg) = ((Func)vector_at((*(M_Object*)(reg-SZ_INT))->vtable, VAL))->code;
-  reg += SZ_INT;
-PRAGMA_POP()
-  DISPATCH()
-dotstaticfunc:
-PRAGMA_PUSH()
-  *(VM_Code*)(reg-SZ_INT) = ((Func)vector_at((*(M_Object*)(reg-SZ_INT))->vtable, VAL))->code;
-PRAGMA_POP()
+  *(VM_Code*)(reg+(m_uint)VAL2) = ((Func)(*(M_Object*)(reg-SZ_INT))->vtable.ptr[OFFSET + VAL])->code;
   DISPATCH()
 gcini:
   vector_add(&shred->gc, 0);