]> Nishi Git Mirror - gwion.git/commitdiff
:art: Global union testing
authorfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 10 Oct 2019 16:41:31 +0000 (18:41 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 10 Oct 2019 16:41:31 +0000 (18:41 +0200)
src/emit/emit.c
src/oo/value.c
src/parse/check.c
tests/tree/global_named_union.gw [new file with mode: 0644]

index cd9b920dc0dc22bc6dc6324e69864d6a10fba686..6fc26fdf411bfa13441033385a6962845bb71af3 100644 (file)
@@ -1413,7 +1413,7 @@ ANN static m_bool emit_union_def(const Emitter emit, const Union_Def udef) {
       const M_Object o = new_object(emit->gwion->mp, NULL, udef->value->type);
       udef->value->d.ptr = (m_uint*)o;
       SET_FLAG(udef->value, builtin);
-      SET_FLAG(udef->value, global);
+      UNSET_FLAG(udef->value, union);
     }
     scope = emit_push_type(emit, udef->value->type);
   } else if(udef->type_xid) {
@@ -1432,6 +1432,7 @@ ANN static m_bool emit_union_def(const Emitter emit, const Union_Def udef) {
       SET_FLAG(list->self->value, union);
     } while((l = l->next));
     SET_FLAG(udef->l->self->d.exp_decl.list->self->value, enum);
+    SET_FLAG(udef->l->self->d.exp_decl.list->self->value, dtor);
   }
   if(udef->xid)
     regpop(emit, SZ_INT);
index 3f1cbfbe4aeca18d73100c8957526e483c4f5daf..f069b3b3d59cf99e98112aee7ce6e1dc919f8373 100644 (file)
@@ -14,6 +14,8 @@ ANN static void free_value(Value a, Gwion gwion) {
       !(GET_FLAG(a, enum) && GET_FLAG(a, builtin) && a->from->owner_class)
       && isa(t, gwion->type[et_object]) < 0)
    _mp_free(gwion->mp, t->size, a->d.ptr);
+  if(GET_FLAG(a, enum) && GET_FLAG(a, dtor))
+    xfree(a->d.ptr);
   if(is_class(gwion, t))
     REM_REF(t, gwion)
   mp_free(gwion->mp, ValueFrom, a->from);
index be8cc42340a9271c435792c78131096676acc834..2f4a100d562e4f8f1fcc9787a4ce7994e99307ad 100644 (file)
@@ -1127,11 +1127,9 @@ ANN m_bool check_union_decl(const Env env, const Union_Def udef) {
   Decl_List l = udef->l;
   do {
     CHECK_OB(check_exp(env, l->self))
-    if(isa(l->self->type, env->gwion->type[et_object]) > 0) {
-      Var_Decl_List list = l->self->d.exp_decl.list;
-      do SET_FLAG(list->self->value, pure);
-      while((list = list->next));
-    }
+    Var_Decl_List list = l->self->d.exp_decl.list;
+    do SET_FLAG(list->self->value, pure);
+    while((list = list->next));
     if(l->self->type->size > udef->s)
       udef->s = l->self->type->size;
   } while((l = l->next));
diff --git a/tests/tree/global_named_union.gw b/tests/tree/global_named_union.gw
new file mode 100644 (file)
index 0000000..a5e51c9
--- /dev/null
@@ -0,0 +1,8 @@
+union global {
+  int int_from_global_union;
+  float float_from_global_union;
+} global_union;
+
+<<< "HERE", global_union >>>;
+<<< 123.456 => global_union.float_from_global_union >>>;
+<<< global_union.float_from_global_union >>>;