]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve gack
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Tue, 25 Feb 2020 00:09:11 +0000 (01:09 +0100)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Tue, 25 Feb 2020 00:09:11 +0000 (01:09 +0100)
include/opcode.h
opcode.txt
src/emit/emit.c
src/lib/gack.c
src/vm/vm.c

index 0634386d16c1f0e50ef4bbfcd844c5dd7858c11b..7d0df98bd321057fc1050d4de269a8632fc7b66e 100644 (file)
@@ -169,6 +169,7 @@ enum {
   eGcIni,
   eGcAdd,
   eGcEnd,
+  eGackType,
   eGackEnd,
   eGack,
   eNoOp,
@@ -345,6 +346,7 @@ enum {
 #define  GcIni               (f_instr)eGcIni
 #define  GcAdd               (f_instr)eGcAdd
 #define  GcEnd               (f_instr)eGcEnd
+#define  GackType            (f_instr)eGackType
 #define  GackEnd             (f_instr)eGackEnd
 #define  Gack                (f_instr)eGack
 #define  NoOp                (f_instr)eNoOp
index 12be3f3f47ce9f357acf7561cdffef0fc810b739..db75fbd5fe6e17f719ab1a532695e328c1c9b7cf 100644 (file)
@@ -166,6 +166,7 @@ PushStaticCode
 GcIni
 GcAdd
 GcEnd
+GackType
 GackEnd
 Gack
 NoOp
index 070515d035d2562fa60d1bea5c4cdcf67876081d..7917fff291168f7387582c6475f0e5462a3841cb 100644 (file)
@@ -618,9 +618,14 @@ ANN static m_bool emit_interp(const Emitter emit, const Exp exp) {
       e->next = next;
       return GW_ERROR;
     }
+    regseti(emit, (m_uint)e->type);
+    if(isa(e->type, emit->gwion->type[et_object]) > 0 && !GET_FLAG(e->type, force)) {
+      emit_add_instr(emit, GackType);
+    }
     const Instr instr = emit_add_instr(emit, Gack);
-    instr->m_val = (m_uint)e->type;
-    instr->m_val2 = emit_code_offset(emit);
+    if(isa(e->type, emit->gwion->type[et_object]) > 0 && !GET_FLAG(e->type, force))
+      emit_add_instr(emit, GackType);
+    instr->m_val = emit_code_offset(emit);
   } while((e = e->next = next));
   return GW_OK;
 }
index 05bdecb8c3e49ab317855472dc7b79f8ef5f933d..7148ff969a55a3685f26067e0befc9c75a8df328 100644 (file)
@@ -62,12 +62,7 @@ ANN static void prepare_call(const VM_Shred shred, m_uint offset) {
 }
 
 ANN void gack(const VM_Shred shred, const Instr instr) {
-  Type t = (Type)instr->m_val;
-  if(isa(t, shred->info->vm->gwion->type[et_object]) > 0 && !GET_FLAG(t, force)) {
-    const M_Object o = *(M_Object*)(shred->reg - SZ_INT);
-    if(o)
-      t = o->type_ref;
-  }
+  const Type t = *(Type*)shred->reg;
   const VM_Code code = get_gack(t);
   if(GET_FLAG(code, builtin)) {
     ((f_gack)code->native_func)(t, (shred->reg - t->size), shred);
index 8e64a63ffa54df68976b346e33815ccf101687a7..404fa3cecb80ee57d56c2c2a8e487f86603718f4 100644 (file)
@@ -340,7 +340,7 @@ ANN void vm_run(const VM* vm) { // lgtm [cpp/use-of-goto]
     &&staticint, &&staticfloat, &&staticother,
     &&dotfunc, &&dotstaticfunc, &&pushstaticcode,
     &&gcini, &&gcadd, &&gcend,
-    &&gackend, &&gack, &&noop, &&regpushimm, &&other, &&eoc
+    &&gacktype, &&gackend, &&gack, &&noop, &&regpushimm, &&other, &&eoc
   };
   const Shreduler s = vm->shreduler;
   register VM_Shred shred;
@@ -849,6 +849,13 @@ gcend:
   while((a.obj = (M_Object)vector_pop(&shred->gc)))
     _release(a.obj, shred);
   DISPATCH()
+gacktype:
+{
+  const M_Object o = *(M_Object*)(reg - SZ_INT);
+  if(o)
+    *(Type*)reg = o->type_ref;
+  DISPATCH()
+}
 gackend:
 {
   m_str str = *(m_str*)(reg - SZ_INT);