]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve vm and gack
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Fri, 8 May 2020 19:52:40 +0000 (21:52 +0200)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Fri, 8 May 2020 19:52:40 +0000 (21:52 +0200)
include/gack.h
opcode.txt
src/lib/gack.c
src/vm/vm.c
src/vm/vm_code.c

index be0397767bf927cc0bc61f2f9ed11b0b4e020d2a..106a0edcdff708ed285bd483420da0cf77cff636 100644 (file)
@@ -1,6 +1,6 @@
 #ifndef __GACK
 #define __GACK
-ANN void gack(const VM_Shred, const Instr);
+ANN void gack(const VM_Shred, const m_uint);
 
 #define INTERP_PRINTF(fmt, ...) { \
   m_str ret = *(m_str*)(VALUE - SZ_INT);\
index 62c4fb4b281f79d9b12513b04929475d4382a625..36ebfc0b59b2854f9db82e2f5a076019a1d86fc5 100644 (file)
@@ -171,6 +171,6 @@ GackType
 GackEnd
 Gack
 NoOp
-DotTmplVal
-OP_MAX
 EOC
+OP_MAX
+DotTmplVal
index d339529fe79b2609a3da207b3434d5b4a209a1f9..083d15a5dd0fd9e0bf6595126a2138ccd387da00 100644 (file)
@@ -65,14 +65,14 @@ ANN static void prepare_call(const VM_Shred shred, const m_uint offset) {
   shred->pc = 0;
 }
 
-ANN void gack(const VM_Shred shred, const Instr instr) {
+ANN void gack(const VM_Shred shred, const m_uint offset) {
   const Type t = *(Type*)shred->reg;
   const VM_Code code = get_gack(t);
   if(GET_FLAG(code, builtin)) {
     ((f_gack)code->native_func)(t, (shred->reg - t->size), shred);
     POP_REG(shred, t->size);
   } else {
-    prepare_call(shred, instr->m_val2);
+    prepare_call(shred, offset);
     shred->code = code;
     POP_REG(shred, SZ_INT*2);
   }
index 008a8425111a193b328f21cd2abacead96cde1f3..bd20678c565c4d1258d8d90dfe736718e4038768 100644 (file)
@@ -871,7 +871,7 @@ gackend:
 }
 gack:
   VM_OUT
-  gack(shred, (Instr)VAL);
+  gack(shred, VAL);
   goto in;
 noop:
   DISPATCH();
index dcb7d47e3c10831f34af0a5041c4c0b5b13df02e..e2b8f6c3ebc9594851b47384abc8e57c03e8e634 100644 (file)
@@ -47,7 +47,7 @@ ANN static m_bit* tobytecode(MemPool p, const VM_Code code) {
       instr->opcode = eRegPushImm;
       instr->m_val = (m_uint)code;
     }
-    if(instr->opcode < eGack)
+    if(instr->opcode < eOP_MAX)
       memcpy(ptr + i*BYTECODE_SZ, instr, BYTECODE_SZ);
     else {
       *(m_bit*)(ptr + (i*BYTECODE_SZ)) = instr->opcode;