]> Nishi Git Mirror - gwion.git/commitdiff
:art: Get rid of type->xid
authorJérémie Astor <fennecdjay@gmail.com>
Sat, 5 Dec 2020 12:34:47 +0000 (13:34 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Sat, 5 Dec 2020 12:37:11 +0000 (13:37 +0100)
include/env/type.h
include/import/type.h
src/env/env.c
src/env/type.c
src/import/import_cdef.c
src/import/import_type.c
src/lib/array.c
src/lib/object_op.c
src/parse/operator.c
src/parse/scan0.c
src/parse/scan2.c

index 4a37b66977fe6ebabfffe9bbdb0a08e5e8fa47fa..21811c0b2f5cf9aed88668fb9763df1c7adfef0f 100644 (file)
@@ -43,7 +43,6 @@ struct Type_ {
   m_str     name;
   Nspc      nspc;
   struct TypeInfo_ *info;
-  size_t xid;
   size_t size;
   size_t array_depth;
   uint16_t ref;
@@ -54,7 +53,7 @@ struct Type_ {
 REF_FUNC(Type, type)
 FLAG_FUNC(Type, t)
 
-ANN2(1,3) ANEW Type new_type(MemPool, const m_uint xid, const m_str name, const Type);
+ANN2(1,2) ANEW Type new_type(MemPool, const m_str name, const Type);
 ANEW ANN Type type_copy(MemPool, const Type type);
 ANN m_str get_type_name(const Env, const Type t, const m_uint);
 ANN Value find_value(const Type, const Symbol);
index a3b04adffdb2bf73071e0aa5f0f8405541469b5d..814a58a411d6dea092fe989a558755fa9dfb8e6b 100644 (file)
@@ -2,7 +2,7 @@
 #define __IMPORT_TYPE
 
 ANN2(1,2) ANEW Type gwi_mk_type(const Gwi, const m_str, const m_uint, const m_str);
-ANN m_int gwi_add_type(const Gwi gwi, Type type);
-ANN m_int gwi_set_global_type(const Gwi gwi, const Type type, const type_enum te);
+ANN void gwi_add_type(const Gwi gwi, Type type);
+ANN void gwi_set_global_type(const Gwi gwi, const Type type, const type_enum te);
 
 #endif
index 122dee712b31fdd40c946f0fe52be5f53e286d28..b7dc1e95bd39b70e29ecdb6668cbe1969dd99b24 100644 (file)
@@ -92,7 +92,6 @@ ANN void env_add_type(const Env env, const Type type) {
   SET_FLAG(v, global);
   set_vflag(v, vflag_builtin);
   set_tflag(type, tflag_scan0 | tflag_scan1 | tflag_scan2 | tflag_check | tflag_emit);
-  type->xid = ++env->scope->type_xid;
 }
 
 ANN m_bool type_engine_check_prog(const Env env, const Ast ast) {
index 24ae4ce484d4da8df73bc90fb55eaad772b61ea5..73dbd1c081bdfb882cd832072fa8ab1c8fe1469e 100644 (file)
@@ -28,9 +28,8 @@ ANN void free_type(const Type a, struct Gwion_ *const gwion) {
 
 }
 
-Type new_type(MemPool p, const m_uint xid, const m_str name, const Type parent) {
+Type new_type(MemPool p, const m_str name, const Type parent) {
   const Type type = mp_calloc(p, Type);
-  type->xid  = xid;
   type->name = name;
   type->info = mp_calloc(p, TypeInfo);
   type->info->parent = parent;
@@ -41,7 +40,7 @@ Type new_type(MemPool p, const m_uint xid, const m_str name, const Type parent)
 }
 
 ANN Type type_copy(MemPool p, const Type type) {
-  const Type a = new_type(p, type->xid, type->name, type->info->parent);
+  const Type a = new_type(p, type->name, type->info->parent);
   a->nspc           = type->nspc;
   a->info->owner       = type->info->owner;
   a->info->owner_class = type->info->owner_class;
@@ -53,7 +52,7 @@ ANN Type type_copy(MemPool p, const Type type) {
 }
 
 ANN m_bool isa(const restrict Type var, const restrict Type parent) {
-  return (var->xid == parent->xid) ? GW_OK : var->info->parent ? isa(var->info->parent, parent) : GW_ERROR;
+  return (var == parent) ? GW_OK : var->info->parent ? isa(var->info->parent, parent) : GW_ERROR;
 }
 
 ANN Type find_common_anc(const restrict Type lhs, const restrict Type rhs) {
@@ -100,8 +99,7 @@ ANN Type array_type(const Env env, const Type src, const m_uint depth) {
   const Type type = nspc_lookup_type1(src->info->owner, sym);
   if(type)
     return type;
-  const Type t = new_type(env->gwion->mp, ++env->scope->type_xid,
-      s_name(sym), env->gwion->type[et_array]);
+  const Type t = new_type(env->gwion->mp, s_name(sym), env->gwion->type[et_array]);
   t->array_depth = depth + src->array_depth;
   t->info->base_type = array_base(src) ?: src;
   t->info->owner = src->info->owner;
index f71cf098f637838a4a133e8c14c74745c5174564..cdb73487b6e1df450ab052329f751d656716714a 100644 (file)
@@ -80,7 +80,7 @@ ANN2(1,2) Type gwi_class_ini(const Gwi gwi, const m_str name, const m_str parent
   if(tmpl)
     nspc_pop_type(gwi->gwion->mp, gwi->gwion->env->curr);
   CHECK_OO(p)
-  const Type t = new_type(gwi->gwion->mp, ++gwi->gwion->env->scope->type_xid, s_name(ck.sym), p);
+  const Type t = new_type(gwi->gwion->mp, s_name(ck.sym), p);
   t->info->cdef = new_class_def(gwi->gwion->mp, 0, ck.sym, td, NULL, loc(gwi));
   t->info->cdef->base.tmpl = tmpl;
   t->info->cdef->base.type = t;
@@ -98,7 +98,7 @@ ANN2(1,2) Type gwi_class_ini(const Gwi gwi, const m_str name, const m_str parent
 ANN Type gwi_struct_ini(const Gwi gwi, const m_str name) {
   struct ImportCK ck = { .name=name };
   CHECK_BO(check_typename_def(gwi, &ck))
-  const Type t = new_type(gwi->gwion->mp, ++gwi->gwion->env->scope->type_xid, s_name(ck.sym), gwi->gwion->type[et_compound]);
+  const Type t = new_type(gwi->gwion->mp, s_name(ck.sym), gwi->gwion->type[et_compound]);
   set_tflag(t, tflag_struct);
   if(!ck.tmpl)
     gwi_type_flag(t);
index d5a6424459f1a8b6669e9991bfcbd8247cf243aa..44e58ac8ac54d04b4d92b06df1fc8e331c7a985b 100644 (file)
@@ -32,17 +32,16 @@ ANN2(1) static Type get_parent(const Gwi gwi, const m_str parent_name) {
 ANN2(1,2) Type gwi_mk_type(const Gwi gwi, const m_str name, const m_uint size, const m_str parent_name) {
   CHECK_OO(gwi_str2sym(gwi, name))
   const Type parent = get_parent(gwi, parent_name);
-  const Type t = new_type(gwi->gwion->mp, 0, name, parent);
+  const Type t = new_type(gwi->gwion->mp, name, parent);
   t->size = size;
   return t;
 }
 
-ANN m_int gwi_add_type(const Gwi gwi, const Type type) {
-  env_add_type(gwi->gwion->env, type);
-  return (m_int)type->xid;
+ANN void gwi_add_type(const Gwi gwi, const Type type) {
+  return env_add_type(gwi->gwion->env, type);
 }
 
-ANN m_int gwi_set_global_type(const Gwi gwi, const Type type, const type_enum te) {
+ANN void gwi_set_global_type(const Gwi gwi, const Type type, const type_enum te) {
   gwi->gwion->type[te] = type;
-  return gwi_add_type(gwi, type);
+  gwi_add_type(gwi, type);
 }
index 1d8c30d6901dc73085168a35c56a6192cb187fa0..1064d31e49e18cfb675772bdfd5c16a837e844e2 100644 (file)
@@ -173,7 +173,7 @@ ANN static Type check_array_shift(const Env env,
   if(a->info->type == env->gwion->type[et_null] &&
       b->info->type->array_depth > 1)
     return a->info->type;
-    ARRAY_OPCK(a, b, pos)
+  ARRAY_OPCK(a, b, pos)
   if(a->info->type->array_depth == b->info->type->array_depth + 1)
     return a->info->type;
   else if(a->info->type->array_depth == b->info->type->array_depth)
@@ -325,11 +325,11 @@ static OP_CHECK(opck_array) {
   Exp e = array->exp;
   do CHECK_BO(check_implicit(env, e, t_int))
   while((e = e->next));
-  const Type t = array->type;
+  const Type t = array->type->array_depth ? array->type : typedef_base(array->type);
   if(t->array_depth >= array->depth)
     return array_type(env, array_base(t), t->array_depth - array->depth);
-  const Exp curr = take_exp(array->exp, array->type->array_depth);
-  struct Array_Sub_ next = { curr->next, array_base(array->type), array->depth - array->type->array_depth };
+  const Exp curr = take_exp(array->exp, t->array_depth);
+  struct Array_Sub_ next = { curr->next, array_base(t), array->depth - t->array_depth };
   return check_array_access(env, &next);
 }
 
index 343a154ca751ea48c4c215b58fbe6f68a8ad2db6..14fb911f1dc9e9d5f0c5bb4f17abd718dd403387 100644 (file)
@@ -35,12 +35,12 @@ static inline m_bool nonnull_check(const Type l, const Type r) {
   return !tflag(l, tflag_nonnull) && tflag(r, tflag_nonnull);
 }
 
-static inline Type check_nonnull(const Env env, const Type l, const Type r,
+ANN static inline Type check_nonnull(const Env env, const Type l, const Type r,
       const m_str action, const loc_t pos) {
   if(tflag(r, tflag_nonnull)) {
     if(isa(l, env->gwion->type[et_null]) > 0)
       ERR_N(pos, _("can't %s '%s' to '%s'"), action, l->name, r->name);
-    if(isa(l, r) < 0)
+    if(isa(l, unflag_type(r)) < 0)
       ERR_N(pos, _("can't %s '%s' to '%s'"), action, l->name, r->name);
     return r->info->parent;
   }
index ade5cbdb0ff4643e641e36dc0ae746cc5165030c..b9c6cff5f2d7e724c8cd99db521474372dee32af 100644 (file)
@@ -49,10 +49,9 @@ ANN static Type op_parent(const Env env, const Type t) {
 static m_bool op_match(const restrict Type t, const restrict Type mo) {
   if(t == OP_ANY_TYPE || mo == OP_ANY_TYPE)
     return GW_OK;
-  Type type = t;
-  if((type && mo && mo->xid == type->xid) || (!type && !mo))
-    return GW_OK;
-  return 0;
+  if(t && mo)
+    return unflag_type(t) == unflag_type(mo);
+  return t == mo;
 }
 
 ANN2(1) static M_Operator* operator_find(const Vector v, const restrict Type lhs, const restrict Type rhs) {
@@ -66,18 +65,10 @@ ANN2(1) static M_Operator* operator_find(const Vector v, const restrict Type lhs
   return NULL;
 }
 
-static m_bool op_match2(const restrict Type t, const restrict Type mo) {
-//  if(t == OP_ANY_TYPE || mo == OP_ANY_TYPE)
-//    return GW_OK;
-  if((t && mo && (t != OP_ANY_TYPE && mo != OP_ANY_TYPE && mo->xid == t->xid)) || (!t && !mo))
-    return GW_OK;
-  return 0;
-}
-
 ANN2(1) static M_Operator* operator_find2(const Vector v, const restrict Type lhs, const restrict Type rhs) {
   for(m_uint i = vector_size(v) + 1; --i;) {
     M_Operator* mo = (M_Operator*)vector_at(v, i - 1);
-    if(op_match2(lhs, mo->lhs) && op_match2(rhs, mo->rhs))
+    if(lhs == mo->lhs && rhs == mo->rhs)
       return mo;
   }
   return NULL;
@@ -87,7 +78,7 @@ ANN void operator_suspend(const Nspc n, struct Op_Import *opi) {
   const Vector v = (Vector)map_get(&n->info->op_map, (vtype)opi->op);
   for(m_uint i = vector_size(v) + 1; --i;) {
     M_Operator* mo = (M_Operator*)vector_at(v, i - 1);
-    if(op_match2(opi->lhs, mo->lhs) && op_match2(opi->rhs, mo->rhs)) {
+    if(opi->lhs == mo->lhs && opi->rhs == mo->rhs) {
       opi->data = (uintptr_t)mo;
       opi->ret = (Type)&VPTR(v, i-1);
       VPTR(v, i-1) = 0;
index ea84c0a16aad2aa4f033166bdca25509ca737301..5c5b3eea6d2e91425f992f1c008a63b9d71417dc 100644 (file)
@@ -20,9 +20,8 @@ static inline void context_global(const Env env) {
     env->context->global = 1;
 }
 
-static inline Type scan0_type(const Env env, const m_uint xid,
-    const m_str name, const Type t) {
-  const Type type = new_type(env->gwion->mp, xid, name, t);
+static inline Type scan0_type(const Env env, const m_str name, const Type t) {
+  const Type type = new_type(env->gwion->mp, name, t);
   type->info->ctx = env->context;
   return type;
 }
@@ -68,7 +67,7 @@ ANN m_bool scan0_fptr_def(const Env env, const Fptr_Def fptr) {
   CHECK_BB(env_access(env, fptr->base->flag, td_pos(fptr->base->td)))
   CHECK_BB(scan0_defined(env, fptr->base->xid, td_pos(fptr->base->td)));
   const m_str name = s_name(fptr->base->xid);
-  const Type t = scan0_type(env, env->gwion->type[et_fptr]->xid, name, env->gwion->type[et_fptr]);
+  const Type t = scan0_type(env, name, env->gwion->type[et_fptr]);
   t->info->owner = !(!env->class_def && GET_FLAG(fptr->base, global)) ?
     env->curr : env->global_nspc;
   t->info->owner_class = env->class_def;
@@ -112,7 +111,7 @@ ANN static void scan0_implicit_similar(const Env env, const Type lhs, const Type
 }
 
 ANN static void typedef_simple(const Env env, const Type_Def tdef, const Type base) {
-  const Type t = scan0_type(env, ++env->scope->type_xid, s_name(tdef->xid), base);
+  const Type t = scan0_type(env, s_name(tdef->xid), base);
   t->size = base->size;
   const Nspc nspc = (!env->class_def && GET_FLAG(tdef->ext, global)) ?
   env->global_nspc : env->curr;
@@ -182,7 +181,6 @@ ANN static Symbol scan0_sym(const Env env, const m_str name, const loc_t pos) {
 
 ANN static Type enum_type(const Env env, const Enum_Def edef) {
   const Type t = type_copy(env->gwion->mp, env->gwion->type[et_int]);
-  t->xid = ++env->scope->type_xid;
   const Symbol sym = scan0_sym(env, "enum", edef->pos);
   t->name = edef->xid ? s_name(edef->xid) : s_name(sym);
   t->info->parent = env->gwion->type[et_int];
@@ -214,7 +212,6 @@ ANN m_bool scan0_enum_def(const Env env, const Enum_Def edef) {
 ANN static Type union_type(const Env env, const Symbol s, const m_bool add) {
   const m_str name = s_name(s);
   const Type t = type_copy(env->gwion->mp, env->gwion->type[et_union]);
-  t->xid = ++env->scope->type_xid;
   t->name = name;
   t->nspc = new_nspc(env->gwion->mp, name);
   t->info->owner = t->nspc->parent = env->curr;
@@ -335,7 +332,7 @@ ANN static Type scan0_class_def_init(const Env env, const Class_Def cdef) {
   const Type parent = get_parent(env, cdef);
   if(parent == (Type)GW_ERROR)
     return NULL;
-  const Type t = scan0_type(env, ++env->scope->type_xid, s_name(cdef->base.xid), parent);
+  const Type t = scan0_type(env, s_name(cdef->base.xid), parent);
   if(cflag(cdef, cflag_struct))
     set_tflag(t, tflag_struct);
   t->info->tuple = new_tupleform(env->gwion->mp, parent);
index c7d63c712e87734babed8b8bc9f6baf5fe8f8be9..4c17b75a6c8f9fb12f514f3444883fce0d46fadd 100644 (file)
@@ -325,7 +325,6 @@ ANN static Func scan_new_func(const Env env, const Func_Def f, const m_str name)
 ANN static Type func_type(const Env env, const Func func) {
   const Type base = env->gwion->type[!fbflag(func->def->base, fbflag_lambda) ? et_function : et_lambda];
   const Type t = type_copy(env->gwion->mp, base);
-  t->xid = ++env->scope->type_xid;
   t->info->parent = base;
   t->name = func->name;
   t->info->owner = env->curr;