To: vim_dev@googlegroups.com Subject: Patch 7.4.1607 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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. Files: src/eval.c, src/testdir/test_alot.vim, src/testdir/test_expr.vim *** ../vim-7.4.1606/src/eval.c 2016-03-19 18:52:14.934587197 +0100 --- src/eval.c 2016-03-19 19:18:50.725839117 +0100 *************** *** 4555,4587 **** 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")); 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; ! } if (type == TYPE_NEQUAL) n1 = !n1; } --- 4555,4568 ---- else if (rettv->v_type == VAR_FUNC || var2.v_type == VAR_FUNC || rettv->v_type == VAR_PARTIAL || var2.v_type == VAR_PARTIAL) { ! if (type != TYPE_EQUAL && type != TYPE_NEQUAL) { ! EMSG(_("E694: Invalid operation for Funcrefs")); clear_tv(rettv); clear_tv(&var2); return FAIL; } ! n1 = tv_equal(rettv, &var2, FALSE, FALSE); if (type == TYPE_NEQUAL) n1 = !n1; } *************** *** 6203,6208 **** --- 6184,6202 ---- 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,6248 **** --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; --- 6228,6233 ---- *************** *** 6266,6271 **** --- 6251,6258 ---- #ifdef FEAT_JOB_CHANNEL return tv1->vval.v_channel == tv2->vval.v_channel; #endif + case VAR_FUNC: + case VAR_PARTIAL: case VAR_UNKNOWN: break; } *** ../vim-7.4.1606/src/testdir/test_alot.vim 2016-03-15 23:10:26.412712095 +0100 --- src/testdir/test_alot.vim 2016-03-19 19:05:13.826408885 +0100 *************** *** 5,10 **** --- 5,11 ---- source test_cursor_func.vim source test_delete.vim source test_ex_undo.vim + source test_expr.vim source test_expand.vim source test_feedkeys.vim source test_file_perm.vim *** ../vim-7.4.1606/src/testdir/test_expr.vim 2016-03-19 19:37:34.586049968 +0100 --- src/testdir/test_expr.vim 2016-03-19 19:22:02.375828831 +0100 *************** *** 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 *** ../vim-7.4.1606/src/version.c 2016-03-19 18:52:14.938587155 +0100 --- src/version.c 2016-03-19 19:30:36.770432953 +0100 *************** *** 750,751 **** --- 750,753 ---- { /* Add new patch number below this line */ + /**/ + 1607, /**/ -- From "know your smileys": :~) A man with a tape recorder up his nose /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///