]> Nishi Git Mirror - gwion.git/commitdiff
:art: Introduce array_base_simple
authorJérémie Astor <fennecdjay@gmail.com>
Wed, 11 Aug 2021 06:47:54 +0000 (08:47 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Wed, 11 Aug 2021 06:47:54 +0000 (08:47 +0200)
include/env/type.h
src/env/type.c
src/lib/array.c

index 7806a0aec61426117d07eef1e9ba1297794f0f05..288cba6eb4eb9301461b41d7d01d37b5b8dda46f 100644 (file)
@@ -64,6 +64,11 @@ ANN Type      array_type(const Env, const Type, const m_uint);
 ANN Type      find_common_anc(const Type, const Type) __attribute__((pure));
 ANN Type      typedef_base(Type) __attribute__((pure));
 ANN Type      array_base(Type) __attribute__((pure));
+ANN Symbol array_sym(const Env env, const Type src,
+                                 const m_uint depth);
+ANN static inline Type array_base_simple(Type t) {
+  return t->array_depth ? t->info->base_type : t;
+}
 ANN m_bool    type_ref(Type) __attribute__((pure));
 ANN Type      actual_type(const struct Gwion_ *gwion, const Type t);
 ANN static inline m_uint env_push_type(const Env env, const Type type) {
index 1c794a807b8bf50c60f9dcb47a9bf32ce14bd174..b5e9ff9939de3f197d18ac254e71d64c67ec2e17 100644 (file)
@@ -79,7 +79,7 @@ ANN /*static */ Symbol array_sym(const Env env, const Type src,
                                  const m_uint depth) {
   if (src->array_depth == depth) return insert_symbol(src->name);
   const m_uint total_depth = src->array_depth + depth;
-  const Type   t           = array_base(src);
+  const Type   t           = array_base_simple(src);
   size_t       len         = strlen(t->name);
   char         name[len + 2 * total_depth + 1];
   strcpy(name, t->name);
index 2f2f103c849b39d0565b40b06abab706561df91e..19290677712d281155970284e27c64ba5ba994b6 100644 (file)
@@ -627,8 +627,6 @@ static MFUN(vm_vector_foldr) {
     memcpy((m_bit *)RETURN, MEM(SZ_INT * 2), acc_sz);
 }
 
-ANN /*static */ Symbol array_sym(const Env env, const Type src,
-                                 const m_uint depth);
 #include "template.h"
 static OP_CHECK(opck_array_scan) {
   struct TemplateScan *ts      = (struct TemplateScan *)data;
@@ -654,7 +652,7 @@ static OP_CHECK(opck_array_scan) {
     env_set_error(env);
     return env->gwion->type[et_error];
   }
-  const Symbol sym  = array_sym(env, array_base(base), base->array_depth + 1);
+  const Symbol sym  = array_sym(env, array_base_simple(base), base->array_depth + 1);
   const Type   type = nspc_lookup_type1(base->info->value->from->owner, sym);
   if (type) return type;
   const Class_Def cdef  = cpy_class_def(env->gwion->mp, c);