]> Nishi Git Mirror - gwion.git/commitdiff
:art: Scoped enums by default
authorJérémie Astor <fennecdjay@gmail.com>
Tue, 3 Aug 2021 19:56:56 +0000 (21:56 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Tue, 3 Aug 2021 19:56:56 +0000 (21:56 +0200)
ast
examples/class_enum.gw
src/emit/emit.c
src/lib/prim.c
src/parse/check.c
src/parse/scan1.c
tests/enum/class_scoped.gw
tests/enum/scoped.gw
tests/error/class_enum.gw
tests/tree/enum.gw

diff --git a/ast b/ast
index d1d23609b24dc2f754c2808bd23f13100edcc001..a4e4f7f5955fff6ebb05e90949a54c556dee964e 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit d1d23609b24dc2f754c2808bd23f13100edcc001
+Subproject commit a4e4f7f5955fff6ebb05e90949a54c556dee964e
index bd1eb29e799dcdc5b9b86e49351333209bf8255e..80d165af3cb3f9871bb0cb5796ad46b94fb6e7c6 100644 (file)
@@ -5,7 +5,7 @@ class C {
     two,
     three
   }
-  <<< zero, " ", one, " ", two, " ", three >>>;
+  <<< E.zero, " ", E.one, " ", E.two, " ", E.three >>>;
 }
 var C c;
 <<< c >>>;
index 2defb25da34ad8020f42c8349ee373a9f088a23f..3644477df1395e99b484b08b493f10ca3ab78e92 100644 (file)
@@ -2214,12 +2214,7 @@ ANN static m_bool emit_enum_def(const Emitter emit, const Enum_Def edef) {
   LOOP_OPTIM
   for (m_uint i = 0; i < vector_size(&edef->values); ++i) {
     const Value v = (Value)vector_at(&edef->values, i);
-    if(edef->is_scoped || emit->env->class_def)
-      *(m_uint *)(v->from->owner->info->class_data + v->from->offset) = i;
-    else {
-      v->from->offset = emit_local(emit, emit->gwion->type[et_int]);
-      v->d.num        = i;
-    }
+    *(m_uint *)(v->from->owner->info->class_data + v->from->offset) = i;
   }
   set_tflag(edef->t, tflag_emit);
   return GW_OK;
index eff1c19ebfb08ae440f63e8fcc25c93b922cb756..7edefbb099618edd84937c4c5ca7811518bd5b9b 100644 (file)
@@ -251,12 +251,13 @@ static GACK(gack_bool) {
 }
 
 static GWION_IMPORT(int_values) {
-  GWI_BB(gwi_enum_ini(gwi, "bool"))
-  GWI_BB(gwi_enum_add(gwi, "false", 0))
-  GWI_BB(gwi_enum_add(gwi, "true", 1))
-  const Type t_bool = gwi_enum_end(gwi);
+  DECL_OB(const Type, t_bool, = gwi_mk_type(gwi, "bool", SZ_INT, "int"));
+  GWI_BB(gwi_set_global_type(gwi, t_bool, et_bool))
   GWI_BB(gwi_gack(gwi, t_bool, gack_bool))
-  gwi->gwion->type[et_bool] = t_bool;
+  gwi_item_ini(gwi, "bool", "true");
+  gwi_item_end(gwi, ae_flag_const, num, 0);
+  gwi_item_ini(gwi, "bool", "false");
+  gwi_item_end(gwi, ae_flag_const, num, 1);
   GWI_BB(gwi_oper_ini(gwi, NULL, "int", "bool"))
   GWI_BB(gwi_oper_add(gwi, opck_unary_meta))
   GWI_BB(gwi_oper_add(gwi, opck_int_not))
index 0e2fff4c86febe2856c023cba11cc53c57899ed7..da633d90c748ed98810804d0fd177f24d3b9c2fb 100644 (file)
@@ -1095,18 +1095,12 @@ ANN Type check_exp(const Env env, const Exp exp) {
 }
 
 ANN m_bool check_enum_def(const Env env, const Enum_Def edef) {
-  const bool is_scoped = edef->is_scoped;
-  const m_uint scope = is_scoped ?
-    env_push_type(env, edef->t) : 0;
-  if (is_scoped || env->class_def) {
-    ID_List list = edef->list;
-    do decl_static(env, nspc_lookup_value0(env->curr, list->xid));
-    while ((list = list->next));
-  }
-  if (is_scoped) {
-    env_pop(env, scope);
-    nspc_allocdata(env->gwion->mp, edef->t->nspc);
-  }
+  const m_uint scope = env_push_type(env, edef->t);
+  ID_List list = edef->list;
+  do decl_static(env, nspc_lookup_value0(env->curr, list->xid));
+  while ((list = list->next));
+  env_pop(env, scope);
+  nspc_allocdata(env->gwion->mp, edef->t->nspc);
   return GW_OK;
 }
 
index c52241916ab0070b11ea871d89e91921cc8ccd04..5860ece36f4f9e2586e92f10dcf428fd013eaa35 100644 (file)
@@ -366,20 +366,11 @@ ANN static inline m_bool scan1_stmt_exp(const Env env, const Stmt_Exp stmt) {
 }
 
 ANN m_bool scan1_enum_def(const Env env, const Enum_Def edef) {
-  const m_bool is_scoped = edef->is_scoped;
-  if(is_scoped)
-    edef->t->nspc = new_nspc(env->gwion->mp, edef->t->name);
-  const Nspc nspc = is_scoped ?
-    edef->t->nspc : edef->t->info->value->from->owner;
-  const m_uint scope = is_scoped ?
-    env_push_type(env, edef->t) : 0;
+  edef->t->nspc = new_nspc(env->gwion->mp, edef->t->name);
+  const Nspc nspc = edef->t->nspc;
+  const m_uint scope = env_push_type(env, edef->t);
   ID_List list = edef->list;
   do {
-    if(!is_scoped) {
-      CHECK_BB(already_defined(env, list->xid, edef->pos));
-      if (nspc_lookup_value1(nspc, list->xid))
-        ERR_B(edef->pos, "'%s' already defined", s_name(list->xid));
-    }
     const Value v = new_value(env->gwion->mp, edef->t, s_name(list->xid));
     valuefrom(env, v->from, edef->pos);
     if (env->class_def) {
@@ -393,8 +384,7 @@ ANN m_bool scan1_enum_def(const Env env, const Enum_Def edef) {
     nspc_add_value(nspc, list->xid, v);
     vector_add(&edef->values, (vtype)v);
   } while ((list = list->next));
-  if(is_scoped)
-    env_pop(env, scope);
+  env_pop(env, scope);
   return GW_OK;
 }
 
index d0b7d194450582c27cdec2f7f6c98f2ff94707b3..14a7986c2349b2dc7c75df0fa4281eba22602ddf 100644 (file)
@@ -1,5 +1,5 @@
 class C {
-  enum MyEnum@ {
+  enum MyEnum {
     zero, one
   }
 }
index 4b4fcf7681dd974a15a61c2d348d6076f0714ad2..27174e3f904dccce59d740212a9fa42e917865fe 100644 (file)
@@ -1,5 +1,5 @@
 #! [contains] 1
-enum MyEnum@ {
+enum MyEnum {
   zero, one
 }
 
index 29970bf0601f8307665b7291005ee1535bbe699d..c4feaf4620921c0f660cb6694d3491a7e5846829 100644 (file)
@@ -4,6 +4,6 @@ class C
   enum E { a, b };
 }
 
-C.a;
-<<< C.a >>>;
-<<< --C.a >>>;
+C.E.a;
+<<< C.E.a >>>;
+<<< --C.E.a >>>;
index 4c29fd9e56d32d4bf3624d34686619f638b8d17b..9a96920f903b674ac5297b2e4498619247d7f925 100644 (file)
@@ -1,4 +1,4 @@
 enum E {
   zero, one, two, three
 };
-<<< zero, " ", one, " ", two, " ", three >>>;
+<<< E.zero, " ", E.one, " ", E.two, " ", E.three >>>;