]> Nishi Git Mirror - gwion.git/commitdiff
:art: More on array classes
authorJérémie Astor <fennecdjay@gmail.com>
Thu, 12 Aug 2021 11:35:00 +0000 (13:35 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Thu, 12 Aug 2021 11:35:00 +0000 (13:35 +0200)
src/emit/emit.c
src/parse/check.c
src/parse/operator.c
src/parse/scan1.c

index dbc95e48bc3ce987f07cc807ce17cda4052f9c63..7021c684cd92fead02b0ea538c618cab5d7c6ccf 100644 (file)
@@ -588,7 +588,7 @@ ANN static m_bool emit_prim_array(const Emitter emit, const Array_Sub *data) {
   regseti(emit, count);
   const Instr instr = emit_add_instr(emit, ArrayInit);
   instr->m_val      = (m_uint)type;
-  instr->m_val2     = array_base(type)->size;
+  instr->m_val2     = array_base_simple(type)->size;
   emit_gc(emit, -SZ_INT);
   emit_notpure(emit);
   return GW_OK;
index c2e3e5d37b1304379c1d70fff485b9e002808b67..ce7cf85940af58a30ea59fd1f5c5da6c3bdeb132 100644 (file)
@@ -198,7 +198,7 @@ ANN static inline Type prim_array_match(const Env env, Exp e) {
   do
     if (prim_array_inner(env, type, e, loc) < 0) err = true;
   while ((e = e->next));
-  if (!err) return array_type(env, array_base(type), type->array_depth + 1);
+  if (!err) return array_type(env, array_base_simple(type), type->array_depth + 1);
   env_set_error(env);
   return NULL;
 }
@@ -1152,7 +1152,7 @@ ANN static inline Type foreach_type(const Env env, const Exp exp) {
             " This is not allowed in foreach loop"),
           et->name)
   DECL_OO(Type, base, = typedef_base(et));
-  DECL_OO(const Type, t, = array_base(base));
+  DECL_OO(const Type, t, = array_base_simple(base));
   const m_uint depth = base->array_depth - 1;
   return depth ? array_type(env, t, depth) : t;
 }
index 525b1f409a692798110385b16818cb3ba215e714..8186a23a170f84d99584aac14948f84ddf2d34cf 100644 (file)
@@ -159,9 +159,12 @@ ANN m_bool add_op(const Gwion gwion, const struct Op_Import *opi) {
 
 ANN static inline Type op_parent(const Env env, const Type t) {
   const size_t depth = t->array_depth;
-  return !depth || !array_base(t)->info->parent
-             ? t->info->parent
-             : array_type(env, array_base(t)->info->parent, depth);
+  if (!depth)
+    return t->info->parent;
+  const Type base = array_base_simple(t);
+  return !base->info->parent
+         ? t->info->parent
+         : array_type(env, base->info->parent, depth);
 }
 
 ANN static Type op_check_inner(const Env env, struct OpChecker *ock,
index 0a22703d031a0b444537a1e9f0a5ed3b813ec08c..32a2bc4d9f5ee80d7d156f1c41edde7e10cfef04 100644 (file)
@@ -109,11 +109,12 @@ ANN static m_bool scan1_decl(const Env env, const Exp_Decl *decl) {
       if (var->array->exp) CHECK_BB(scan1_exp(env, var->array->exp));
       CHECK_OB((t = array_type(env, decl->type, var->array->depth)));
     }
-    if (GET_FLAG(array_base(t), abstract) &&
+    const Type base = array_base_simple(t);
+    if (GET_FLAG(base, abstract) &&
         ((var->array && var->array->exp) ||
          (decl->td->array && decl->td->array->exp)))
       ERR_B(var->pos, _("arrays of abstract type '%s' must be declared empty"),
-            array_base(t)->name);
+            base->name);
     const Value v = var->value =
         var->value ?: new_value(env->gwion->mp, t, s_name(var->xid));
     nspc_add_value(env->curr, var->xid, v);