]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve VM
authorfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 10 Oct 2019 13:12:33 +0000 (15:12 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 10 Oct 2019 13:12:33 +0000 (15:12 +0200)
src/emit/emit.c
src/vm/vm.c
src/vm/vm_code.c
tests/sh/import.sh

index 5274fbadf98e5b69eb2919bb536330a9690d2628..ad16f13f0a9488d1ae95508d98f926aaf1e52e16 100644 (file)
@@ -1688,8 +1688,7 @@ ANN static m_bool emit_member_func(const Emitter emit, const Exp_Dot* member) {
   const Func f = exp_self(member)->type->e->d.func;
   if(is_class(emit->gwion, member->t_base) || GET_FLAG(member->base->type, force)) {
     const Instr func_i = emit_add_instr(emit, f->code ? RegPushImm : PushStaticCode);
-    if(f->code)
-      func_i->m_val = (m_uint)(f->code ?: (VM_Code)f);
+    func_i->m_val = (m_uint)f->code;
     return GW_OK;
   }
   if(f->def->base->tmpl)
index 55e9c921f87d5ab195028ae39cd7f67bab32efd6..b41fbc932fdb97d7e6567e8ba3be632518255ec2 100644 (file)
@@ -54,9 +54,9 @@ uint32_t gw_rand(uint32_t s[2]) {
 void vm_remove(const VM* vm, const m_uint index) {
   const Vector v = (Vector)&vm->shreduler->shreds;
   LOOP_OPTIM
-  for(m_uint i = vector_size(v) + 1; i--;) {
+  for(m_uint i = vector_size(v) + 1; --i;) {
     const VM_Shred sh = (VM_Shred)vector_at(v, i - 1);
-    if(sh->tick->xid == index)
+    if(sh && sh->tick->xid == index)
        Except(sh, "MsgRemove");
   }
 }
index 597007f5c97467615787debd17211f45f9856276..c9c008e6cc26a8754a19c81c438696705bd362de 100644 (file)
@@ -49,18 +49,9 @@ ANN static m_bit* tobytecode(MemPool p, const VM_Code code) {
   m_bit *ptr = _mp_malloc(p, sz * BYTECODE_SZ);
   for(m_uint i= 0; i < sz; ++i) {
     const Instr instr = (Instr)vector_at(v, i);
-    if(instr->opcode == ePushStaticCode) {
-      if(!instr->m_val) {
-        instr->opcode = eRegPushImm;
-        instr->m_val = (m_uint)code;
-      } else {
-        const Func f = (Func)instr->m_val;
-        if(f->code) {
-          instr->opcode = eRegSetImm;
-          instr->m_val = (m_uint)((Func)instr->m_val)->code;
-          instr->m_val2 = -SZ_INT;
-        }
-      }
+    if(instr->opcode == ePushStaticCode && !instr->m_val) {
+      instr->opcode = eRegPushImm;
+      instr->m_val = (m_uint)code;
     }
     if(instr->opcode < eGack)
       memcpy(ptr + i*BYTECODE_SZ, instr, BYTECODE_SZ);
index bf9653c53cc65ccbe94d95c8a37b7e0151132146..00441d4c18bd63c8c798d1b2887725f6d145c0fc 100644 (file)
@@ -1,5 +1,5 @@
 #!/bin/bash
-# [test] #37
+# [test] #38
 
 n=0
 [ "$1" ] && n="$1"