]> Nishi Git Mirror - gwion.git/commitdiff
:art: USe Enum name as array size
authorJérémie Astor <fennecdjay@gmail.com>
Sun, 1 May 2022 10:21:12 +0000 (12:21 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Sun, 1 May 2022 10:21:12 +0000 (12:21 +0200)
include/env/type.h
src/lib/lib_class.c
src/parse/scan0.c

index 5a30a69ffbe74474d5c6a856499381804c5bae6c..33d05a0e5c904d5f18c53e4453b93fefaee86424 100644 (file)
@@ -38,8 +38,9 @@ enum tflag {
   tflag_contract = 1 << 19,
   tflag_float    = 1 << 20,
   tflag_union    = 1 << 21,
-  tflag_error    = 1 << 22,
-  tflag_ref      = 1 << 23,
+  tflag_enum     = 1 << 22,
+  tflag_error    = 1 << 23,
+  tflag_ref      = 1 << 24,
 } __attribute__((packed));
 
 struct Type_ {
index 55f337dabb7c505b0b708a43dc458c6d5db32d9c..783c93f4c4c714c3e961a7e87bc58647833d7ca0 100644 (file)
@@ -38,6 +38,21 @@ static OP_CHECK(opck_basic_ctor) {
   ERR_N(call->func->pos, _("can't call a non-callable value"));
 }
 
+static OP_EMIT(opem_implicit_class) {
+  struct Implicit *imp = (struct Implicit*)data;
+  const Type t = actual_type(emit->gwion, imp->e->type);
+  const Instr instr = emit_add_instr(emit, RegPushImm);
+  instr->m_val = map_size(&t->nspc->info->value->map);
+  return GW_OK; emit_exp(emit, imp->e);
+}
+
+static OP_CHECK(opck_implicit_class) {
+  struct Implicit *imp = (struct Implicit*)data;
+  const Type t = actual_type(env->gwion, imp->e->type);
+  if(tflag(t, tflag_enum)) return env->gwion->type[et_int];
+  return env->gwion->type[et_error];
+}
+
 GWION_IMPORT(class) {
 
   gwidoc(gwi, "Operators class types.");
@@ -59,5 +74,11 @@ GWION_IMPORT(class) {
   GWI_BB(gwi_oper_add(gwi, opck_basic_ctor))
   GWI_BB(gwi_oper_end(gwi, "@ctor", NULL))
 
+  gwidoc(gwi, "Allow enum for array size");
+  GWI_BB(gwi_oper_ini(gwi, "Class", "int", NULL))
+  GWI_BB(gwi_oper_add(gwi, opck_implicit_class))
+  GWI_BB(gwi_oper_emi(gwi, opem_implicit_class))
+  GWI_BB(gwi_oper_end(gwi, "@implicit", NULL))
+
   return GW_OK;
 }
index a0d9faf4a088acfbb1f2cd2f92e01d48fd2a2b1a..518ebbd64a03e55182c773610c37af5984578f90 100644 (file)
@@ -232,6 +232,7 @@ ANN static Type enum_type(const Env env, const Enum_Def edef) {
   }
   add_type(env, env->curr, t);
   mk_class(env, t, edef->pos);
+  set_tflag(t, tflag_enum);
   if (global) env_pop(env, 0);
 //  scan0_implicit_similar(env, t, env->gwion->type[et_int]);
 //  scan0_implicit_similar(env, env->gwion->type[et_int], t);