0
0
mirror of https://github.com/vim/vim.git synced 2025-09-29 04:34:16 -04:00

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.
This commit is contained in:
Bram Moolenaar
2016-03-19 19:38:12 +01:00
parent 953cc7fb13
commit f0e86a0dbd
4 changed files with 44 additions and 31 deletions

View File

@@ -4555,33 +4555,14 @@ eval4(char_u **arg, typval_T *rettv, int evaluate)
else if (rettv->v_type == VAR_FUNC || var2.v_type == VAR_FUNC else if (rettv->v_type == VAR_FUNC || var2.v_type == VAR_FUNC
|| rettv->v_type == VAR_PARTIAL || var2.v_type == VAR_PARTIAL) || rettv->v_type == VAR_PARTIAL || var2.v_type == VAR_PARTIAL)
{ {
if (rettv->v_type != var2.v_type if (type != TYPE_EQUAL && type != TYPE_NEQUAL)
|| (type != TYPE_EQUAL && type != TYPE_NEQUAL))
{ {
if (rettv->v_type != var2.v_type) EMSG(_("E694: Invalid operation for Funcrefs"));
EMSG(_("E693: Can only compare Funcref with Funcref"));
else
EMSG(_("E694: Invalid operation for Funcrefs"));
clear_tv(rettv); clear_tv(rettv);
clear_tv(&var2); clear_tv(&var2);
return FAIL; return FAIL;
} }
else if (rettv->v_type == VAR_PARTIAL) n1 = tv_equal(rettv, &var2, FALSE, FALSE);
{
/* 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;
}
if (type == TYPE_NEQUAL) if (type == TYPE_NEQUAL)
n1 = !n1; n1 = !n1;
} }
@@ -6203,6 +6184,19 @@ tv_equal(
static int recursive_cnt = 0; /* catch recursive loops */ static int recursive_cnt = 0; /* catch recursive loops */
int r; 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) if (tv1->v_type != tv2->v_type)
return FALSE; return FALSE;
@@ -6234,15 +6228,6 @@ tv_equal(
--recursive_cnt; --recursive_cnt;
return r; 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: case VAR_NUMBER:
return tv1->vval.v_number == tv2->vval.v_number; return tv1->vval.v_number == tv2->vval.v_number;
@@ -6266,6 +6251,8 @@ tv_equal(
#ifdef FEAT_JOB_CHANNEL #ifdef FEAT_JOB_CHANNEL
return tv1->vval.v_channel == tv2->vval.v_channel; return tv1->vval.v_channel == tv2->vval.v_channel;
#endif #endif
case VAR_FUNC:
case VAR_PARTIAL:
case VAR_UNKNOWN: case VAR_UNKNOWN:
break; break;
} }

View File

@@ -5,6 +5,7 @@ source test_assign.vim
source test_cursor_func.vim source test_cursor_func.vim
source test_delete.vim source test_delete.vim
source test_ex_undo.vim source test_ex_undo.vim
source test_expr.vim
source test_expand.vim source test_expand.vim
source test_feedkeys.vim source test_feedkeys.vim
source test_file_perm.vim source test_file_perm.vim

23
src/testdir/test_expr.vim Normal file
View File

@@ -0,0 +1,23 @@
" Tests for expressions.
func Test_equal()
let base = {}
func base.method()
return 1
endfunc
func base.other() dict
return 1
endfunc
let instance = copy(base)
call assert_true(base.method == instance.method)
call assert_true([base.method] == [instance.method])
call assert_true(base.other == instance.other)
call assert_true([base.other] == [instance.other])
call assert_false(base.method == base.other)
call assert_false([base.method] == [base.other])
call assert_false(base.method == instance.other)
call assert_false([base.method] == [instance.other])
call assert_fails('echo base.method > instance.method')
endfunc

View File

@@ -748,6 +748,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1607,
/**/ /**/
1606, 1606,
/**/ /**/