]> Nishi Git Mirror - gwion.git/commitdiff
:art: Simplify free func_def
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Mon, 6 Apr 2020 12:58:24 +0000 (14:58 +0200)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Mon, 6 Apr 2020 12:58:24 +0000 (14:58 +0200)
ast
src/emit/emit.c
src/lib/instr.c
src/parse/check.c
src/parse/scan0.c
src/parse/scan1.c
src/parse/scan2.c

diff --git a/ast b/ast
index 20493d2bc523d9c28f3b0ce7271bfe6c788b16ad..db6a920ab506312eabe2835f41ca8b02ecec153f 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit 20493d2bc523d9c28f3b0ce7271bfe6c788b16ad
+Subproject commit db6a920ab506312eabe2835f41ca8b02ecec153f
index 2308b3d7fa00918c755ae9e30efe7a10b6bd8cb5..153a2ab874627cab2b9a24e74de98fda4d8b6cb5 100644 (file)
@@ -1860,8 +1860,9 @@ ANN static void emit_fdef_finish(const Emitter emit, const Func_Def fdef) {
     func->code->memoize = memoize_ini(emit, func);
 }
 
-ANN static m_bool emit_func_def(const Emitter emit, const Func_Def fdef) {
-  const Func func = fdef->base->func;
+ANN static m_bool emit_func_def(const Emitter emit, const Func_Def f) {
+  const Func func = f->base->func;
+  const Func_Def fdef = func->def;
   const Func former = emit->env->func;
   if(tmpl_base(fdef->base->tmpl))
     return GW_OK;
index 4b64d823fc0c974093482cb37630959ea4c9acc8..6ed0c88bbf1e812f9439d2b1dcc84fd06772953d 100644 (file)
@@ -36,7 +36,7 @@ ANN static Func_Def from_base(const Env env, struct dottmpl_ *const dt, const Ns
     "template", dt->vt_index);
   DECL_OO(const Value, v, = nspc_lookup_value0(nspc, sym))
   const Func_Def def = cpy_func_def(env->gwion->mp, v->d.func_ref->def);
-  def->base->tmpl->call = dt->tl;
+  def->base->tmpl->call = cpy_type_list(env->gwion->mp, dt->tl);
   def->base->tmpl->base = dt->vt_index;
   dt->def = def;
   dt->owner = v->from->owner;
index 05130dac070cdf7ebc2532f909d25c60a8481c2e..de18b0191772e4b92b722c3e12276b16891f1607 100644 (file)
@@ -506,7 +506,7 @@ ANN static Func _find_template_match(const Env env, const Value v, const Exp_Cal
       Func_Base *fbase = cpy_func_base(env->gwion->mp, base->base);
       fbase->xid = sym;
       fbase->tmpl->base = 0;
-      fbase->tmpl->call = types;
+      fbase->tmpl->call = cpy_type_list(env->gwion->mp, types);
       if(template_push_types(env, fbase->tmpl) > 0) {
         const Fptr_Def fptr = new_fptr_def(env->gwion->mp, fbase, base->flag);
         if(traverse_fptr_def(env, fptr) > 0 &&
@@ -543,7 +543,7 @@ ANN static Func _find_template_match(const Env env, const Value v, const Exp_Cal
         }
         const Func_Def fdef = (Func_Def)cpy_func_def(env->gwion->mp, value->d.func_ref->def);
         SET_FLAG(fdef, template);
-        fdef->base->tmpl->call = types;
+        fdef->base->tmpl->call = cpy_type_list(env->gwion->mp, types);
         fdef->base->tmpl->base = i;
         if((m_func = ensure_tmpl(env, fdef, exp)))
           break;
@@ -1284,8 +1284,9 @@ ANN m_bool check_fdef(const Env env, const Func_Def fdef) {
   return GW_OK;
 }
 
-ANN m_bool check_func_def(const Env env, const Func_Def fdef) {
-  const Func func = fdef->base->func;
+ANN m_bool check_func_def(const Env env, const Func_Def f) {
+  const Func func = f->base->func;
+  const Func_Def fdef = func->def;
   assert(func == fdef->base->func);
   if(env->class_def) // tmpl ?
     CHECK_BB(check_parent_match(env, fdef))
index fe8befdfd16c8938b8405eaef80db84aabace2f4..d35c3760ba5cad3475d32ddbc3ee0235639825b1 100644 (file)
@@ -57,13 +57,13 @@ ANN static void fptr_assign(const Env env, const Fptr_Def fptr) {
 }
 
 static void fptr_def(const Env env, const Fptr_Def fptr) {
-  const Func_Def def = new_func_def(env->gwion->mp, new_func_base(env->gwion->mp, fptr->base->td, fptr->base->xid, fptr->base->args),
-    NULL,fptr->base->td->flag, loc_cpy(env->gwion->mp, td_pos(fptr->base->td)));
+  const Func_Def def = new_func_def(env->gwion->mp,
+      cpy_func_base(env->gwion->mp, fptr->base),
+    NULL, fptr->base->td->flag, loc_cpy(env->gwion->mp, td_pos(fptr->base->td)));
   fptr->base->func = new_func(env->gwion->mp, s_name(fptr->base->xid), def);
   fptr->value->d.func_ref = fptr->base->func;
   fptr->base->func->value_ref = fptr->value;
   fptr->type->e->d.func = fptr->base->func;
-  def->base->tmpl = fptr->base->tmpl;
   def->base->func = fptr->base->func;
 }
 
index 41535addd55af106b1d61efb1c47c52486c10d6c..4b177e7e7040608d56bc8f1bc902b42b49cb2dab 100644 (file)
@@ -303,8 +303,9 @@ ANN static m_bool scan1_args(const Env env, Arg_List list) {
 ANN m_bool scan1_fptr_def(const Env env, const Fptr_Def fptr) {
   if(tmpl_base(fptr->base->tmpl))
     return GW_OK;
-  CHECK_OB((fptr->base->ret_type = known_type(env, fptr->base->td)))
-  return fptr->base->args ? scan1_args(env, fptr->base->args) : GW_OK;
+  const Func_Def fdef = fptr->base->func->def;
+  CHECK_OB((fdef->base->ret_type = known_type(env, fdef->base->td)))
+  return fdef->base->args ? scan1_args(env, fdef->base->args) : GW_OK;
 }
 
 ANN m_bool scan1_type_def(const Env env, const Type_Def tdef) {
index 16558b78cf572ea0c464cb245e0af68debe28b93..7ac3000f7d59f30ff477ea21372660b6657e4f35 100644 (file)
@@ -70,13 +70,10 @@ ANN static Value scan2_func_assign(const Env env, const Func_Def d,
 ANN m_bool scan2_fptr_def(const Env env, const Fptr_Def fptr) {
   if(!tmpl_base(fptr->base->tmpl)) {
     const Func_Def def = fptr->type->e->d.func->def;
-    def->base->ret_type = fptr->base->ret_type;
-    if(fptr->base->args)
+    if(def->base->args)
       CHECK_BB(scan2_args(env, def))
-  } else {
-    CHECK_OB(fptr->type) // should happen before
+  } else
     SET_FLAG(fptr->type, func);
-  }
   return GW_OK;
 }
 
@@ -332,6 +329,7 @@ ANN static Type func_type(const Env env, const Func func) {
   t->e->d.func = func;
   return t;
 }
+
 ANN2(1,2) static Value func_value(const Env env, const Func f,
     const Value overload) {
   const Type  t = func_type(env, f);
@@ -526,6 +524,10 @@ ANN m_bool scan2_func_def(const Env env, const Func_Def f) {
   const m_bool ret = scanx_fdef(env, env, f, (_exp_func)scan2_fdef);
   if(GET_FLAG(f, global))
     env_pop(env, scope);
+  if(GET_FLAG(f, global) || (f->base->tmpl && !f->base->tmpl->call)) {
+    f->base->func->def = cpy_func_def(env->gwion->mp, f);
+    f->base->func->def->base->func = f->base->func;
+  }
   return ret;
 }