]> Nishi Git Mirror - gwion.git/commitdiff
:art: Clear Value flags
authorJérémie Astor <fennecdjay@gmail.com>
Fri, 8 Jan 2021 10:23:33 +0000 (11:23 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Fri, 8 Jan 2021 10:23:33 +0000 (11:23 +0100)
include/env/value.h
src/emit/emit.c
src/env/nspc.c
src/lib/object.c
src/parse/scan1.c

index db136b8460d46cbb461fae64a8e7cb516bebee7a..6d8450119fa1cf5aa8acf770fab388c0c12cf38b 100644 (file)
@@ -10,15 +10,12 @@ struct ValueFrom_ {
 enum vflag {
   vflag_none  = 1 << 0,
   vflag_func  = 1 << 1,
-  vflag_union = 1 << 2,
-  vflag_enum  = 1 << 3,
-  vflag_freeme  = 1 << 4,
-  vflag_fglobal  = 1 << 5,
-  vflag_valid    = 1 << 6,
-  vflag_direct    = 1 << 7,
-  vflag_builtin    = 1 << 8,
-  vflag_member   = 1 << 9,
-  vflag_closed   = 1 << 10
+  vflag_fglobal  = 1 << 2,
+  vflag_valid    = 1 << 3,
+  vflag_direct    = 1 << 4,
+  vflag_builtin    = 1 << 5,
+  vflag_member   = 1 << 6,
+  vflag_closed   = 1 << 7
 //  vflag_used = 1 << 3
 } __attribute__((packed));
 
index 8b54391b965c24d62864b6ce32613dfa4f4b1035..310655c15c04383f1fcc582b43cb7a3e579f76cd 100644 (file)
@@ -410,7 +410,7 @@ ANN static m_bool _emit_symbol(const Emitter emit, const Symbol *data) {
     regpushi(emit, (m_uint)actual_type(emit->gwion, v->type));
     return GW_OK;
   }
-  if(vflag(v, vflag_builtin) || vflag(v, vflag_direct) || vflag(v, vflag_enum))
+  if(vflag(v, vflag_builtin) || vflag(v, vflag_direct))
     return emit_symbol_builtin(emit, data);
   if(!strncmp(v->type->name, "@Foreach:[", 10)) {
     if(exp_getvar(exp_self(prim_self(data)))) {
index a528cf644b53c103c717cc8e2256b88e3d355501..247cc17f1ed16cbbedcc3e7b4fdf8738dfba57ba 100644 (file)
@@ -13,8 +13,8 @@ ANN void nspc_commit(const Nspc nspc) {
 }
 
 ANN static inline void nspc_release_object(const Nspc a, Value value, Gwion gwion) {
-  if(!vflag(value, vflag_union) && ((GET_FLAG(value, static) && a->info->class_data) ||
-    (value->d.ptr && vflag(value, vflag_builtin)))) {
+  if((GET_FLAG(value, static) && a->info->class_data) ||
+    (value->d.ptr && vflag(value, vflag_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);
@@ -22,7 +22,7 @@ ANN static inline void nspc_release_object(const Nspc a, Value value, Gwion gwio
 }
 
 ANN2(1,3) static inline void nspc_release_struct(const Nspc a, Value value, Gwion gwion) {
-  if(value && !vflag(value, vflag_union) && ((GET_FLAG(value, static) && a->info->class_data) ||
+  if(value && ((GET_FLAG(value, static) && a->info->class_data) ||
     (vflag(value, vflag_builtin) && value->d.ptr))) {
     const m_bit *ptr = (value && value->d.ptr) ? (m_bit*)value->d.ptr:
         (m_bit*)(a->info->class_data + value->from->offset);
index 1459b04d74ac598deddbdb2e5947044333bd43b1..f7ab81ac888ff884651ef1012dd5f5e2b9149955 100644 (file)
@@ -72,19 +72,8 @@ ANN void __release(const M_Object o, const VM_Shred shred) {
       struct scope_iter iter = { t->nspc->info->value, 0, 0 };\
       Value v;
       while(scope_iter(&iter, &v) > 0) {
-        if(!GET_FLAG(v, static) && !vflag(v, vflag_union) &&
-            isa(v->type, shred->info->vm->gwion->type[et_object]) > 0)
-          release(*(M_Object*)(o->data + v->from->offset), shred);
-        else if(tflag(v->type, tflag_struct) &&
-              !GET_FLAG(v, static) && !vflag(v, vflag_union) && v->type->info->tuple) {
-          const TupleForm tf = v->type->info->tuple;
-          for(m_uint i = 0; i < vector_size(&tf->types); ++i) {
-            const m_bit *data = o->data + v->from->offset;
-            const Type t = (Type)vector_at(&tf->types, i);
-            if(isa(t, shred->info->vm->gwion->type[et_object]) > 0)
-              release(*(M_Object*)(data + vector_at(&tf->offset, i)), shred);
-          }
-        }
+        if(!GET_FLAG(v, static) && isa(v->type, shred->info->vm->gwion->type[et_compound]) > 0)
+          compound_release(shred, v->type, o->data + v->from->offset);
       }
     }
     if(tflag(t, tflag_dtor) && t->nspc->dtor) {
index a5766604be574789551bf80bdb75bab382e80b94..5625bef6ef225454cdd9ff34871fd1f0837bd7c3 100644 (file)
@@ -324,10 +324,10 @@ ANN m_bool scan1_enum_def(const Env env, const Enum_Def edef) {
       SET_FLAG(v, static);
       SET_ACCESS(edef, v)
       SET_ACCESS(edef, edef->t)
-    }
+    } else
+      set_vflag(v, vflag_builtin);
     SET_FLAG(v, const);
     set_vflag(v, vflag_valid);
-    set_vflag(v, vflag_enum);
     nspc_add_value(edef->t->info->owner, list->xid, v);
     vector_add(&edef->values, (vtype)v);
   } while((list = list->next));