]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve func calls
authorJérémie Astor <fennecdjay@gmail.com>
Sun, 13 Jun 2021 11:14:52 +0000 (13:14 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Sun, 13 Jun 2021 11:14:52 +0000 (13:14 +0200)
src/emit/emit.c
src/lib/array.c
src/vm/vm.c
src/vm/vm_code.c

index 1338094d380ccc9f5802f8c46b17768c863003d3..d33a0cab47124cb083fc07d497eaa06a614669a9 100644 (file)
@@ -138,6 +138,10 @@ ANN static inline m_bool ensure_emit(const Emitter emit, const Type t) {
   return envset_run(&es, t);
 }
 
+ANN static inline m_uint emit_code_size(const Emitter emit) {
+  return vector_size(&emit->code->instr);
+}
+
 ANN static void emit_struct_ctor(const Emitter emit, const Type type, const m_uint offset) {
   emit->code->frame->curr_offset += SZ_INT;
   const Instr instr = emit_add_instr(emit, RegPushMem4);
@@ -158,7 +162,6 @@ ANN static void emit_struct_ctor(const Emitter emit, const Type type, const m_ui
   const Instr prelude = emit_add_instr(emit, SetCode);
   prelude->m_val = -SZ_INT*4;
   prelude->udata.one = 2;
-//  prelude->udata.two = emit_code_offset(emit) + SZ_INT + sizeof(frame_t);
   const Instr next = emit_add_instr(emit, Overflow);
   next->m_val2 = code_offset;
   emit->code->frame->curr_offset -= SZ_INT;
@@ -273,10 +276,6 @@ ANN static inline void emit_push_scope(const Emitter emit) {
     emit_add_instr(emit, DebugPush);
 }
 
-ANN static inline m_uint emit_code_size(const Emitter emit) {
-  return vector_size(&emit->code->instr);
-}
-
 ANN m_uint emit_code_offset(const Emitter emit) {
   return emit->code->frame->curr_offset;
 }
@@ -392,7 +391,6 @@ ANN void emit_ext_ctor(const Emitter emit, const Type t) {
   const Instr prelude = emit_add_instr(emit, SetCode);
   prelude->m_val = -SZ_INT * 2;
   prelude->udata.one = 2;
-//  prelude->udata.two = emit_code_offset(emit) + SZ_INT + sizeof(frame_t);
   emit_add_instr(emit, Reg2Mem);
   const Instr next = emit_add_instr(emit, Overflow);
   next->m_val2 = offset;
@@ -1263,6 +1261,7 @@ ANN static Instr get_prelude(const Emitter emit, const Func f, const bool is_sta
   const Instr instr = emit_add_instr(emit, Recurs);
   instr->m_val = SZ_INT;
   instr->udata.one = 1;
+  instr->udata.two = emit_code_offset(emit) + sizeof(frame_t);
   return instr;
 }
 
@@ -1320,7 +1319,6 @@ ANN static m_bool me_arg(MemoizeEmitter *me) {
 ANN static Instr emit_call(const Emitter emit, const Func f, const bool is_static) {
   const Instr prelude = get_prelude(emit, f, is_static);
   prelude->m_val += -f->def->stack_depth - SZ_INT;
-  prelude->udata.two = emit_code_offset(emit) + f->def->stack_depth + sizeof(frame_t);
   const m_uint member = vflag(f->value_ref, vflag_member) ? SZ_INT : 0;
   if(member) {
     const Instr instr = emit_add_instr(emit, Reg2Mem);
index d9852bb466eeb20738c1f28ffcf2e742c759a86b..9da86cf5ecb0bdd6cade76ff06b52fdaf35f22ce 100644 (file)
@@ -711,9 +711,7 @@ ANN static void prepare_run(m_bit *const byte, const f_instr ini, const f_instr
   *(unsigned*)byte = eOP_MAX;
   *(f_instr*)(byte + SZ_INT*2) = ini;
   *(unsigned*)(byte+ BYTECODE_SZ) = eSetCode;
-//  *(m_uint*)(byte + BYTECODE_SZ + SZ_INT*2) = 3;
   *(uint16_t*)(byte + BYTECODE_SZ + SZ_INT*2) = 3;
-//  *(uint16_t*)(byte + BYTECODE_SZ + SZ_INT*2 + sizeof(uint16_t)) = sizeof(frame_t);
   *(unsigned*)(byte+ BYTECODE_SZ*2) = eOverflow;
   *(unsigned*)(byte+ BYTECODE_SZ*3) = eOP_MAX;
   *(f_instr*)(byte + BYTECODE_SZ*3 + SZ_INT*2) = end;
index ae27350b8edb347c3c40f7558665ffc8d75cfaea..26009df8c5dd342c5794f5c0200f7e78f747e0be 100644 (file)
@@ -724,12 +724,12 @@ setcode:
 PRAGMA_PUSH()
   a.code = *(VM_Code*)(reg - SZ_INT);
   if(!a.code->builtin) {
-    register const uint push = *(m_uint*)reg + code->stack_depth + sizeof(frame_t);
+    register const uint push = *(m_uint*)reg /*+ code->stack_depth*/ + sizeof(frame_t);
     mem += push;
     *(frame_t*)(mem - sizeof(frame_t)) = (frame_t){ .code=code, .pc=PC+UVAL, .push=push };
     next = eFuncUsrEnd;
   } else {
-    mem += *(m_uint*)reg /*- (code->stack_depth + */ /*- sizeof(frame_t)*/;
+    mem += *(m_uint*)reg;
     next = eFuncMemberEnd;
   }
 PRAGMA_POP()
index 14b267e3a0fb474edbf796d00d8830d9880835a4..0438c52a78af701d3c1b9da789f908456f1ff77b 100644 (file)
@@ -143,7 +143,7 @@ ANN static m_bit* tobytecode(MemPool p, const VM_Code code) {
         *(m_uint*)(data + SZ_INT) = new_pc;
       } else if(opcode == eRecurs /*|| opcode == eSetCode*/) {
         *(uint16_t*)(final + j * BYTECODE_SZ + SZ_INT*2) =
-          instr->m_val2 += j+1;
+          instr->udata.one += j + 1;
       }
       setpc(data, j);
       ++j;