]> Nishi Git Mirror - gwion.git/commitdiff
:art: Introduce envset_pushv
authorJérémie Astor <fennecdjay@gmail.com>
Tue, 18 May 2021 20:54:29 +0000 (22:54 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Tue, 18 May 2021 20:54:29 +0000 (22:54 +0200)
ast
include/env/envset.h
src/emit/emit.c
src/env/envset.c
src/lib/object_op.c
src/parse/check.c
src/parse/func_resolve_tmpl.c

diff --git a/ast b/ast
index 5c6ff39a52550be2956e927091e58470d3cc6dc6..40397642ad13c18fc0edc65791b475e29d832d8a 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit 5c6ff39a52550be2956e927091e58470d3cc6dc6
+Subproject commit 40397642ad13c18fc0edc65791b475e29d832d8a
index c3981bf2143582f6f753888869627bbe8f7a61ca..aff25a5f74c9502d68cb66591ef65422ae8cfeb8 100644 (file)
@@ -8,11 +8,16 @@ struct EnvSet {
   const void *data;
   const m_int scope;
   const enum tflag flag;
+  Context _ctx;
+  m_str _filename;
   bool run;
 };
 
 ANN m_bool envset_run(struct EnvSet*, const Type);
 ANN2(1,3) m_bool envset_push(struct EnvSet*, const Type, const Nspc);
+ANN static inline m_bool envset_pushv(struct EnvSet *es, const Value v) {
+  return envset_push(es, v->from->owner_class, v->from->owner);
+}
 ANN2(1) void   envset_pop(struct EnvSet*, const Type);
 
 ANN static inline m_bool extend_push(const Env env, const Type t) {
index 5e3ed476054037c12f0d930ac838f71182d87856..6f23c45f82dc1da3251e891eb5fda19b0716f506 100644 (file)
@@ -1095,7 +1095,7 @@ ANN static m_bool emit_template_code(const Emitter emit, const Func f) {
   const size_t scope = emit->env->scope->depth;
   struct EnvSet es = { .env=emit->env, .data=emit, .func=(_exp_func)emit_cdef,
     .scope=scope, .flag=tflag_emit };
-  CHECK_BB(envset_push(&es, v->from->owner_class, v->from->owner));
+  CHECK_BB(envset_pushv(&es, v));
   (void)emit_push(emit, v->from->owner_class, v->from->owner);
   const m_bool ret = emit_func_def(emit, f->def);
   if(es.run)
@@ -1505,7 +1505,7 @@ ANN static m_bool emit_exp_lambda(const Emitter emit, const Exp_Lambda * lambda)
   }
   struct EnvSet es = { .env=emit->env, .data=emit, .func=(_exp_func)emit_cdef,
     .scope=emit->env->scope->depth, .flag=tflag_emit };
-  CHECK_BB(envset_push(&es, lambda->owner, lambda->def->base->func->value_ref->from->owner));
+  CHECK_BB(envset_pushv(&es, lambda->def->base->func->value_ref));
   const m_bool ret = emit_lambda(emit, lambda);
   if(es.run)
     envset_pop(&es, lambda->owner);
@@ -1575,7 +1575,7 @@ ANN static m_bool emit_stmt_code(const Emitter emit, const Stmt_Code stmt) {
   return ret;
 }
 
-ANN static m_bool optimize_taill_call(const Emitter emit, const Exp_Call* e) {
+ANN static m_bool optimize_tail_call(const Emitter emit, const Exp_Call* e) {
   if(e->args) {
     emit_func_args(emit, e);
     const Func f = e->func->type->info->func;
@@ -1592,7 +1592,7 @@ ANN static m_bool emit_stmt_return(const Emitter emit, const Stmt_Exp stmt) {
     if(stmt->val->exp_type == ae_exp_call) {
       const Func f = stmt->val->d.exp_call.func->type->info->func;
       if(stmt->val->exp_type == ae_exp_call && emit->env->func == f)
-        return optimize_taill_call(emit, &stmt->val->d.exp_call);
+        return optimize_tail_call(emit, &stmt->val->d.exp_call);
     }
     CHECK_BB(emit_exp_pop_next(emit, stmt->val));
   }
index 52d59559cbf36b973984fe0b11c38724aff0f23c..0559da8a64768c0869f3d9320c35061661c723fa 100644 (file)
@@ -29,6 +29,10 @@ ANN static m_bool push(struct EnvSet *es, const Type t) {
   env_push_type((void*)es->env, t);
   if(tflag(t, tflag_tmpl))
     CHECK_BB(template_push_types(es->env, t->info->cdef->base.tmpl)); // incorrect templates?
+  es->_ctx = es->env->context;
+  es->_filename = es->env->name;
+  es->env->context = t->info->value->from->ctx;
+  es->env->name = t->info->value->from->filename;
   return GW_OK;
 }
 
@@ -44,7 +48,7 @@ ANN2(1,3) m_bool envset_push(struct EnvSet *es, const Type t, const Nspc nspc) {
   return GW_OK;
 }
 
-ANN2(1) void envset_pop(struct EnvSet *es, const Type t) {
+ANN2(1) static void _envset_pop(struct EnvSet *es, const Type t) {
   if(safe_tflag(t, tflag_tmpl)) // might not be useful
     nspc_pop_type(es->env->gwion->mp, es->env->curr);
   env_pop(es->env, es->scope);
@@ -57,6 +61,14 @@ ANN2(1) void envset_pop(struct EnvSet *es, const Type t) {
     env_pop(es->env, es->scope);
 }
 
+ANN2(1) void envset_pop(struct EnvSet *es, const Type t) {
+  _envset_pop(es, t);
+  if(es->_ctx)
+    es->env->context = es->_ctx;
+  if(es->_filename)
+    es->env->name = es->_filename;
+}
+
 ANN m_bool envset_run(struct EnvSet *es, const Type t) {
   check(es, t);
   const Type owner_class = t->info->value->from->owner_class;
index eb8b6a237929cf35a6301f3a518f6c970f1d15d5..a1b6525aed99ad9ac6befabc3758d66c4dd1bc71 100644 (file)
@@ -277,7 +277,7 @@ ANN Type scan_class(const Env env, const Type t, const Type_Decl *td) {
   struct EnvSet es = { .env=env, .data=env, .func=(_exp_func)scan0_cdef,
     .scope=env->scope->depth, .flag=tflag_scan0 };
   const Type owner = t->info->value->from->owner_class;
-  CHECK_BO(envset_push(&es, owner, t->info->value->from->owner));
+  CHECK_BO(envset_pushv(&es, t->info->value));
   const Type ret = _scan_class(env, &info);
   if(es.run)
     envset_pop(&es, owner);
index 42a3713da7e0dcb271d9bd58a9da17a88df7e59b..68100dec3becb71df63b67138abecc14787a381e 100644 (file)
@@ -646,7 +646,7 @@ ANN static Type check_predefined(const Env env, Exp_Call *exp, const Value v, co
   if(!fdef->base->ret_type) { // template fptr
     struct EnvSet es = { .env=env, .data=env, .func=(_exp_func)check_cdef,
       .scope=env->scope->depth, .flag=tflag_check };
-    CHECK_BO(envset_push(&es, v->from->owner_class, v->from->owner));
+    CHECK_BO(envset_pushv(&es, v));
     func->def->base->fbflag |= fbflag_internal;
     const m_bool ret = check_traverse_fdef(env, func->def);
     if(es.run)
@@ -786,7 +786,7 @@ ANN Type check_exp_call1(const Env env, Exp_Call *const exp) {
 //  if(!fflag(func, fflag_valid)) {
       struct EnvSet es = { .env=env, .data=env, .func=(_exp_func)check_cdef,
         .scope=env->scope->depth, .flag=tflag_check };
-      CHECK_BO(envset_push(&es, func->value_ref->from->owner_class, func->value_ref->from->owner));
+      CHECK_BO(envset_pushv(&es, func->value_ref));
       CHECK_BO(check_func_def(env, func->def));
       if(es.run)
         envset_pop(&es, func->value_ref->from->owner_class);
index 0b875de68c559aed8399932a07b34ea90ba8b22f..d65376f3e627d5367b7e78ec897a96ebbbb93b65 100644 (file)
@@ -127,7 +127,7 @@ ANN static Func find_tmpl(const Env env, const Value v, Exp_Call *const exp, con
   struct EnvSet es = { .env=env, .data=env, .func=(_exp_func)check_cdef,
     .scope=scope, .flag=tflag_check };
   struct ResolverArgs ra = {.v = v, .e = exp, .tmpl_name = tmpl_name, .types = types};
-  CHECK_BO(envset_push(&es, v->from->owner_class, v->from->owner));
+  CHECK_BO(envset_pushv(&es, v));
   (void)env_push(env, v->from->owner_class, v->from->owner);
   if(v->from->owner_class && v->from->owner_class->info->cdef->base.tmpl)
     (void)template_push_types(env, v->from->owner_class->info->cdef->base.tmpl);