patch 7.4.1607
Problem: Comparing a function that exists on two dicts is not backwards
compatible. (Thinca)
Solution: Only compare the function, not what the partial adds.
diff --git a/src/eval.c b/src/eval.c
index 69969fe..5f20c23 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -4555,33 +4555,14 @@
else if (rettv->v_type == VAR_FUNC || var2.v_type == VAR_FUNC
|| rettv->v_type == VAR_PARTIAL || var2.v_type == VAR_PARTIAL)
{
- if (rettv->v_type != var2.v_type
- || (type != TYPE_EQUAL && type != TYPE_NEQUAL))
+ if (type != TYPE_EQUAL && type != TYPE_NEQUAL)
{
- if (rettv->v_type != var2.v_type)
- EMSG(_("E693: Can only compare Funcref with Funcref"));
- else
- EMSG(_("E694: Invalid operation for Funcrefs"));
+ EMSG(_("E694: Invalid operation for Funcrefs"));
clear_tv(rettv);
clear_tv(&var2);
return FAIL;
}
- else if (rettv->v_type == VAR_PARTIAL)
- {
- /* Partials are only equal when identical. */
- n1 = rettv->vval.v_partial != NULL
- && rettv->vval.v_partial == var2.vval.v_partial;
- }
- else
- {
- /* Compare two Funcrefs for being equal or unequal. */
- if (rettv->vval.v_string == NULL
- || var2.vval.v_string == NULL)
- n1 = FALSE;
- else
- n1 = STRCMP(rettv->vval.v_string,
- var2.vval.v_string) == 0;
- }
+ n1 = tv_equal(rettv, &var2, FALSE, FALSE);
if (type == TYPE_NEQUAL)
n1 = !n1;
}
@@ -6203,6 +6184,19 @@
static int recursive_cnt = 0; /* catch recursive loops */
int r;
+ /* For VAR_FUNC and VAR_PARTIAL only compare the function name. */
+ if ((tv1->v_type == VAR_FUNC
+ || (tv1->v_type == VAR_PARTIAL && tv1->vval.v_partial != NULL))
+ && (tv2->v_type == VAR_FUNC
+ || (tv2->v_type == VAR_PARTIAL && tv2->vval.v_partial != NULL)))
+ {
+ s1 = tv1->v_type == VAR_FUNC ? tv1->vval.v_string
+ : tv1->vval.v_partial->pt_name;
+ s2 = tv2->v_type == VAR_FUNC ? tv2->vval.v_string
+ : tv2->vval.v_partial->pt_name;
+ return (s1 != NULL && s2 != NULL && STRCMP(s1, s2) == 0);
+ }
+
if (tv1->v_type != tv2->v_type)
return FALSE;
@@ -6234,15 +6228,6 @@
--recursive_cnt;
return r;
- case VAR_FUNC:
- return (tv1->vval.v_string != NULL
- && tv2->vval.v_string != NULL
- && STRCMP(tv1->vval.v_string, tv2->vval.v_string) == 0);
-
- case VAR_PARTIAL:
- return tv1->vval.v_partial != NULL
- && tv1->vval.v_partial == tv2->vval.v_partial;
-
case VAR_NUMBER:
return tv1->vval.v_number == tv2->vval.v_number;
@@ -6266,6 +6251,8 @@
#ifdef FEAT_JOB_CHANNEL
return tv1->vval.v_channel == tv2->vval.v_channel;
#endif
+ case VAR_FUNC:
+ case VAR_PARTIAL:
case VAR_UNKNOWN:
break;
}