]> Nishi Git Mirror - gwion.git/commitdiff
:bug: prepare SetCtor in VM
authorfennecdjay <fennecdjay@gmail.com>
Sun, 11 Dec 2022 13:40:25 +0000 (14:40 +0100)
committerfennecdjay <fennecdjay@gmail.com>
Sun, 11 Dec 2022 13:40:25 +0000 (14:40 +0100)
src/lib/instr.c
src/vm/vm.c

index 2d8411e8989952918813e9a6ab1a5632ae2312ae..2cea5b4b366844ea47b764d129d499199c331b4b 100644 (file)
@@ -122,14 +122,13 @@ INSTR(DotTmpl) {
 #define VAL  (*(m_uint *)(byte + SZ_INT))
 #define FVAL (*(m_float *)(byte + SZ_INT))
 #define VAL2 (*(m_uint *)(byte + SZ_INT * 2))
-#define BYTE(a)                                                                \
-  m_bit *byte    = shred->code->bytecode + (shred->pc - 1) * BYTECODE_SZ;       \
-  *(m_uint *)byte = a;
+#define BYTE(a)                                                           \
+  m_bit *byte    = shred->code->bytecode + (shred->pc - 1) * BYTECODE_SZ; \
+  *(m_uint *)byte = instr->opcode;                                        \
+  instr->opcode = a;
 
 INSTR(SetFunc) {
-  m_bit *byte    = shred->code->bytecode + (shred->pc - 1) * BYTECODE_SZ;
-  *(m_uint *)byte = instr->opcode;
-  instr->opcode = eRegPushImm;
+  BYTE(eRegPushImm);
   const Func f = (Func)instr->m_val;
   VAL = *(m_uint *)(shred->reg) = (m_uint)f->code;
   shred->reg += SZ_INT;
@@ -139,16 +138,14 @@ INSTR(SetCtor) {
   BYTE(eRegSetImm)
   const Type t = (Type)instr->m_val;
   VAL = *(m_uint *)(shred->reg + SZ_INT) = (m_uint)t->nspc->pre_ctor;
-  VAL2                                   = SZ_INT;
+  VAL2 = SZ_INT;
 }
 
 INSTR(fast_except) {
   struct FastExceptInfo *info = (struct FastExceptInfo *)instr->m_val2;
   if(*(m_uint*)REG(-SZ_INT)) {
-    m_bit *byte    = shred->code->bytecode + (shred->pc - 1) * BYTECODE_SZ;       \
-    *(m_uint *)byte = instr->opcode;
+    BYTE(eNoOp);
     VAL = -SZ_INT;
-    instr->opcode = eNoOp;
     if(info) mp_free2(shred->info->mp, sizeof(struct FastExceptInfo), info);
     instr->m_val2 = 0;
     return;
@@ -157,8 +154,6 @@ INSTR(fast_except) {
       gwerr_basic("Object not instantiated", NULL, NULL, info->file, info->loc, 0);
     if(info->file2)
       gwerr_warn("declared here", NULL, NULL, info->file2, info->loc2);
-//    mp_free2(shred->info->mp, sizeof(struct FastExceptInfo), info);
-//    instr->m_val2 = 0;
   }
   handle(shred, "NullPtrException");
 }
index 773c852eaa78084b98a4ea0dfda19d856032676a..e3c5c3e3228fef749bfec3e333b848813b81b595 100644 (file)
@@ -1569,7 +1569,9 @@ _other:
     instr->opcode = (m_uint)&&noop;
   else if(exec == SetFunc)
     instr->opcode = (m_uint)&&regpushimm;
-  prepare_code += BYTECODE_SZ;\
+  else if(exec == SetCtor)
+    instr->opcode = (m_uint)&&regsetimm;
+  prepare_code += BYTECODE_SZ;
   goto *_dispatch[*(m_bit*)prepare_code];
 }
     PREPARE(vmin);