]> Nishi Git Mirror - gwion.git/commitdiff
:art: Optimize Class_Def body
authorJérémie Astor <fennecdjay@gmail.com>
Thu, 13 May 2021 12:36:33 +0000 (14:36 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Thu, 13 May 2021 12:36:33 +0000 (14:36 +0200)
src/parse/check.c

index 1f4ed77cafb4f67714c3f02a620282a50211282f..6de80a08c011d56a4fcb72bf6153963717e7fb40 100644 (file)
@@ -1581,6 +1581,36 @@ ANN static m_bool check_body(const Env env, Section *const section) {
   return ret;
 }
 
+ANN static bool class_def_has_body(Ast ast) {
+  do {
+    const Section *section = ast->section;
+    if(section->section_type == ae_section_stmt) {
+      Stmt_List list = section->d.stmt_list;
+      do {
+        const Stmt stmt = list->stmt;
+        if(stmt->stmt_type == ae_stmt_pp)
+          continue;
+        if(stmt->stmt_type == ae_stmt_exp) {
+          const Exp exp = stmt->d.stmt_exp.val;
+          if(!exp)
+            continue;
+          if(exp->exp_type != ae_exp_decl)
+            return true;
+          if(GET_FLAG(exp->d.exp_decl.td, late))
+            continue;
+          Var_Decl_List dlist = exp->d.exp_decl.list;
+          do {
+            if(tflag(dlist->self->value->type, tflag_ctor))
+              return true;
+          } while((dlist = dlist->next));
+        } else
+          return true;
+      } while((list = list->next));
+    }
+  } while((ast = ast->next));
+  return false;
+}
+
 ANN static m_bool _check_class_def(const Env env, const Class_Def cdef) {
   const Type t = cdef->base.type;
   if(cdef->base.ext)
@@ -1589,7 +1619,8 @@ ANN static m_bool _check_class_def(const Env env, const Class_Def cdef) {
     inherit(t);
   if(cdef->body) {
     CHECK_BB(env_body(env, cdef, check_body));
-    set_tflag(t, tflag_ctor);
+    if(class_def_has_body(cdef->body))
+      set_tflag(t, tflag_ctor);
   }
   if(!GET_FLAG(cdef, abstract))
     CHECK_BB(check_abstract(env, cdef));