]> Nishi Git Mirror - gwion.git/commitdiff
:art: Implicitly cast int to enum
authorfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 24 Sep 2019 17:20:11 +0000 (19:20 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 24 Sep 2019 17:20:11 +0000 (19:20 +0200)
include/type.h
src/lib/prim.c
src/oo/type.c
src/parse/scan0.c
tests/import/enum.c

index e55834ac29e1ae26fff267c3d5dde778378739b2..e69aa5000d57a90386c85019d705cb758ccc1711 100644 (file)
@@ -24,7 +24,7 @@ struct Type_ {
   ae_flag flag;
 };
 
-extern Type t_void, t_int, t_bool, t_float, t_dur, t_time, t_now, t_complex, t_polar, t_vec3, t_vec4,
+extern Type t_void, t_int, t_enum, t_bool, t_float, t_dur, t_time, t_now, t_complex, t_polar, t_vec3, t_vec4,
   t_null, t_object, t_shred, t_fork, t_event, t_ugen, t_string, t_ptr, t_array, t_gack,
   t_function, t_fptr, t_varloop, t_vararg, t_lambda, t_class, t_union, t_undefined, t_auto, t_tuple;
 
index 295e6809fd66d72b7ff11a491ef0ae98d0487dc6..5d8607e85a3eb5ad58d928c4226f8203c6868f42 100644 (file)
@@ -58,6 +58,11 @@ static GWION_IMPORT(int_r) {
   return GW_OK;
 }
 
+static OP_CHECK(opck_i2enum) {
+  struct Implicit* imp = (struct Implicit*)data;
+  return imp->e->cast_to = imp->t;
+}
+
 static GWION_IMPORT(int_unary) {
   GWI_BB(gwi_oper_ini(gwi, NULL, "int", "int"))
   GWI_BB(gwi_oper_add(gwi,  opck_unary_meta))
@@ -74,13 +79,16 @@ static GWION_IMPORT(int_unary) {
   return GW_OK;
 }
 
-static GWION_IMPORT(int_values) {
+static GWION_IMPORT(bool) {
+  GWI_OB((t_enum = gwi_mk_type(gwi, "@enum", SZ_INT, t_int)))
+  GWI_BB(gwi_add_type(gwi, t_enum))
+  GWI_BB(gwi_oper_ini(gwi, "int", "@enum", NULL))
+  GWI_BB(gwi_oper_add(gwi, opck_i2enum))
+  GWI_BB(gwi_oper_end(gwi, "@implicit", NULL))
   GWI_BB(gwi_enum_ini(gwi, "bool"))
   GWI_BB(gwi_enum_add(gwi, "false", 0))
   GWI_BB(gwi_enum_add(gwi, "true", 1))
   t_bool = gwi_enum_end(gwi);
-//  GWI_BB(gwi_item_ini(gwi, "bool", "maybe"))
-//  GWI_BB(gwi_item_end(gwi, 0, NULL))
   gwi_reserve(gwi, "maybe");
   struct SpecialId_ spid = { .type=t_bool, .exec=RegPushMaybe, .is_const=1 };
   gwi_specialid(gwi, "maybe", &spid);
@@ -93,8 +101,7 @@ static GWION_IMPORT(int) {
   GWI_BB(import_int_op(gwi))
   GWI_BB(import_int_logical(gwi))
   GWI_BB(import_int_r(gwi))
-  GWI_BB(import_int_unary(gwi))
-  return import_int_values(gwi);
+  return import_int_unary(gwi);
 }
 
 static GWION_IMPORT(values) {
@@ -133,12 +140,7 @@ static GWION_IMPORT(values) {
   gwi_specialid(gwi, "now", &spid);
   return GW_OK;
 }
-/*
-static OP_CHECK(opck_chuck_now) {
-  Exp_Binary* bin = (Exp_Binary*)data;
-  ERR_N(exp_self(bin)->pos, _("can't assign 'now' to 'now'"))
-}
-*/
+
 static OP_CHECK(opck_implicit_f2i) {
   return t_null;
 }
@@ -292,5 +294,6 @@ GWION_IMPORT(prim) {
   GWI_BB(import_floatint(gwi))
   GWI_BB(import_dur(gwi))
   GWI_BB(import_time(gwi))
+  GWI_BB(import_bool(gwi))
   return import_values(gwi);
 }
index 418d0fb4682d5d498b5c52e2b05dd1a8276c0b56..681e7441ed5a585e7c2f768912f44cfd2fc68135 100644 (file)
@@ -44,7 +44,7 @@ Type new_type(MemPool p, const m_uint xid, const m_str name, const Type parent)
   type->name   = name;
   type->e = mp_calloc(p, TypeInfo);
   type->e->parent = parent;
-  if(type->e->parent) {
+  if(t_object && parent && isa(parent, t_object) > 0) {
     type->size = parent->size;
     type->e->tuple = new_tupleform(p);
   }
@@ -197,6 +197,6 @@ ANN m_uint get_depth(const Type type) {
   return depth;
 }
 
-Type t_void, t_int, t_bool, t_float, t_dur, t_time, t_now, t_complex, t_polar, t_vec3, t_vec4,
+Type t_void, t_int, t_enum, t_bool, t_float, t_dur, t_time, t_now, t_complex, t_polar, t_vec3, t_vec4,
   t_null, t_object, t_shred, t_fork, t_event, t_ugen, t_string, t_ptr, t_array, t_gack,
   t_function, t_fptr, t_varloop, t_vararg, t_lambda, t_class, t_union, t_undefined, t_auto, t_tuple;
index 6036a898f18fafd817e894160077466617867abc..c6cd9d1e88110c217e5845fc013e4a7d13019249 100644 (file)
@@ -150,10 +150,10 @@ ANN m_bool scan0_enum_def(const Env env, const Enum_Def edef) {
         s_name(edef->xid),  v->type->name)
     CHECK_BB(scan0_defined(env, edef->xid, edef->pos))
   }
-  const Type t = type_copy(env->gwion->mp, t_int);
+  const Type t = type_copy(env->gwion->mp, t_enum);
   t->xid = ++env->scope->type_xid;
   t->name = edef->xid ? s_name(edef->xid) : "int";
-  t->e->parent = t_int;
+  t->e->parent = t_enum;
   const Nspc nspc = GET_FLAG(edef, global) ? env->global_nspc : env->curr;
   t->e->owner = nspc;
   edef->t = t;
index 0804c25df05951cbea837ce642131b56ff26efe6..bdc84bbd188006f9275e1e4b4562dc9680874ce2 100644 (file)
@@ -38,8 +38,8 @@ GWION_IMPORT(enum_test) {
   CHECK_OB(gwi_enum_end(gwi))
 
   Type t_enum;
-  CHECK_OB((t_enum = gwi_mk_type(gwi, "Enum", 0, NULL)))
-  CHECK_BB(gwi_class_ini(gwi, t_enum, NULL, NULL))
+  CHECK_OB((t_myenum = gwi_mk_type(gwi, "Enum", 0, NULL)))
+  CHECK_BB(gwi_class_ini(gwi, t_myenum, NULL, NULL))
     CHECK_BB(gwi_enum_ini(gwi, 0))
       CHECK_BB(gwi_enum_add(gwi, "ENUM0", 0))
       CHECK_BB(gwi_enum_add(gwi, "ENUM1", 1))