]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix Dict globality
authorfennecdjay <fennecdjay@gmail.com>
Sun, 3 Jul 2022 15:55:37 +0000 (17:55 +0200)
committerfennecdjay <fennecdjay@gmail.com>
Sun, 3 Jul 2022 15:55:37 +0000 (17:55 +0200)
include/tmpl_info.h
src/lib/closure.c
src/lib/dict.c
src/lib/object_op.c
src/lib/tmpl_info.c

index 39b7e26dbef3f22953979dece6667c2dd4662bf6..68188db4b65b17444ac7b353f155bdc0193e064e 100644 (file)
@@ -12,4 +12,5 @@ struct tmpl_info {
 };
 
 ANN Type tmpl_exists(const Env env, struct tmpl_info *const info);
+ANN bool tmpl_global(const Env env, Type_List tl);
 #endif
index 8e0428c9a1cec2f6ec663f921f0fd1030cc56cd8..ef5f816590f58a88ed152bc16754b3800a1015dc 100644 (file)
@@ -672,8 +672,6 @@ static FREEARG(freearg_dottmpl) {
 #include "traverse.h"
 #include "gwi.h"
 
-ANN bool tmpl_global(const Env env, Type_List tl);
-
 ANN static bool is_base(const Env env, const Type_List tl) {
   for(uint32_t i = 0; i < tl->len; i++) {
     Type_Decl *td = *mp_vector_at(tl, Type_Decl*, i);
index 3fb819890fa825f7c892a4c8902a1d27b521eecb..693e2ba951a12efc3c8a10ceb738e53991864ff4 100644 (file)
@@ -634,10 +634,16 @@ static OP_CHECK(opck_dict_scan) {
   cdef->base.xid        = info.name;
   cdef->base.tmpl->call = cpy_type_list(env->gwion->mp, info.td->types);
 
+  const bool is_global = tmpl_global(env, ts->td->types);
+  const m_uint scope = is_global ?  env_push_global(env) : env->scope->depth;
   (void)scan0_class_def(env, cdef);
   const Type   t   = cdef->base.type;
   t->nspc->class_data_size = sizeof(struct HMapInfo);
   const m_bool ret = traverse_cdef(env, t);
+  if(is_global) {
+    env_pop(env, scope);
+    type_addref(t);
+  }
   HMapInfo *const hinfo = (HMapInfo*)t->nspc->class_data;
   hmapinfo_init(hinfo, env->gwion->type, key, val);
   if(hinfo->keyk + hinfo->valk) {
index 912cad74ad8c58aa1ff17d8e1ed2483ca1f04600..10e346c7e5de703cc801ddff241a7cd9e603002a 100644 (file)
@@ -343,17 +343,6 @@ ANN static Type _scan_class(const Env env, struct tmpl_info *info) {
   return info->ret;
 }
 
-ANN Type tmpl_exists(const Env env, struct tmpl_info *const info);
-
-ANN bool tmpl_global(const Env env, Type_List tl) {
-  for(uint32_t i = 0; i < tl->len; i++) {
-    Type_Decl *td = *mp_vector_at(tl, Type_Decl*, i);
-    if(!type_global(env, known_type(env, td)))
-      return false;
-  };
-  return true;
-}
-
 ANN Type scan_class(const Env env, const Type t, const Type_Decl *td) {
   struct tmpl_info info = {
       .base = t, .td = td, .list = t->info->cdef->base.tmpl->list};
index 1f7fffce3fd4cc540e2e110690ccd2199af77bf9..6d9d483399f379a478278fe3439565456f7c743f 100644 (file)
@@ -96,3 +96,12 @@ ANN Type tmpl_exists(const Env env, struct tmpl_info *const info) {
     info->name = template_id(env, info);
   return _tmpl_exists(env, info->name);
 }
+
+ANN bool tmpl_global(const Env env, Type_List tl) {
+  for(uint32_t i = 0; i < tl->len; i++) {
+    Type_Decl *td = *mp_vector_at(tl, Type_Decl*, i);
+    if(!type_global(env, known_type(env, td)))
+      return false;
+  }
+  return true;
+}