]> Nishi Git Mirror - gwion.git/commitdiff
:art: Fix member union
authorfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 10 Oct 2019 22:09:01 +0000 (00:09 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 10 Oct 2019 22:09:01 +0000 (00:09 +0200)
src/emit/emit.c
src/oo/nspc.c
src/parse/check.c
src/parse/scan0.c

index 5709a02c22db3bfbb133c518c9de8df912b193b3..1fbe337571ae34446f7f37d458a434b0fa62627c 100644 (file)
@@ -1420,10 +1420,7 @@ ANN static m_bool emit_union_def(const Emitter emit, const Union_Def udef) {
     union_allocdata(emit->gwion->mp, udef);
     SET_FLAG(udef->type, emit);
     scope = emit_push_type(emit, udef->type);
-  } else if(emit->env->class_def) {// miss flag ?
-    if(!GET_FLAG(l->self->d.exp_decl.list->self->value, member))
-      udef->o = emit_local(emit, udef->s, 0);
-  } else if(global) {// miss flag?
+  } else if(global) {
     void* ptr = (void*)xcalloc(1, udef->s);
     l = udef->l;
     do {
index 5075deca40b8d4c1068a7469ae9d9ff14790ce41..2dde7770342e8c8b4dc789a9c718425157601278 100644 (file)
@@ -19,8 +19,8 @@ ANN void nspc_commit(const Nspc nspc) {
 }
 
 ANN static inline void nspc_release_object(const Nspc a, Value value, Gwion gwion) {
-  if((GET_FLAG(value, static) && a->info->class_data) ||
-    (value->d.ptr && GET_FLAG(value, builtin))) {
+  if(!GET_FLAG(value, pure) && ((GET_FLAG(value, static) && a->info->class_data) ||
+    (value->d.ptr && GET_FLAG(value, builtin)))) {
     const M_Object obj = value->d.ptr ? (M_Object)value->d.ptr :
         *(M_Object*)(a->info->class_data + value->from->offset);
        release(obj, gwion->vm->cleaner_shred);
index ffc0065b6fea3e27735c3cbaeae27809071d93f6..6ce23e61f67fa7587341e9eb8b09dd7d97df80ec 100644 (file)
@@ -1145,6 +1145,8 @@ ANN m_bool check_union_def(const Env env, const Union_Def udef) {
   check_udef(env, udef);
   const m_uint scope = union_push(env, udef);
   const m_bool ret = check_union_decl(env, udef);
+  if(!udef->xid && !udef->type_xid && env->class_def && !GET_FLAG(udef, static))
+    env->class_def->nspc->info->offset = udef->o + udef->s;
   union_pop(env, udef, scope);
   return ret;
 }
index 5a2468a8dd2619287f4dbd72d7e60f914ecb25c5..85cdb9913bb69dd7f569755d6e975678a9c8931f 100644 (file)
@@ -276,7 +276,7 @@ ANN m_bool scan0_union_def(const Env env, const Union_Def udef) {
     valuefrom(env, udef->value->from);
     nspc_add_value(nspc, sym, udef->value);
     add_type(env, nspc, t);
-    SET_FLAG(udef->value, checked | udef->flag);
+    SET_FLAG(udef->value, checked | ae_flag_pure | udef->flag);
     SET_FLAG(t, scan1 | ae_flag_union);
   }
   if(udef->tmpl) {