]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Few bugfixes (spork and function pointers)
authorJérémie Astor <fennecdjay@gmail.com>
Wed, 16 Jun 2021 14:22:40 +0000 (16:22 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Wed, 16 Jun 2021 14:22:40 +0000 (16:22 +0200)
src/emit/emit.c
src/lib/modules.c
src/vm/shreduler.c

index 2841866482126d93f6e0e12e78e6c0a8935ce843..42d650ca619d5cb37e53cc142c2f4bfec02fd7e1 100644 (file)
@@ -498,7 +498,7 @@ ANN static m_bool _emit_symbol(const Emitter emit, const Symbol *data) {
            : emit_regpushbase(emit, size, exp_getvar(prim_exp(data)));
   instr->m_val = v->from->offset;
   if (GET_FLAG(v, late) && !exp_getvar(prim_exp(data)) &&
-      isa(v->type, emit->gwion->type[et_object]) > 0) {
+      (isa(v->type, emit->gwion->type[et_object]) > 0 || is_fptr(emit->gwion,  v->type))) {
     const Instr instr = emit_add_instr(emit, GWOP_EXCEPT);
     instr->m_val      = -SZ_INT;
   }
@@ -1458,11 +1458,13 @@ ANN m_bool emit_exp_call1(const Emitter emit, const Func f,
   if (vector_size(&emit->code->instr) && vflag(f->value_ref, vflag_member) &&
       is_fptr(emit->gwion, f->value_ref->type)) {
     const Instr back = (Instr)vector_back(&emit->code->instr);
-    const Instr base =
-        back->opcode != eGWOP_EXCEPT
+    const bool is_except = back->opcode == eGWOP_EXCEPT;
+    const Instr base = !is_except
             ? back
             : (Instr)vector_at(&emit->code->instr,
                                vector_size(&emit->code->instr) - 2);
+    if(is_except)
+      vector_pop(&emit->code->instr);
     const m_bit  exec = base->opcode;
     const m_uint val  = base->m_val;
     const m_uint val2 = base->m_val2;
@@ -1472,6 +1474,10 @@ ANN m_bool emit_exp_call1(const Emitter emit, const Func f,
     const Instr instr = emit_add_instr(emit, (f_instr)(m_uint)exec);
     instr->m_val      = val;
     instr->m_val2     = val2;
+    if(is_except) {
+       vector_add(&emit->code->instr, (m_uint)back);
+       back->m_val = -SZ_INT;
+    }
   } else if (f != emit->env->func && !f->code &&
              !is_fptr(emit->gwion, f->value_ref->type)) {
     // not yet emitted static func
index 11c319b7f98fd1188e9dd113410afbf66f4c2edf..76bffd3d924b2bc88107cbbdd9cabce8bb8122cb 100644 (file)
@@ -264,7 +264,7 @@ static INSTR(UsrUGenTick) {
   vmcode_addref(*(VM_Code *)(shred->reg - offset));
   uu->shred->info->vm = shred->info->vm;
   code_prepare(vmcode_callback(shred->info->mp, uu->shred->code));
-  shreduler_ini(uu->shred->info->vm->shreduler, uu->shred);
+  shreduler_ini(uu->shred->tick->shreduler, uu->shred);
   uu->prep                           = instr->m_val ? member_prep : global_prep;
   *(M_Object *)(shred->reg - SZ_INT) = o;
 }
index 063db600171a9c8b2c62d4ce9e59a32bdc938b59..37bf9d50924d97d8883235de9cab619db609d3e6 100644 (file)
@@ -31,7 +31,7 @@ ANN VM_Shred shreduler_get(const Shreduler s) {
 ANN static inline void shreduler_child(const Vector v) {
   for (m_uint i = vector_size(v) + 1; --i;) {
     const VM_Shred child = (VM_Shred)vector_at(v, i - 1);
-    shreduler_remove(child->info->vm->shreduler, child, true);
+    shreduler_remove(child->tick->shreduler, child, true);
   }
 }