]> Nishi Git Mirror - gwion.git/commitdiff
:art: Fixes and performance
authorfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 19 Feb 2019 16:41:36 +0000 (17:41 +0100)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 19 Feb 2019 16:41:36 +0000 (17:41 +0100)
ast
include/opcode.h
opcode.txt
src/emit/emit.c
src/emit/memoize.c
src/lib/array.c
src/vm/vm.c
tests/error/self_extend.gw [new file with mode: 0644]

diff --git a/ast b/ast
index 8fe7b190037c09cee1b5ff6cca54b4dba88b9d1a..305c073c779f3efb3b1ed344b1a924784599da29 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit 8fe7b190037c09cee1b5ff6cca54b4dba88b9d1a
+Subproject commit 305c073c779f3efb3b1ed344b1a924784599da29
index d7b01b37aec83fa5759aeec0e7319ae06ba968d7..3eb434bc83268aa23a049dbd299482fd1dfab9d8 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef __GWION_OPCODES__
 #define __GWION_OPCODES__
 enum {
+  RegSetImm,
   RegPushImm,
   RegPushImm2,
   RegPushImm3,
@@ -156,6 +157,7 @@ enum {
   OP_MAX,
 };
 
+#define  RegSetImm           (f_instr)RegSetImm
 #define  RegPushImm          (f_instr)RegPushImm
 #define  RegPushImm2         (f_instr)RegPushImm2
 #define  RegPushImm3         (f_instr)RegPushImm3
index ef5908a04c2a69295c6f04da6c383fdac3394f7d..db65393b43fde26237c2722d5e2d4416099ab899 100644 (file)
@@ -1,3 +1,4 @@
+RegSetImm
 RegPushImm
 RegPushImm2
 RegPushImm3
index 298d338215020c4c2b0588a0f1f1930715c9e5c5..08a75f5a0ef4f24efead0060723df076c200155e 100644 (file)
@@ -188,7 +188,7 @@ ANN void emit_ext_ctor(const Emitter emit, const VM_Code code) { GWDEBUG_EXE
   emit_add_instr(emit, RegDup);
   const Instr push_f = emit_add_instr(emit, RegPushImm);
   push_f->m_val = (m_uint)code;
-  const Instr offset = emit_add_instr(emit, RegPushImm);
+  const Instr offset = emit_add_instr(emit, RegSetImm);
   offset->m_val = emit_code_offset(emit);
   emit_add_instr(emit, !GET_FLAG(code, builtin) ? FuncUsr : FuncMember);
 }
@@ -314,7 +314,7 @@ ANN static m_bool prim_array(const Emitter emit, const Exp_Primary * primary) {
   while((e = e->next));
   const Type type = array->type;
   const Type base = array_base(type);
-  const Instr push = emit_add_instr(emit, RegPushImm);
+  const Instr push = emit_add_instr(emit, RegSetImm);
   push->m_val = count;
   const Instr instr = emit_add_instr(emit, ArrayInit);
   instr->m_val = (m_uint)type;
@@ -340,7 +340,7 @@ ANN static m_bool emit_exp_array(const Emitter emit, const Exp_Array* array) { G
     instr->m_val = is_var;
     instr->m_val2 = is_var ? SZ_INT : array->self->type->size;
   } else {
-    const Instr push = emit_add_instr(emit, RegPushImm);
+    const Instr push = emit_add_instr(emit, RegSetImm);
     push->m_val = depth;
     const Instr instr = emit_add_instr(emit, ArrayAccessMulti);
     instr->m_val = is_var || array->self->type->array_depth;
@@ -729,7 +729,7 @@ ANN static Instr emit_call(const Emitter emit, const Func f) {
     return emit_add_instr(emit, exec);
   }
   const Instr ex = emit_add_instr(emit, GWOP_EXCEPT);
-  ex->m_val = -SZ_INT*2;
+  ex->m_val = -SZ_INT;
   return emit_add_instr(emit, FuncPtr);
 }
 
@@ -740,7 +740,7 @@ ANN m_bool emit_exp_call1(const Emitter emit, const Func f) { GWDEBUG_EXE
   } else if((f->value_ref->owner_class && is_special(f->value_ref->owner_class) > 0) ||
   !f->value_ref->owner_class || GET_FLAG(f, template))
     push_func_code(emit, f);
-  const Instr offset = emit_add_instr(emit, RegPushImm);
+  const Instr offset = emit_add_instr(emit, RegSetImm);
   offset->m_val = emit_code_offset(emit);
   const Instr instr = emit_call(emit, f);
   const m_uint size = instr->m_val = f->def->ret_type->size;
index dee3664f40a927e4f30ad3b68a39ba216a8d34a4..08db52c03b3330a5e345d3480abb56c027450df0 100644 (file)
@@ -70,15 +70,16 @@ static inline void memoize_set(Memoize m, const m_bit* arg) {
 }
 
 m_bool memoize_get(VM_Shred shred) {
-  const VM_Code code = *(VM_Code*)REG(-SZ_INT * 2);
+//  const VM_Code code = *(VM_Code*)REG(-SZ_INT * 2);
+  const VM_Code code = *(VM_Code*)REG(-SZ_INT);
   const Memoize m = code->memoize;
-  const m_bit* arg = REG(-(SZ_INT*2 + m->arg_sz + (m_uint)m->member));
+  const m_bit* arg = REG(-(SZ_INT + m->arg_sz + (m_uint)m->member));
   const m_uint size = vector_size(&m->v);
   for(m_uint i = 0; i < size; ++i) {
     m_bit* data = (m_bit*)vector_at(&m->v, i);
     if(memcmp(arg, data, m->arg_sz))
       continue;
-    POP_REG(shred, SZ_INT*2 + (m->arg_sz - m->ret_sz) + (m_uint)m->member)
+    POP_REG(shred, SZ_INT + (m->arg_sz - m->ret_sz) + (m_uint)m->member)
     mreturn[m->kind](shred->reg-m->ret_sz, data + m->arg_sz, m->ret_sz);
     return GW_OK;
   }
index 6a3bfba41436c491529ee0cf8cdd9ec56d05a168..7793b9cdd2203d441f440da2f265190a97c7276b 100644 (file)
@@ -254,9 +254,9 @@ INSTR(ArrayPost) { GWDEBUG_EXE
 
 INSTR(ArrayInit) { GWDEBUG_EXE // for litteral array
   const Type t = (Type)instr->m_val;
-  const m_uint sz = *(m_uint*)REG(-SZ_INT);
+  const m_uint sz = *(m_uint*)REG(0);
   const m_uint off = instr->m_val2 * sz;
-  POP_REG(shred, off /*- SZ_INT*/);
+  POP_REG(shred, off - SZ_INT);
   const M_Object obj = new_array(t, sz);
   memcpy(ARRAY(obj)->ptr + ARRAY_OFFSET, REG(-SZ_INT), off);
   *(M_Object*)REG(-SZ_INT) = obj;
@@ -371,8 +371,8 @@ INSTR(ArrayAccess) { GWDEBUG_EXE
 #define DIM(a) gw_err("\t... at dim [%" INT_F "]\n", (a))
 
 INSTR(ArrayAccessMulti) { GWDEBUG_EXE
-  const m_uint depth = *(m_uint*)REG(-SZ_INT);
-  POP_REG(shred, SZ_INT * (depth + 2))
+  const m_uint depth = *(m_uint*)REG(0);
+  POP_REG(shred, SZ_INT * (depth + 1))
   const M_Object base = *(M_Object*)REG(0);
   M_Object obj = base;
   if(!obj)
index 2a8bf45291cf9c6e11f4083a12de517984032436..93686cd5d971a17f13bde80e6bc08f2df783b317 100644 (file)
@@ -221,6 +221,7 @@ __attribute__((hot))
 
 ANN void vm_run(const VM* vm) {
   static const void* dispatch[] = {
+    &&regsetimm,
     &&regpushimm, &&regpushfloat, &&regpushother, &&regpushaddr,
     &&regpushmem, &&regpushmemfloat, &&regpushmemother, &&regpushmemaddr,
     &&pushnow,
@@ -295,6 +296,9 @@ clock_gettime(CLOCK_THREAD_CPUTIME_ID, &exec_ini);
 #endif
   do {
     register Instr instr; DISPATCH();
+regsetimm:
+  *(m_uint*)reg = instr->m_val;
+  DISPATCH();
 regpushimm:
   *(m_uint*)reg = instr->m_val;
   reg += SZ_INT;
@@ -551,7 +555,7 @@ shred->pc = pc;
 
 funcusr:
 {
-  reg -= SZ_INT * 2;
+  reg -= SZ_INT;
   register const m_uint push = *(m_uint*)(reg + SZ_INT) + *(m_uint*)(mem-SZ_INT);
   mem += push;
   *(m_uint*)  mem = push;mem += SZ_INT;
@@ -581,7 +585,7 @@ funcusr:
 DISPATCH();
 funcmember:
 {
-  reg -= SZ_INT * 2;
+  reg -= SZ_INT;
   a.code = *(VM_Code*)reg;
   register const m_uint local_depth =   *(m_uint*)(reg + SZ_INT);
   register m_bit* m = mem + local_depth;
@@ -608,7 +612,7 @@ funcmember:
 }
 funcstatic:
 {
-  reg -= SZ_INT * 2;
+  reg -= SZ_INT;
   a.code = *(VM_Code*)reg;
   register const m_uint local_depth = *(m_uint*)(reg + SZ_INT);
   register m_bit* m = mem + local_depth;
diff --git a/tests/error/self_extend.gw b/tests/error/self_extend.gw
new file mode 100644 (file)
index 0000000..e6d5a55
--- /dev/null
@@ -0,0 +1,4 @@
+// [contains] cannot extend itself
+class C extends C {
+
+}