]> Nishi Git Mirror - gwion.git/commitdiff
:art: template ops stability
authorJérémie Astor <fennecdjay@gmail.com>
Sun, 20 Jun 2021 15:11:37 +0000 (17:11 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Sun, 20 Jun 2021 15:11:37 +0000 (17:11 +0200)
src/parse/check.c
src/parse/operator.c

index eb38a44dae07255717b9dbada96b6e31c0b434fc..53e19d2c40730892d30fa4b1fac762221bda8b47 100644 (file)
@@ -721,7 +721,6 @@ ANN static Type check_exp_call_template(const Env env, Exp_Call *exp) {
   Tmpl *tm = fdef->base->tmpl;
   if (tm->call) return check_predefined(env, exp, value, tm, fdef);
   DECL_OO(const Type_List, tl, = check_template_args(env, exp, tm, fdef));
-  ;
   Tmpl tmpl               = {.call = tl};
   ((Exp_Call *)exp)->tmpl = &tmpl;
   DECL_OO(const Func, func, = get_template_func(env, exp, value));
@@ -896,7 +895,7 @@ ANN2(1) static inline bool curried(const Env env, Exp exp) {
 }
 
 ANN static Type check_exp_call(const Env env, Exp_Call *exp) {
-  if (curried(env, exp->args)) return env->gwion->type[et_curry];
+  if (env->scope->allow_curry && curried(env, exp->args)) return env->gwion->type[et_curry];
   if (exp->tmpl) {
     DECL_BO(const m_bool, ret, = func_check(env, exp));
     if (!ret) return exp_self(exp)->type;
index c38e8efed928a029bd0a89f6dbd34ae7a9b76c92..17be1b61813e9eba6c0f37f57434c74d45e2db5a 100644 (file)
@@ -186,26 +186,32 @@ ANN static Type op_check_inner(const Env env, struct OpChecker *ock,
 
 //! check if type matches for template operator
 ANN bool _tmpl_match(const Env env, const Type t, Type_Decl *const td,
-                     Specialized_List *sl) {
-  if (!td->next && td->xid == (*sl)->xid) {
-    *sl = (*sl)->next;
+                     Specialized_List *slp) {
+  const Specialized_List sl = *slp;
+  if (sl && !td->next && !td->types && td->xid == sl->xid) {
+    *slp = sl->next;
     return true;
   }
   const Type base = known_type(env, td);
-  return isa(t, base) > 0;
+  return base ? isa(t, base) > 0 : false;
 }
 
 //! check Func_Base matches for template operator
+// usage of `is_class` is supicious rn
 ANN bool tmpl_match(const Env env, const struct Op_Import *opi,
                     Func_Base *const base) {
   Specialized_List sl  = base->tmpl->list;
   const Arg_List   arg = base->args;
   if (opi->lhs) {
-    if (fbflag(base, fbflag_unary) ||
-        !_tmpl_match(env, opi->lhs, arg->td, &sl) ||
-        (opi->rhs && fbflag(base, fbflag_postfix)) ||
-        !_tmpl_match(env, opi->rhs, arg->next->td, &sl))
-      return false;
+    if (!_tmpl_match(env, opi->lhs, arg->td, &sl))
+       return false;
+    if (fbflag(base, fbflag_postfix))
+       return !!opi->rhs;
+    if (!fbflag(base, fbflag_unary)) {
+      if(!opi->rhs)return false;
+      if (!_tmpl_match(env, opi->rhs, arg->next->td, &sl))
+        return false;
+    } else if(opi->rhs) return false;
   } else {
     if (!fbflag(base, fbflag_unary) ||
         !_tmpl_match(env, opi->rhs, arg->td, &sl))
@@ -248,6 +254,7 @@ ANN static Type op_check_tmpl(const Env env, struct Op_Import *opi) {
     const Vector v = &nspc->info->op_tmpl;
     for (m_uint i = vector_size(v) + 1; --i;) {
       const Func_Def fdef = (Func_Def)vector_at(v, i - 1);
+      if(opi->op != fdef->base->xid) continue;
       if (!tmpl_match(env, opi, fdef->base)) continue;
       return op_def(env, opi, fdef);
     }