]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix Fork retval
authorJérémie Astor <fennecdjay@gmail.com>
Tue, 15 Dec 2020 00:18:52 +0000 (01:18 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Tue, 15 Dec 2020 00:18:52 +0000 (01:18 +0100)
src/emit/emit.c
src/lib/lib_func.c
src/lib/shred.c
tests/error/abstract.gw [deleted file]

index a845a8f4b6c1f0854b37c2382fdcda61bec30e56..515654ce487484c1f0496f2045588f59bb89f429 100644 (file)
@@ -1342,7 +1342,7 @@ ANN static Instr spork_ini(const Emitter emit, const struct Sporker *sp) {
   const Func f = !sp->code ? sp->exp->d.exp_call.m_func : NULL;
   const Instr instr = emit_add_instr(emit, ForkIni);
   instr->m_val = (m_uint)sp->vm_code;
-  instr->m_val2 = f ? sp->type->size : 0;
+  instr->m_val2 = sp->type->size;
   return instr;
 }
 
index 9fdeaa34a5384b11fcdc7dcbc61148d57db9e144..f9ff5cb2551856ef2dc3c51455227e3219c942e3 100644 (file)
@@ -291,6 +291,9 @@ ANN static Type fork_type(const Env env, const Exp_Unary* unary) {
   const Type fork = env->gwion->type[et_fork];
   UNSET_FLAG(fork, final);
   const Type typed = str2type(env->gwion, "TypedFork", exp_self(unary)->pos);
+  // ensure room for retval
+  if(typed->nspc->info->offset == fork->nspc->info->offset)
+    typed->nspc->info->offset += t->size;
   UNSET_FLAG(typed, final);
   const Type ret = str2type(env->gwion, c, exp_self(unary)->pos);
   SET_FLAG(typed, final);
index 25dcb175213ce1c7fbefc312d20a8d24742f55ca..60a20095ff28444744d1fd4cf20ccf53cbd731c6 100644 (file)
@@ -262,9 +262,10 @@ struct ThreadLauncher *tl = data;
     vm_run(vm);
     ++vm->bbq->pos;
   }
-  memcpy(me->data + vm->gwion->type[et_fork]->nspc->info->offset, *(m_bit**)ME(me)->reg, FORK_RETSIZE(me));
   gwion_end_child(ME(me), vm->gwion);
   MUTEX_LOCK(vm->parent->shreduler->mutex);
+  if(!*(m_int*)(me->data + o_shred_cancel) && me->type_ref != vm->gwion->type[et_fork])
+    memcpy(me->data + vm->gwion->type[et_fork]->nspc->info->offset, ME(me)->reg, FORK_RETSIZE(me));
   *(m_int*)(me->data + o_fork_done) = 1;
   if(!*(m_int*)(me->data + o_shred_cancel))
     broadcast(*(M_Object*)(me->data + o_fork_ev));
diff --git a/tests/error/abstract.gw b/tests/error/abstract.gw
deleted file mode 100644 (file)
index 0252d6e..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#! [contains] is abstract, declare as ref
-var Shred shred;