]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix array types
authorJérémie Astor <fennecdjay@gmail.com>
Wed, 11 Aug 2021 17:51:42 +0000 (19:51 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Wed, 11 Aug 2021 17:51:42 +0000 (19:51 +0200)
include/env/type.h
src/emit/emit.c
src/env/envset.c
src/env/type.c
src/parse/check.c
src/parse/scan1.c
src/parse/scan2.c

index 288cba6eb4eb9301461b41d7d01d37b5b8dda46f..6a68f18941fa374e0ad37c1c4b6d92451fb3e875 100644 (file)
@@ -82,6 +82,8 @@ ANN __attribute__((returns_nonnull)) static inline Type _class_base(Type t) {
 }
 ANN m_uint get_depth(const Type type);
 ANN void   inherit(const Type);
+ANN bool type_global(const Env env, Type t);
+ANN bool from_global_nspc(const Env env, const Nspc nspc);
 
 __attribute__((returns_nonnull)) ANN static inline Type get_gack(Type t) {
   do
index 3f590e2e298c85acbcbe8c788710032dc072f083..dbc95e48bc3ce987f07cc807ce17cda4052f9c63 100644 (file)
@@ -2766,8 +2766,6 @@ ANN static m_bool emit_class_def(const Emitter emit, const Class_Def cdef) {
   if (tflag(t, tflag_emit)) return GW_OK;
   set_tflag(t, tflag_emit);
   const Class_Def c = t->info->cdef;
-  const Type owner = t->info->value->from->owner_class;
-  if (owner) CHECK_BB(ensure_emit(emit, owner));
   if (c->base.ext && t->info->parent->info->cdef &&
       !tflag(t->info->parent, tflag_emit)) // ?????
     CHECK_BB(cdef_parent(emit, c));
index 2be348fe0961356c643f8e391575bd8d4920a5ee..6e03141b68d2881e20e4684067c7f56d4ad8b373 100644 (file)
@@ -43,6 +43,8 @@ ANN2(1, 3)
 m_bool envset_push(struct EnvSet *es, const Type t, const Nspc nspc) {
   if (t) {
     check(es, t);
+    if(es->run && type_global(es->env, t))
+      env_push_global(es->env);
     return es->run ? push(es, t) : GW_OK;
   }
   if (nspc != es->env->curr) {
@@ -66,6 +68,8 @@ ANN2(1) static void _envset_pop(struct EnvSet *es, const Type t) {
 
 ANN2(1) void envset_pop(struct EnvSet *es, const Type t) {
   _envset_pop(es, t);
+  if(t && type_global(es->env, t))
+    env_pop(es->env, es->scope);
   if (es->_ctx) es->env->context = es->_ctx;
   if (es->_filename) es->env->name = es->_filename;
 }
index b5e9ff9939de3f197d18ac254e71d64c67ec2e17..0d2755c752044bf0e17942f8aa03663afc614e34 100644 (file)
@@ -157,3 +157,21 @@ ANN void inherit(const Type t) {
   nspc->offset = parent->offset;
   if (parent->vtable.ptr) vector_copy2(&parent->vtable, &nspc->vtable);
 }
+
+ANN bool from_global_nspc(const Env env, const Nspc nspc) {
+  Nspc global = env->global_nspc;
+  while(global) {
+    if (nspc == global)
+      return true;
+    global = global->parent;
+  }
+  return false;
+}
+
+ANN bool type_global(const Env env, Type t) {
+  while(t) {
+    if(from_global_nspc(env, t->info->value->from->owner)) return true;
+    t = t->info->value->from->owner_class;
+  }
+  return false;
+}
index 08d06c42fbc6f1ecfcfa891ebf726fc7883242e0..c2e3e5d37b1304379c1d70fff485b9e002808b67 100644 (file)
@@ -1839,8 +1839,6 @@ ANN m_bool check_class_def(const Env env, const Class_Def cdef) {
                           .data = (uintptr_t)c,
                           .pos  = c->pos};
   CHECK_OB(op_check(env, &opi));
-  if (t->info->value->from->owner_class)
-    CHECK_BB(ensure_check(env, t->info->value->from->owner_class));
   if (tflag(t, tflag_check)) return GW_OK;
   set_tflag(t, tflag_check);
   return _check_class_def(env, c);
index 63ce1b216fd85bda32cbda751cce610316ce4552..0a22703d031a0b444537a1e9f0a5ed3b813ec08c 100644 (file)
@@ -35,24 +35,6 @@ ANN static inline m_bool ensure_scan1(const Env env, const Type t) {
   return envset_run(&es, t);
 }
 
-ANN static inline bool from_global_nspc(const Env env, const Nspc nspc) {
-  Nspc global = env->global_nspc;
-  while(global) {
-    if (nspc == global)
-      return true;
-    global = global->parent;
-  }
-  return false;
-}
-
-ANN static bool type_global(const Env env, Type t) {
-  while(t) {
-    if(from_global_nspc(env, t->info->value->from->owner)) return true;
-    t = t->info->value->from->owner_class;
-  }
-  return false;
-}
-
 ANN static m_bool check_global(const Env env, const Type t, const loc_t pos) {
   const struct ValueFrom_ *from = t->info->value->from;
   if(from->owner_class && isa(from->owner_class, env->class_def) > 0)
@@ -754,8 +736,6 @@ ANN m_bool scan1_class_def(const Env env, const Class_Def cdef) {
   const Class_Def c = t->info->cdef;
   if (tflag(t, tflag_scan1)) return GW_OK;
   set_tflag(t, tflag_scan1);
-  if (t->info->value->from->owner_class)
-    CHECK_BB(ensure_scan1(env, t->info->value->from->owner_class));
   if (c->base.ext) CHECK_BB(cdef_parent(env, c));
   if (c->body) CHECK_BB(env_body(env, c, scan1_section));
   return GW_OK;
index b56419b20d0b06ce689ac1089d3a4d2367fa39d2..f7f03d4d5504f522fd4dfeb89c1ce7026a1b1179 100644 (file)
@@ -610,8 +610,6 @@ ANN m_bool scan2_class_def(const Env env, const Class_Def cdef) {
   const Type      t = cdef->base.type;
   const Class_Def c = t->info->cdef;
   if (tflag(t, tflag_scan2)) return GW_OK;
-  if (t->info->value->from->owner_class)
-    CHECK_BB(ensure_scan2(env, t->info->value->from->owner_class));
   set_tflag(t, tflag_scan2);
   if (c->base.ext) CHECK_BB(cdef_parent(env, c));
   if (c->body) CHECK_BB(env_body(env, c, scan2_section));