]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix member fptr spork
authorfennecdjay <astor.jeremie@wanadoo.fr>
Wed, 17 Jul 2019 17:40:57 +0000 (19:40 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Wed, 17 Jul 2019 17:40:57 +0000 (19:40 +0200)
include/opcode.h
opcode.txt
src/emit/emit.c

index 4605b40c6b3aa88217488d9c9d2fb6433e59cafc..49fd830ac9841e37e916717f18ce6100a6e32a67 100644 (file)
@@ -132,6 +132,7 @@ enum {
   eSporkIni,
   eForkIni,
   eSporkFunc,
+  eSporkMemberFptr,
   eSporkExp,
   eForkEnd,
   eSporkEnd,
@@ -306,6 +307,7 @@ enum {
 #define  SporkIni            (f_instr)eSporkIni
 #define  ForkIni             (f_instr)eForkIni
 #define  SporkFunc           (f_instr)eSporkFunc
+#define  SporkMemberFptr     (f_instr)eSporkMemberFptr
 #define  SporkExp            (f_instr)eSporkExp
 #define  ForkEnd             (f_instr)eForkEnd
 #define  SporkEnd            (f_instr)eSporkEnd
index f88b8c998e764fee5f4ee0b2961fc4f5f80fc4cf..eb027efef439907269e2d29a5b65489c0dbfe629 100644 (file)
@@ -129,6 +129,7 @@ FuncMemberEnd
 SporkIni
 ForkIni
 SporkFunc
+SporkMemberFptr
 SporkExp
 ForkEnd
 SporkEnd
index ed868e06f14e49face98d5d6b6bd2c9600017876..e50b6d130d85df73648bc8e4f44993977db0cace 100644 (file)
@@ -973,18 +973,10 @@ ANN m_bool emit_exp_spork(const Emitter emit, const Exp_Unary* unary) {
   } else {
     if(GET_FLAG(f, member) && is_fptr(f->value_ref->type)) {
       const m_uint depth = f->def->stack_depth;
-      regpop(emit, depth);
-      emit_add_instr(emit, RegPushMem);
-      const Instr arg = emit_add_instr(emit, SporkFunc);
-      arg->m_val = depth - SZ_INT;
-      const Instr cpy = emit_add_instr(emit, SporkFunc);
-      cpy->m_val = SZ_INT;
-      cpy->m_val2 = -SZ_INT;
-      const Instr cpy1 = emit_add_instr(emit, SporkFunc);
-      cpy1->m_val = SZ_INT;
-      cpy1->m_val2 = SZ_INT;
-      const Instr code = emit_add_instr(emit, DotMember);
-      code->m_val = f->value_ref->offset;
+      regpop(emit, depth -SZ_INT);
+      const Instr spork = emit_add_instr(emit, SporkMemberFptr);
+      spork->m_val = depth + SZ_INT;
+      spork->m_val2 = -SZ_INT*2;
     } else
       emit_exp_spork_finish(emit, f->def->stack_depth);
     const Instr end = emit_add_instr(emit, is_spork ? SporkEnd : ForkEnd);