]> Nishi Git Mirror - gwion.git/commitdiff
:fire: more clean
authorfennecdjay <fennecdjay@gmail.com>
Mon, 26 Feb 2024 20:42:39 +0000 (21:42 +0100)
committerfennecdjay <fennecdjay@gmail.com>
Mon, 26 Feb 2024 20:42:39 +0000 (21:42 +0100)
src/env/envset.c
src/parse/func_resolve_tmpl.c
src/parse/scan1.c

index 98cabce9f5c37fe0f478bb29de1811ea2105a3ac..8c1de2e82cb5a6c2c728811b9244a9ed615fd6bd 100644 (file)
@@ -8,6 +8,8 @@
 ANN static void check(struct EnvSet *es, const Type t) {
   es->_ctx         = es->env->context;
   es->_filename    = es->env->name;
+  if(!type_global(es->env, t)) // why need value?
+    es->env->name    = t->info->value->from->filename;
   const Vector v     = &es->env->scope->class_stack;
   Type         owner = t->info->value->from->owner_class;
   for (vtype i = vector_size(v) + 1; owner && --i;) {
index 1813d564017be8f97f750d689f70d99976b8a1fc..567dda33603f230d91d1503c666e24607da1352a 100644 (file)
@@ -147,14 +147,16 @@ ANN static Func find_tmpl(const Env env, const Value v, Exp_Call *const exp,
                           const m_str tmpl_name) {
   const TmplArg_List     types  = exp->tmpl->call;
   const Func          former = env->func;
+  const m_uint        scope  = env->scope->depth;
   struct EnvSet       es     = {.env   = env,
                       .data  = env,
                       .func  = (_envset_func)check_cdef,
-                      .scope = env->scope->depth,
+                      .scope = scope,
                       .flag  = tflag_check};
   struct ResolverArgs ra     = {
       .v = v, .e = exp, .tmpl_name = tmpl_name, .types = types};
-  CHECK_O(envset_pushf(&es, v));
+  CHECK_O(envset_pushv(&es, v));
+  (void)env_push(env, v->from->owner_class, v->from->owner);
   const Tmpl *tmpl = v->from->owner_class && v->from->owner_class->info->cdef ?
       get_tmpl(v->from->owner_class) : NULL;
   if(tmpl)
@@ -164,7 +166,8 @@ ANN static Func find_tmpl(const Env env, const Value v, Exp_Call *const exp,
                                : fptr_match(env, &ra);
   if(tmpl)
     nspc_pop_type(env->gwion->mp, env->curr);
-  envset_popf(&es, v);
+  env_pop(env, scope);
+  envset_pop(&es, v->from->owner_class);
   env->func = former;
   return m_func;
 }
index 6474f9366911bdc0c8d4dd806dd5a28f9be14263..d30cdfc8eaf3a3a5f6dc096cde2f7dbdb1738012 100644 (file)
@@ -603,7 +603,8 @@ ANN static bool scan1_stmt_return(const Env env, const Stmt_Exp stmt) {
 }
 
 ANN static bool scan1_stmt_pp(const Env env, const Stmt_PP stmt) {
-  if (stmt->pp_type == ae_pp_include) env->name = stmt->data;
+  if (stmt->pp_type == ae_pp_include)
+    env->name = stmt->data;
   if (stmt->pp_type == ae_pp_pragma && !strcmp(stmt->data, "packed")) {
     if(env->class_def && !tflag(env->class_def, tflag_union)) set_tflag(env->class_def, tflag_packed);
     else ERR_B(stmt_self(stmt)->loc, "`packed` pragma outside of {G+}class{0} or {G+}struct{0} declaration");