]> Nishi Git Mirror - gwion.git/commitdiff
:art: PushStatic code now as INSTR
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Sat, 13 Jun 2020 12:44:10 +0000 (14:44 +0200)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Sat, 13 Jun 2020 12:44:10 +0000 (14:44 +0200)
include/instr.h
include/modify_instr.h [deleted file]
include/opcode.h
opcode.txt
src/emit/emit.c
src/emit/modify_instr.c [deleted file]
src/lib/instr.c
src/lib/object_op.c
src/parse/operator.c
src/vm/vm.c
src/vm/vm_code.c

index 4e75bf5bdb1ed94a1e598fecf1e5b981fee94e9f..782ea2e464ddbf714df8fa0554d33f36d4134d25 100644 (file)
@@ -65,6 +65,10 @@ struct dottmpl_ {
 };
 ANN void free_dottmpl(struct dottmpl_*);
 ANN m_bool traverse_dot_tmpl(const Emitter emit, const struct dottmpl_ *dt);
+
+INSTR(SetFunc);
+INSTR(SetRecurs);
+INSTR(SetCtor);
 // optimizations
 #ifdef OPTIMIZE
 INSTR(PutArgsInMem);
diff --git a/include/modify_instr.h b/include/modify_instr.h
deleted file mode 100644 (file)
index 6a5a880..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef __MODIFY_INSTR
-#define __MODIFY_INSTR
-typedef void (*instr_modifier)(m_bit *bytecode, m_bit *reg);
-
-ANN void emit_mod_recurs(const Emitter);
-ANN void emit_mod_func(const Emitter, const Func);
-ANN void emit_mod_ctor(const Emitter, const Type);
-#endif
index 6fb4aba1b44c2b89927ef4a3ad492422211c2152..8a9327fccc0a1169870ca3a1f50df17d0e437664 100644 (file)
@@ -168,7 +168,6 @@ enum {
   eDotStatic3,
   eDotFunc,
   eDotStaticFunc,
-  ePushStaticCode,
   eGcIni,
   eGcAdd,
   eGcEnd,
@@ -348,7 +347,6 @@ enum {
 #define  DotStatic3          (f_instr)eDotStatic3
 #define  DotFunc             (f_instr)eDotFunc
 #define  DotStaticFunc       (f_instr)eDotStaticFunc
-#define  PushStaticCode      (f_instr)ePushStaticCode
 #define  GcIni               (f_instr)eGcIni
 #define  GcAdd               (f_instr)eGcAdd
 #define  GcEnd               (f_instr)eGcEnd
index f53ad365a273c2e9e7c484961da7aa7d157227aa..ff33a87690481ec58621433b0b3c07968b98c203 100644 (file)
@@ -165,7 +165,6 @@ DotStatic2
 DotStatic3
 DotFunc
 DotStaticFunc
-PushStaticCode
 GcIni
 GcAdd
 GcEnd
index e063d3ebec860f1777de9cd44e249b3cbd7985a5..132a5046ce0e0476738dd03fe5d106b2288020aa 100644 (file)
@@ -18,7 +18,6 @@
 #include "parser.h"
 #include "specialid.h"
 #include "vararg.h"
-#include "modify_instr.h"
 
 #undef insert_symbol
 #define insert_symbol(a) insert_symbol(emit->gwion->st, (a))
@@ -252,8 +251,10 @@ ANN void emit_ext_ctor(const Emitter emit, const Type t) {
   if(t->nspc->pre_ctor) {
     const Instr set_code = regseti(emit, (m_uint)t->nspc->pre_ctor);
     set_code->m_val2 = SZ_INT;
-  } else
-    emit_mod_ctor(emit, t);
+  } else {
+    const Instr instr = emit_add_instr(emit, SetCtor);
+    instr->m_val = (m_uint)t;
+  }
   const m_uint offset = emit_code_offset(emit);
   const Instr regset = regseti(emit, offset);
   regset->m_val2 = SZ_INT *2;
@@ -1049,7 +1050,8 @@ ANN Instr emit_exp_call1(const Emitter emit, const Func f) {
       else { // recursive function. (maybe should be used only for global funcs)
         const Instr back = (Instr) vector_size(&emit->code->instr) ?
             (Instr)vector_back(&emit->code->instr) : emit_add_instr(emit, RegPushImm);
-        back->opcode = ePushStaticCode;
+        back->opcode = eOP_MAX;
+        back->execute = SetRecurs;
         back->m_val = 0;
       }
     } else if(emit->env->func != f && !f->value_ref->from->owner_class && !f->code && !is_fptr(emit->gwion, f->value_ref->type)) {
@@ -1085,14 +1087,17 @@ ANN Instr emit_exp_call1(const Emitter emit, const Func f) {
     instr->m_val = val;
     instr->m_val2 = val2;
   } else if(f != emit->env->func && !f->code && !is_fptr(emit->gwion, f->value_ref->type)){
-    /* not yet emitted static func */
+    // not yet emitted static func
+/*
     if(f->value_ref->from->owner_class) {
       const Instr instr = vector_size(&emit->code->instr) ?
         (Instr)vector_back(&emit->code->instr) : emit_add_instr(emit, PushStaticCode);
       assert(instr->opcode == ePushStaticCode);
       instr->opcode = eRegPushImm;
-    } else
-      emit_mod_func(emit, f);
+    } else*/
+    const Instr instr = emit_add_instr(emit, SetFunc);
+    instr->m_val = (m_uint)f;
+//      emit_mod_func(emit, f);
   }
   const m_uint offset = emit_code_offset(emit);
   regseti(emit, offset);
diff --git a/src/emit/modify_instr.c b/src/emit/modify_instr.c
deleted file mode 100644 (file)
index 488f565..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#include "gwion_util.h"
-#include "gwion_ast.h"
-#include "gwion_env.h"
-#include "vm.h"
-#include "gwion.h"
-#include "instr.h"
-#include "emit.h"
-
-// should be in vm.h
-#define VAL (*(m_uint*)(byte + SZ_INT))
-#define FVAL (*(m_float*)(byte + SZ_INT))
-#define VAL2 (*(m_uint*)(byte + SZ_INT*2))
-/*
-ANN static void set_recurs(m_bit *byte, m_bit **reg) {
-  *(m_bit*)byte = eRegPushImm;
-  VAL = (*(m_uint*)(*reg-SZ_INT) = );
-  VAL2 = -SZ_INT;
-// copy from vm_code
-}
-*/
-
-ANN static void set_func(m_bit *byte, m_bit **reg) {
-  *(m_bit*)byte = eRegSetImm;
-  VAL = (*(m_uint*)(*reg-SZ_INT) = (m_uint)((Func)VAL)->code);
-  VAL2 = -SZ_INT;
-// copy from vm_code
-}
-
-ANN static void set_ctor(m_bit *byte, m_bit *reg) {
-  *(m_bit*)byte = eRegSetImm;
-  VAL = (*(m_uint*)(reg+SZ_INT) = (m_uint)((Type)VAL)->nspc->pre_ctor);
-  VAL2 = SZ_INT;
-}
-
-ANN void emit_mod_recurs(const Emitter emit) {
-  const Instr instr = vector_size(&emit->code->instr) ?
-    (Instr)vector_back(&emit->code->instr) : emit_add_instr(emit, RegPushImm);
-  instr->opcode = ePushStaticCode;
-  instr->m_val = 0;
-}
-
-ANN void emit_mod_func(const Emitter emit, const Func f) {
-  const Instr instr = emit_add_instr(emit, PushStaticCode);
-  instr->m_val = (m_uint)f;
-  instr->m_val2 = (m_uint)set_func;
-}
-
-ANN void emit_mod_ctor(const Emitter emit, const Type t) {
-  const Instr instr = emit_add_instr(emit, PushStaticCode);
-  instr->m_val = (m_uint)t;
-  instr->m_val2 = (m_uint)set_ctor;
-}
index bff0e35e01585135f4b85d67e3e72fb229b760ce..f661b6c62f56b8921e157b4cda073c7473137a75 100644 (file)
@@ -111,3 +111,31 @@ INSTR(DotTmpl) {
   } while((t = t->e->parent));
   Except(shred, "MissigTmplException[internal]");
 }
+
+#define VAL (*(m_uint*)(byte + SZ_INT))
+#define FVAL (*(m_float*)(byte + SZ_INT))
+#define VAL2 (*(m_uint*)(byte + SZ_INT*2))
+
+INSTR(SetFunc) {
+  const Func f = (Func)instr->m_val;
+  m_bit *byte = shred->code->bytecode + (shred->pc -1)* SZ_INT*3;
+  *(m_bit*)byte = eRegPushImm;
+  VAL = *(m_uint*)(shred->reg) = (m_uint)f->code;
+  shred->reg += SZ_INT;
+}
+
+INSTR(SetRecurs) {
+  m_bit *byte = shred->code->bytecode + (shred->pc -1)* SZ_INT*3;
+  *(m_bit*)byte = eRegPushImm;
+  VAL = *(m_uint*)(shred->reg) = (m_uint)shred->code;
+  shred->reg += SZ_INT;
+}
+
+INSTR(SetCtor) {
+  const Type t = (Type)instr->m_val;
+  m_bit *byte = shred->code->bytecode + (shred->pc -1)* SZ_INT*3;
+  *(m_bit*)byte = eRegSetImm;
+  VAL = *(m_uint*)(shred->reg + SZ_INT) = (m_uint)t->nspc->pre_ctor;
+  VAL2 = SZ_INT;
+}
+
index 7f9e3188d395333d6aa2457503881817cb2c480c..acfa26f0023fb1ddfd4f0b85bfeb8005ab56216d 100644 (file)
@@ -151,21 +151,24 @@ static const f_instr dotmember[]  = { DotMember, DotMember2, DotMember3, DotMemb
 
 ANN static void emit_member_func(const Emitter emit, const Exp_Dot* member) {
   const Func f = exp_self(member)->info->type->e->d.func;
+  if(f->def->base->tmpl)
+    emit_add_instr(emit, DotTmplVal);
+else
   if(is_class(emit->gwion, member->t_base) || GET_FLAG(member->base->info->type, force)) {
-    const Instr func_i = emit_add_instr(emit, f->code ? RegPushImm : PushStaticCode);
-    func_i->m_val = (m_uint)f->code;
+    const Instr func_i = emit_add_instr(emit, f->code ? RegPushImm : SetFunc);
+    func_i->m_val = (m_uint)f->code ?: (m_uint)f;
     return;
   }
-  if(f->def->base->tmpl)
-    emit_add_instr(emit, DotTmplVal);
+//  if(f->def->base->tmpl)
+//    emit_add_instr(emit, DotTmplVal);
   else {
     if(GET_FLAG(member->t_base, struct)) {
       if(!GET_FLAG(f->def, static)) {
         exp_setvar(member->base, 1);
         emit_exp(emit, member->base);
       }
-      const Instr instr = emit_add_instr(emit, f->code ? RegPushImm : PushStaticCode);
-      instr->m_val = (m_uint)f->code;
+    const Instr func_i = emit_add_instr(emit, f->code ? RegPushImm : SetFunc);
+    func_i->m_val = (m_uint)f->code ?: (m_uint)f;
       return;
     }
     const Instr instr = emit_add_instr(emit, GET_FLAG(f, member) ? DotFunc : DotStaticFunc);
index 1d8b5eca3a77422cc3d18774a47ecb23e4dc86ce..e516d55567b2b00d569ddad4700d4f780840975d 100644 (file)
@@ -289,7 +289,7 @@ ANN m_bool operator_set_func(const struct Op_Import* opi) {
 
 ANN static Instr handle_instr(const Emitter emit, const M_Operator* mo) {
   if(mo->func) {
-    const Instr push = emit_add_instr(emit, mo->func->code ? RegPushImm : PushStaticCode);
+    const Instr push = emit_add_instr(emit, mo->func->code ? RegPushImm : SetFunc);
     push->m_val = ((m_uint)mo->func->code ?:(m_uint)mo->func);
     const Instr instr = emit_exp_call1(emit, mo->func);
     if(mo->func->def->base->xid == insert_symbol(emit->gwion->st, "@conditionnal"))
index 06751199a5e5fdfa211aa8000b62b2e9ef10f14e..8ab2937098235b84e024b0643da89c3f507bcd7d 100644 (file)
@@ -14,7 +14,6 @@
 #include "map_private.h"
 #include "gack.h"
 #include "array.h"
-#include "modify_instr.h"
 
 static inline uint64_t splitmix64_stateless(uint64_t index) {
   uint64_t z = (index + UINT64_C(0x9E3779B97F4A7C15));
@@ -329,7 +328,7 @@ ANN void vm_run(const VM* vm) { // lgtm [cpp/use-of-goto]
     &&newobj, &&addref, &&addrefaddr, &&objassign, &&assign, &&remref,
     &&setobj, &&except, &&allocmemberaddr, &&dotmember, &&dotfloat, &&dotother, &&dotaddr,
     &&staticint, &&staticfloat, &&staticother,
-    &&dotfunc, &&dotstaticfunc, &&pushstaticcode,
+    &&dotfunc, &&dotstaticfunc,
     &&gcini, &&gcadd, &&gcend,
     &&gacktype, &&gackend, &&gack, &&noop, &&eoc, &&other, &&regpushimm
   };
@@ -837,9 +836,6 @@ PRAGMA_PUSH()
   *(VM_Code*)(reg-SZ_INT) = ((Func)vector_at(a.obj->vtable, VAL))->code;
 PRAGMA_POP()
   DISPATCH()
-pushstaticcode: // TODO: use external instr
-  ((instr_modifier)VAL2)(byte, reg);
-  DISPATCH()
 gcini:
   vector_add(&shred->gc, 0);
   DISPATCH();
index f571fe8bd40651bfe9cd1a611488eaf182e57813..f376fe6525621fcd41d5fceb7b48675f78cdf3b4 100644 (file)
@@ -43,10 +43,6 @@ ANN static m_bit* tobytecode(MemPool p, const VM_Code code) {
   m_bit *ptr = _mp_malloc(p, sz * BYTECODE_SZ);
   for(m_uint i= 0; i < sz; ++i) {
     const Instr instr = (Instr)vector_at(v, i);
-    if(instr->opcode == ePushStaticCode && !instr->m_val) {
-      instr->opcode = eRegPushImm;
-      instr->m_val = (m_uint)code;
-    }
     if(instr->opcode < eOP_MAX)
       memcpy(ptr + i*BYTECODE_SZ, instr, BYTECODE_SZ);
     else {