]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix unions
authorJérémie Astor <fennecdjay@gmail.com>
Thu, 15 Jul 2021 14:46:36 +0000 (16:46 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Thu, 15 Jul 2021 14:46:36 +0000 (16:46 +0200)
src/emit/emit.c
src/lib/union.c
tests/union/none.gw
tests/union/option_check.gw
tests/union/union.gw

index 4923dea4ed0ca9717cbbad78f6038adfcf6c5a35..d2da91156c0f0e24550813497f5f6e5dad6efcb8 100644 (file)
@@ -1150,7 +1150,7 @@ ANN static m_bool _emit_exp_call(const Emitter emit, const Exp_Call *exp_call) {
   const Type t = actual_type(emit->gwion, exp_call->func->type);
   const Func f = t->info->func;
   if (is_fptr(emit->gwion, t) || strstr(emit->code->name, "ork~") ||
-      (f != emit->env->func || f->value_ref->from->owner_class))
+      (f != emit->env->func || (f && f->value_ref->from->owner_class)))
     CHECK_BB(prepare_call(emit, exp_call));
   else
     CHECK_BB(emit_func_args(emit, exp_call));
index d01aff898576d647db14631073b33a4d3a6bf602..6cc7d0e6e080afdbeabb2b16e19455ca5b68eaf1 100644 (file)
@@ -133,7 +133,6 @@ static OP_CHECK(opck_union_ctor) {
 
 static INSTR(UnionCtor) {
   POP_REG(shred, instr->m_val2);
-  POP_REG(shred, SZ_INT);
   const m_uint   index = *(m_uint *)REG(-SZ_INT);
   const M_Object o     = *(M_Object *)REG(-SZ_INT) =
       new_object(shred->info->mp, NULL, (Type)instr->m_val);
@@ -142,11 +141,11 @@ static INSTR(UnionCtor) {
 }
 
 static OP_EMIT(opem_union_ctor) {
-  Exp_Call *  call  = (Exp_Call *)data;
-  const Type  base  = actual_type(emit->gwion, call->func->type);
-  const Instr instr = emit_add_instr(emit, UnionCtor);
-  instr->m_val      = (m_uint)base;
-  instr->m_val2     = call->args->next->type->size;
+  Exp_Call *const  call  = (Exp_Call *)data;
+  const Type       base  = actual_type(emit->gwion, call->func->type);
+  const Instr      instr = emit_add_instr(emit, UnionCtor);
+  instr->m_val           = (m_uint)base;
+  instr->m_val2          = call->args->next->type->size;
   return GW_OK;
 }
 
index 1bb4787acc3df4fc28609c96bd829df3fa251b88..3ee84d7835f96fd62f388df848bac23d1bc6df6d 100644 (file)
@@ -1 +1,2 @@
+#! [contains] right-side operand is non-mutable
 None => None;
index 81ed99904e250984d09e1d98a1a6196f4db19414..b9a7d59f55712dc08765519b197a55dba8ced8ef 100644 (file)
@@ -1,9 +1,6 @@
-#! [contains] 12
+#! [contains] val: 12
 var int? i;
 
-<<< 12 => i.val >>>;
+12 => i.val;
 if(i.is(val))
-  <<< i.val >>>;
-#!<<< None => i.none >>>;
-#!if(i.is(none))
-#!  <<< "option unset" >>>;
+  <<< "val: ${i.val}" >>>;
index 88d47c27ccfc005abf06f0a63369bb4e6187e7de..14c31e289556711f67ba0d17e0cb17511a9fc5ca 100644 (file)
@@ -1,10 +1,12 @@
+#! [contains] 2.4
 union U {
   int i;
   float f;
 }
 
-var U u;
+U(i, 1) => var U u;
 <<< u.i >>>;
 
+2.4 => u.f;
 <<< u.f >>>;