]> Nishi Git Mirror - gwion.git/commitdiff
:art: Imrove check_udef
authorfennecdjay <astor.jeremie@wanadoo.fr>
Fri, 20 Sep 2019 23:12:18 +0000 (01:12 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Fri, 20 Sep 2019 23:12:18 +0000 (01:12 +0200)
ast
src/lib/func.c
src/parse/check.c

diff --git a/ast b/ast
index 0a0c0d67d0ccfd81b1011e917e031a364fc07d6f..a25da541f1e646470e82fe562925d27c828e5e2b 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit 0a0c0d67d0ccfd81b1011e917e031a364fc07d6f
+Subproject commit a25da541f1e646470e82fe562925d27c828e5e2b
index 24c31a82316c2f1ae3f6b0c3c51b405b52f0cb2a..5b939e3affe11ccbe41f86383f8dbb162129af2f 100644 (file)
@@ -238,7 +238,7 @@ static OP_EMIT(opem_fptr_cast) {
   if(GET_FLAG(cast->exp->type->e->d.func, member) &&
     !(GET_FLAG(cast->exp->type, nonnull) || GET_FLAG(exp_self(cast)->type, nonnull)))
     member_fptr(emit);
-  return (Instr)GW_OK;// ???
+  return (Instr)GW_OK;
 }
 
 static OP_CHECK(opck_fptr_impl) {
index d60921333843ee034a0ef80e99cd445482552c2f..ce43b6a93331787678058123194462ef0d80cbab 100644 (file)
@@ -1117,9 +1117,22 @@ ANN static m_bool check_stmt_jump(const Env env, const Stmt_Jump stmt) {
   return GW_OK;
 }
 
-ANN m_bool check_union_def(const Env env, const Union_Def udef) {
-  if(tmpl_base(udef->tmpl)) // there's a func for this
-    return GW_OK;
+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, t_object) > 0) {
+      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));
+  return GW_OK;
+}
+
+ANN void check_udef(const Env env, const Union_Def udef) {
   if(udef->xid) {
     if(env->class_def)
       (!GET_FLAG(udef, static) ? decl_member : decl_static)(env, udef->value);
@@ -1131,20 +1144,15 @@ ANN m_bool check_union_def(const Env env, const Union_Def udef) {
       env->class_def->nspc->info->class_data_size += SZ_INT;
     }
   }
+}
+ANN m_bool check_union_def(const Env env, const Union_Def udef) {
+  if(tmpl_base(udef->tmpl)) // there's a func for this
+    return GW_OK;
+  check_udef(env, udef);
   const m_uint scope = union_push(env, udef);
-  Decl_List l = udef->l;
-  do {
-    CHECK_OB(check_exp(env, l->self))
-    if(isa(l->self->type, t_object) > 0) {
-      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));
+  const m_bool ret = check_union_decl(env, udef);
   union_pop(env, udef, scope);
-  return GW_OK;
+  return ret;
 }
 
 ANN static m_bool check_stmt_exp(const Env env, const Stmt_Exp stmt) {