]> Nishi Git Mirror - gwion.git/commitdiff
:art: Cleaning
authorJérémie Astor <fennecdjay@gmail.com>
Wed, 30 Dec 2020 12:44:05 +0000 (13:44 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Wed, 30 Dec 2020 12:44:05 +0000 (13:44 +0100)
src/emit/emit.c
src/vm/vm.c
src/vm/vm_code.c

index d4d1a2c6d72268b8ab6f9a68ad1a49bca434d81b..ec0d441c467bd3b5c60712285d923b2b2c91d695 100644 (file)
@@ -131,7 +131,7 @@ ANN static void emit_struct_ctor(const Emitter emit, const Type type, const m_ui
   regpush(emit, SZ_INT *2);
   const Instr prelude = emit_add_instr(emit, SetCode);
   prelude->m_val2 = 2;
-  prelude->m_val = -SZ_INT*3;
+  prelude->m_val = -SZ_INT*4;
   const Instr next = emit_add_instr(emit, Overflow);
   next->m_val2 = code_offset;
   emit->code->frame->curr_offset -= SZ_INT;
@@ -328,7 +328,7 @@ ANN void emit_ext_ctor(const Emitter emit, const Type t) {
   regpush(emit, SZ_INT*2);
   const Instr prelude = emit_add_instr(emit, SetCode);
   prelude->m_val2 = 2;
-  prelude->m_val = -SZ_INT;
+  prelude->m_val = -SZ_INT * 2;
   emit_add_instr(emit, Reg2Mem);
   const Instr next = emit_add_instr(emit, Overflow);
   next->m_val2 = offset;
@@ -1154,7 +1154,7 @@ ANN static m_bool me_arg(MemoizeEmitter *me) {
 
 ANN static Instr emit_call(const Emitter emit, const Func f) {
   const Instr prelude = get_prelude(emit, f);
-  prelude->m_val = -f->def->stack_depth;
+  prelude->m_val = -f->def->stack_depth - SZ_INT;
   const m_uint member = vflag(f->value_ref, vflag_member) ? SZ_INT : 0;
   if(member) {
     const Instr instr = emit_add_instr(emit, Reg2Mem);
index e12d49f8e0144a86b93880c9c1b9e9c678e43c17..c84c024f87fe7d6d6de7a885fadbcc509bd1ee07 100644 (file)
@@ -616,10 +616,9 @@ timeadv:
   break;
 setcode:
 PRAGMA_PUSH()
-  reg -= SZ_INT;
-  a.code = *(VM_Code*)reg;
+  a.code = *(VM_Code*)(reg - SZ_INT);
   if(!a.code->builtin) {
-    register const m_uint push = *(m_uint*)(reg + SZ_INT) + *(m_uint*)(mem-SZ_INT);
+    register const m_uint push = *(m_uint*)reg + *(m_uint*)(mem-SZ_INT);
     mem += push;
     *(m_uint*)  mem = push; mem += SZ_INT;
     *(VM_Code*) mem = code; mem += SZ_INT;
@@ -627,7 +626,7 @@ PRAGMA_PUSH()
     *(m_uint*) mem = a.code->stack_depth; mem += SZ_INT;
     next = eFuncUsrEnd;
   } else {
-    mem += *(m_uint*)(reg + SZ_INT);
+    mem += *(m_uint*)reg;
     next = eFuncMemberEnd;
   }
 PRAGMA_POP()
index c5180e4fb4a7f87d79d461732e4f8b46ac19ca21..21b3acc37a75a838f49472c05771ba27a5e4c62d 100644 (file)
@@ -100,14 +100,12 @@ ANN static m_bit* tobytecode(MemPool p, const VM_Code code) {
     if(opcode != eNoOp) {
       m_bit *const base = ptr   + i*BYTECODE_SZ,
             *const data = final + j*BYTECODE_SZ;
-//        if(!isgoto(opcode))
       memcpy(data, base, BYTECODE_SZ);
       if(isgoto(opcode)) {
         m_bit pc = 0;
-        for(m_uint k = 0; k < vector_size(&nop); ++k) {
-          if(instr->m_val <= vector_at(&nop, k))
+        for(pc = 0; pc < vector_size(&nop); ++pc) {
+          if(instr->m_val <= vector_at(&nop, pc))
             break;
-          ++pc;
         }
         *(m_uint*)(data + SZ_INT) = instr->m_val > pc ? instr->m_val - pc : 0;
       }
@@ -133,4 +131,3 @@ VM_Code new_vmcode(MemPool p, const Vector instr, const m_uint stack_depth,
   code->ref = 1;
   return code;
 }
-