Mercurial > vim
diff src/eval.c @ 8635:3a38d465f731 v7.4.1607
commit https://github.com/vim/vim/commit/f0e86a0dbddc18568910e9e4aaae0cd88ca8087a
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Mar 19 19:38:12 2016 +0100
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.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 19 Mar 2016 19:45:05 +0100 |
parents | 80d78e1ab787 |
children | ff41ece2e4b8 |
line wrap: on
line diff
--- a/src/eval.c +++ b/src/eval.c @@ -4555,33 +4555,14 @@ eval4(char_u **arg, typval_T *rettv, int 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 (rettv->v_type != var2.v_type) - EMSG(_("E693: Can only compare Funcref with Funcref")); - else - EMSG(_("E694: Invalid operation for Funcrefs")); + if (type != TYPE_EQUAL && type != TYPE_NEQUAL) + { + 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 @@ tv_equal( 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 @@ tv_equal( --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 @@ tv_equal( #ifdef FEAT_JOB_CHANNEL return tv1->vval.v_channel == tv2->vval.v_channel; #endif + case VAR_FUNC: + case VAR_PARTIAL: case VAR_UNKNOWN: break; }