]> Nishi Git Mirror - gwion.git/commitdiff
:art: Simplify lambda
authorfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 12 Nov 2019 13:29:32 +0000 (14:29 +0100)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 12 Nov 2019 13:29:32 +0000 (14:29 +0100)
ast
src/emit/emit.c
src/lib/func.c
src/parse/check.c

diff --git a/ast b/ast
index a95e4eac0089fcbb55cd477987f5dcd40116eb6f..a665041d509e08858bfe7932dd753fd99b0fa105 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit a95e4eac0089fcbb55cd477987f5dcd40116eb6f
+Subproject commit a665041d509e08858bfe7932dd753fd99b0fa105
index a133530f4cd36aa171e776ba7dab44f9d114b269..fb75013718bf21d9b5dcd4d8afb82e06c6ca6abc 100644 (file)
@@ -1141,7 +1141,7 @@ ANN static m_bool emit_lambda(const Emitter emit, const Exp_Lambda * lambda) {
 }
 
 ANN static m_bool emit_exp_lambda(const Emitter emit, const Exp_Lambda * lambda) {
-  if(!lambda->def) {
+  if(!lambda->def->base->func) {
     regpushi(emit, SZ_INT);
     return GW_OK;
   }
index 4e1043050fd7e377ad4816a1ac2c7c883c0eebc3..52a1debc0ce73fa4d4be45bb80ef0a028ff58cb4 100644 (file)
@@ -144,7 +144,7 @@ ANN static Type fptr_type(const Env env, struct FptrInfo *info) {
 }
 
 ANN static m_bool _check_lambda(const Env env, Exp_Lambda *l, const Func_Def def) {
-  Arg_List base = def->base->args, arg = l->args;
+  Arg_List base = def->base->args, arg = l->def->base->args;
   while(base && arg) {
     arg->td = base->td;
     base = base->next;
@@ -152,11 +152,13 @@ ANN static m_bool _check_lambda(const Env env, Exp_Lambda *l, const Func_Def def
   }
   if(base || arg)
     ERR_B(exp_self(l)->pos, _("argument number does not match for lambda"))
-  l->def = new_func_def(env->gwion->mp,
-    new_func_base(env->gwion->mp, def->base->td, l->name, l->args),
-    l->code, def->flag, loc_cpy(env->gwion->mp, def->pos));
+  l->def->flag = def->flag;
+  l->def->base->td = cpy_type_decl(env->gwion->mp, def->base->td);
+//  l->def = new_func_def(env->gwion->mp,
+//    new_func_base(env->gwion->mp, def->base->td, l->name, l->args),
+//    l->code, def->flag, loc_cpy(env->gwion->mp, def->pos));
   CHECK_BB(traverse_func_def(env, l->def))
-  arg = l->args;
+  arg = l->def->base->args;
   while(arg) {
     arg->td = NULL;
     arg = arg->next;
index e87a95a093bfda5d9ecc985c76ce0624ab72cc1c..d068faedbc582b4e85deceeba98ab51487bb38f9 100644 (file)
@@ -751,7 +751,7 @@ ANN static Type check_lambda_call(const Env env, const Exp_Call *exp) {
   if(exp->args)
     CHECK_OO(check_exp(env, exp->args))
   Exp_Lambda *l = &exp->func->d.exp_lambda;
-  Arg_List arg = l->args;
+  Arg_List arg = l->def->base->args;
   Exp e = exp->args;
   while(arg && e) {
     arg->type = e->type;
@@ -760,8 +760,6 @@ ANN static Type check_lambda_call(const Env env, const Exp_Call *exp) {
   }
   if(arg || e)
     ERR_O(exp_self(exp)->pos, _("argument number does not match for lambda"))
-  l->def = new_func_def(env->gwion->mp, new_func_base(env->gwion->mp, NULL, l->name, l->args),
-    l->code, 0, loc_cpy(env->gwion->mp, exp_self(exp)->pos));
   CHECK_BO(traverse_func_def(env, l->def))
   if(env->class_def)
     SET_FLAG(l->def, member);