]> Nishi Git Mirror - gwion.git/commitdiff
:art: check structs have smth to release
authorfennecdjay <fennecdjay@gmail.com>
Mon, 9 Jan 2023 23:32:25 +0000 (00:32 +0100)
committerfennecdjay <fennecdjay@gmail.com>
Mon, 9 Jan 2023 23:32:25 +0000 (00:32 +0100)
include/emit.h
include/env/tuple.h
include/env/type.h
src/emit/emit.c
src/parse/scan0.c
src/parse/scan1.c

index 6a540235c0fd892d0d97853dd14d5369d1d41388..4b373004d134c973742eb0b0fdba08e6d3496ddc 100644 (file)
@@ -84,11 +84,11 @@ ANN m_uint emit_local_exp(const Emitter emit, const Exp);
 ANN m_bool emit_exp_spork(const Emitter, const Exp_Unary *);
 ANN m_bool emit_exp(const Emitter, const Exp);
 
-ANN Instr emit_object_addref(const Emitter emit, const m_int size,
+ANN void emit_object_addref(const Emitter emit, const m_int size,
                              const bool emit_var);
-ANN Instr emit_struct_addref(const Emitter emit, const Type t, const m_int size,
+ANN void emit_struct_addref(const Emitter emit, const Type t, const m_int size,
                              const bool emit_var);
-ANN static inline Instr emit_compound_addref(const Emitter emit, const Type t,
+ANN static inline void emit_compound_addref(const Emitter emit, const Type t,
                                              const m_int  size,
                                              const m_bool emit_var) {
   return !tflag(t, tflag_struct) ? emit_object_addref(emit, size, emit_var)
index ea696b23623358a32bf18ea28a239dafe388ca3e..440fe1057b3d512402ae0ec4b3bd385f1f6cffc4 100644 (file)
@@ -8,14 +8,9 @@ struct TupleForm_ {
   uint64_t       start;
 };
 
-ANN Type tuple_type(const Env, const Vector, const loc_t);
 ANN void tuple_contains(const Env, const Value);
 ANN void tuple_info(const Env, const Value);
 ANN2(1) TupleForm new_tupleform(MemPool p, const Type parent_type);
 ANN void free_tupleform(const TupleForm tuple, const struct Gwion_ *gwion);
 
-#ifdef __INSTR
-INSTR(TupleCtor);
-INSTR(TupleMember);
-#endif
 #endif
index 6a1a6bba2c9397c889a225cc047d07fc0565f46e..d2cf0f41d14b4230a6fdc1bf8137fd5719f9902c 100644 (file)
@@ -42,6 +42,7 @@ enum tflag {
   tflag_ref      = 1 << 22,
   tflag_packed   = 1 << 23,
   tflag_compound = 1 << 24,
+  tflag_release  = 1 << 25, // mark structs that need release
 } __attribute__((packed));
 
 struct Type_ {
index 9ec0bad74285c9066506bceffca963ac182319db..7d7cb519256c932eb1c6b08f81844d94fc06045a 100644 (file)
@@ -139,7 +139,8 @@ ANN void emit_object_release(const Emitter emit, const m_uint offset) {
 ANN void emit_compound_release(const Emitter emit, const Type t, const m_uint offset) {
   if(tflag(t, tflag_compound))
     return emit_object_release(emit, offset);
-  emit_struct_release(emit, t, offset);
+  if(tflag(t, tflag_release))
+    emit_struct_release(emit, t, offset);
 }
 
 ANN void emit_struct_release(const Emitter emit, const Type type,
@@ -544,21 +545,20 @@ ANN static inline m_uint exp_totalsize(Exp e) {
   return size;
 }
 
-ANN Instr emit_object_addref(const Emitter emit, const m_int size,
+ANN void emit_object_addref(const Emitter emit, const m_int size,
                              const bool emit_var) {
   const f_instr exec  = !emit_var ? RegAddRef : RegAddRefAddr;
   const Instr   instr = emit_add_instr(emit, exec);
   instr->m_val        = size;
-  return instr;
 }
 
-ANN Instr emit_struct_addref(const Emitter emit, const Type t, const m_int size,
+ANN void emit_struct_addref(const Emitter emit, const Type t, const m_int size,
                              const bool emit_var) {
+  if(!tflag(t, tflag_release)) return;
   const Instr instr =
       emit_add_instr(emit, !emit_var ? StructRegAddRef : StructRegAddRefAddr);
   instr->m_val2  = (m_uint)t;
   instr->m_val = !emit_var ? size : (m_int)-SZ_INT;
-  return instr;
 }
 
 ANN2(1)
index 466d4c2015590064e4e8b0b08bcf84cb2a2a7036..a3546c612cc78234642789f1806252c1b0509a8a 100644 (file)
@@ -310,7 +310,7 @@ ANN static Type scan0_class_def_init(const Env env, const Class_Def cdef) {
   if (cflag(cdef, cflag_struct)) {
     t->size = 0;
     set_tflag(t, tflag_struct);
-  }
+  } else set_tflag(t, tflag_release);
   set_tflag(t, tflag_compound);
   t->info->tuple  = new_tupleform(env->gwion->mp, parent);
   t->nspc         = new_nspc(env->gwion->mp, t->name);
@@ -487,9 +487,11 @@ static OP_EMIT(opem_struct_assign) {
   const Type t = bin->lhs->type;
   const Exp e = exp_self(bin);
 
-  const Instr release = emit_add_instr(emit, StructReleaseRegAddr);
-  release->m_val = -SZ_INT;
-  release->m_val2 = (m_uint)t;
+  if(tflag(t, tflag_release)) {
+    const Instr release = emit_add_instr(emit, StructReleaseRegAddr);
+    release->m_val = -SZ_INT;
+    release->m_val2 = (m_uint)t;
+  }
 
   const Instr instr = emit_add_instr(emit, StructAssign);
   instr->m_val  = -t->size - SZ_INT;
index 10d86881defe44c66ece72babd3bb222da9fd5fb..b128801a1475d032362f1915ecdc81bae939214b 100644 (file)
@@ -130,6 +130,8 @@ ANN static m_bool scan1_decl(const Env env, Exp_Decl *const decl) {
       if (env->class_def->info->tuple) tuple_contains(env, v);
       if (!GET_FLAG(decl->td, static)) {
         set_vflag(v, vflag_member);
+        if(tflag(t, tflag_release))
+          set_tflag(env->class_def, tflag_release);
         if(isa(t, env->gwion->type[et_object]) > 0)
           set_vflag(v, vflag_release);
         if (tflag(env->class_def, tflag_struct)) {