]> Nishi Git Mirror - gwion.git/commitdiff
:art: improve xork
authorfennecdjay <fennecdjay@gmail.com>
Tue, 27 Feb 2024 20:47:37 +0000 (21:47 +0100)
committerfennecdjay <fennecdjay@gmail.com>
Tue, 27 Feb 2024 20:47:37 +0000 (21:47 +0100)
src/lib/xork.c
src/parse/check.c

index 57281235587c63d9fdcae8d9e6c470d7905a27d3..d6f7bf69f640e0f2ab6d303d2aad74493711c0b8 100644 (file)
@@ -59,7 +59,9 @@ static OP_CHECK(opck_spork) {
       }
     }
     const Func f = env->func;
-    struct Value_ value = { .type = env->gwion->type[et_function]};
+    struct ValueFrom_ from;
+    valuefrom(env, &from);
+    struct Value_ value = { .type = env->gwion->type[et_function], .from = &from};
     if(env->class_def)
       set_vflag(&value, vflag_member);
     struct Func_Base_ fbase = { .tag=MK_TAG(insert_symbol("in spork"), exp_self(unary)->loc), .values = &upvalues, .fbflag = fbflag_lambda};
index 240868c3b4b7de2946cca003afd1542c0c4e2907..3c9e9d0b408bf90531f85add01a2290b3b9a52a3 100644 (file)
@@ -698,18 +698,18 @@ ANN static void print_current_args(Exp* e) {
   gw_err("\n");
 }
 
-ANN2(1)
+ANN2(1, 2)
 static void function_alternative(const Env env, const Type t, Exp* args,
                                  const loc_t loc) {
-  if (env->context && env->context->error) // needed for ufcs
-    return;
+  const bool is_closure = !isa(t, env->gwion->type[et_closure]);
+  Func f = is_closure
+         ? t->info->func
+        : closure_def(t)->base->func;
+  if(!f) return;
   gwerr_basic("Argument type mismatch", "call site",
               "valid alternatives:", env->name, loc, 0);
-  const bool is_closure = !isa(t, env->gwion->type[et_closure]);
-  Func up = is_closure
-          ?  t->info->func : closure_def(t)->base->func;
-  do print_signature(up);
-  while ((up = up->next));
+  do print_signature(f);
+  while ((f = f->next));
   if (args)
     print_current_args(args);
   else
@@ -1069,7 +1069,7 @@ ANN Type check_exp_call1(const Env env, Exp_Call *const exp) {
       if(t) return t;
     }
   }
-  function_alternative(env, exp->func->type, exp->args, exp->func->loc);
+  function_alternative(env, t, exp->args, exp->func->loc);
   return NULL;
 }