diff options
Diffstat (limited to 'data/vim/patches/8.1.0888')
-rw-r--r-- | data/vim/patches/8.1.0888 | 385 |
1 files changed, 385 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0888 b/data/vim/patches/8.1.0888 new file mode 100644 index 000000000..967fa4a3d --- /dev/null +++ b/data/vim/patches/8.1.0888 @@ -0,0 +1,385 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.0888 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.0888 +Problem: The a: dict is not immutable as documented. +Solution: Make the a:dict immutable, add a test. (Ozaki Kiichi, Yasuhiro + Matsumoto, closes #3929) +Files: src/eval.c, src/userfunc.c, src/testdir/test_let.vim, + src/testdir/test_listdict.vim + + +*** ../vim-8.1.0887/src/eval.c 2019-01-26 17:28:22.220599167 +0100 +--- src/eval.c 2019-02-10 22:04:07.884987095 +0100 +*************** +*** 2092,2105 **** + + if (lp->ll_di == NULL) + { +! /* Can't add "v:" variable. */ +! if (lp->ll_dict == &vimvardict) + { + semsg(_(e_illvar), name); + return NULL; + } + +! /* Key does not exist in dict: may need to add it. */ + if (*p == '[' || *p == '.' || unlet) + { + if (!quiet) +--- 2092,2106 ---- + + if (lp->ll_di == NULL) + { +! // Can't add "v:" or "a:" variable. +! if (lp->ll_dict == &vimvardict +! || &lp->ll_dict->dv_hashtab == get_funccal_args_ht()) + { + semsg(_(e_illvar), name); + return NULL; + } + +! // Key does not exist in dict: may need to add it. + if (*p == '[' || *p == '.' || unlet) + { + if (!quiet) +*************** +*** 7919,7932 **** + } + else /* add a new variable */ + { +! /* Can't add "v:" variable. */ +! if (ht == &vimvarht) + { + semsg(_(e_illvar), name); + return; + } + +! /* Make sure the variable name is valid. */ + if (!valid_varname(varname)) + return; + +--- 7920,7933 ---- + } + else /* add a new variable */ + { +! // Can't add "v:" or "a:" variable. +! if (ht == &vimvarht || ht == get_funccal_args_ht()) + { + semsg(_(e_illvar), name); + return; + } + +! // Make sure the variable name is valid. + if (!valid_varname(varname)) + return; + +*** ../vim-8.1.0887/src/userfunc.c 2019-02-02 14:02:26.012222133 +0100 +--- src/userfunc.c 2019-02-10 22:00:22.410776043 +0100 +*************** +*** 772,778 **** + v = &fc->fixvar[fixvar_idx++].var; + name = v->di_key; + STRCPY(name, "self"); +! v->di_flags = DI_FLAGS_RO + DI_FLAGS_FIX; + hash_add(&fc->l_vars.dv_hashtab, DI2HIKEY(v)); + v->di_tv.v_type = VAR_DICT; + v->di_tv.v_lock = 0; +--- 772,778 ---- + v = &fc->fixvar[fixvar_idx++].var; + name = v->di_key; + STRCPY(name, "self"); +! v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX; + hash_add(&fc->l_vars.dv_hashtab, DI2HIKEY(v)); + v->di_tv.v_type = VAR_DICT; + v->di_tv.v_lock = 0; +*************** +*** 788,793 **** +--- 788,794 ---- + init_var_dict(&fc->l_avars, &fc->l_avars_var, VAR_SCOPE); + add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "0", + (varnumber_T)(argcount - fp->uf_args.ga_len)); ++ fc->l_avars.dv_lock = VAR_FIXED; + /* Use "name" to avoid a warning from some compiler that checks the + * destination size. */ + v = &fc->fixvar[fixvar_idx++].var; +*** ../vim-8.1.0887/src/testdir/test_let.vim 2017-08-04 22:16:54.000000000 +0200 +--- src/testdir/test_let.vim 2019-02-10 22:00:22.410776043 +0100 +*************** +*** 25,27 **** +--- 25,148 ---- + let s = "\na #1\nb #2" + call assert_equal(s, out) + endfunc ++ ++ func s:set_arg1(a) abort ++ let a:a = 1 ++ endfunction ++ ++ func s:set_arg2(a) abort ++ let a:b = 1 ++ endfunction ++ ++ func s:set_arg3(a) abort ++ let b = a: ++ let b['a'] = 1 ++ endfunction ++ ++ func s:set_arg4(a) abort ++ let b = a: ++ let b['a'] = 1 ++ endfunction ++ ++ func s:set_arg5(a) abort ++ let b = a: ++ let b['a'][0] = 1 ++ endfunction ++ ++ func s:set_arg6(a) abort ++ let a:a[0] = 1 ++ endfunction ++ ++ func s:set_arg7(a) abort ++ call extend(a:, {'a': 1}) ++ endfunction ++ ++ func s:set_arg8(a) abort ++ call extend(a:, {'b': 1}) ++ endfunction ++ ++ func s:set_arg9(a) abort ++ let a:['b'] = 1 ++ endfunction ++ ++ func s:set_arg10(a) abort ++ let b = a: ++ call extend(b, {'a': 1}) ++ endfunction ++ ++ func s:set_arg11(a) abort ++ let b = a: ++ call extend(b, {'b': 1}) ++ endfunction ++ ++ func s:set_arg12(a) abort ++ let b = a: ++ let b['b'] = 1 ++ endfunction ++ ++ func Test_let_arg_fail() ++ call assert_fails('call s:set_arg1(1)', 'E46:') ++ call assert_fails('call s:set_arg2(1)', 'E461:') ++ call assert_fails('call s:set_arg3(1)', 'E46:') ++ call assert_fails('call s:set_arg4(1)', 'E46:') ++ call assert_fails('call s:set_arg5(1)', 'E46:') ++ call s:set_arg6([0]) ++ call assert_fails('call s:set_arg7(1)', 'E742:') ++ call assert_fails('call s:set_arg8(1)', 'E742:') ++ call assert_fails('call s:set_arg9(1)', 'E461:') ++ call assert_fails('call s:set_arg10(1)', 'E742:') ++ call assert_fails('call s:set_arg11(1)', 'E742:') ++ call assert_fails('call s:set_arg12(1)', 'E461:') ++ endfunction ++ ++ func s:set_varg1(...) abort ++ let a:000 = [] ++ endfunction ++ ++ func s:set_varg2(...) abort ++ let a:000[0] = 1 ++ endfunction ++ ++ func s:set_varg3(...) abort ++ let a:000 += [1] ++ endfunction ++ ++ func s:set_varg4(...) abort ++ call add(a:000, 1) ++ endfunction ++ ++ func s:set_varg5(...) abort ++ let a:000[0][0] = 1 ++ endfunction ++ ++ func s:set_varg6(...) abort ++ let b = a:000 ++ let b[0] = 1 ++ endfunction ++ ++ func s:set_varg7(...) abort ++ let b = a:000 ++ let b += [1] ++ endfunction ++ ++ func s:set_varg8(...) abort ++ let b = a:000 ++ call add(b, 1) ++ endfunction ++ ++ func s:set_varg9(...) abort ++ let b = a:000 ++ let b[0][0] = 1 ++ endfunction ++ ++ func Test_let_varg_fail() ++ call assert_fails('call s:set_varg1(1)', 'E46:') ++ call assert_fails('call s:set_varg2(1)', 'E742:') ++ call assert_fails('call s:set_varg3(1)', 'E46:') ++ call assert_fails('call s:set_varg4(1)', 'E742:') ++ call s:set_varg5([0]) ++ call assert_fails('call s:set_varg6(1)', 'E742:') ++ " call assert_fails('call s:set_varg7(1)', 'E46:') ++ call assert_fails('call s:set_varg8(1)', 'E742:') ++ call s:set_varg9([0]) ++ endfunction +*** ../vim-8.1.0887/src/testdir/test_listdict.vim 2019-01-23 21:14:59.165314597 +0100 +--- src/testdir/test_listdict.vim 2019-02-10 22:05:27.764369544 +0100 +*************** +*** 500,516 **** + + " No remove() of write-protected scope-level variable + func Tfunc1(this_is_a_long_parameter_name) +! call assert_fails("call remove(a:, 'this_is_a_long_parameter_name')", 'E795') + endfunc + func Test_dict_scope_var_remove() + call Tfunc1('testval') + endfunc + + " No extend() of write-protected scope-level variable + func Tfunc2(this_is_a_long_parameter_name) + call assert_fails("call extend(a:, {'this_is_a_long_parameter_name': 1234})", 'E742') + endfunc +! func Test_dict_scope_var_extend() + call Tfunc2('testval') + endfunc + +--- 500,520 ---- + + " No remove() of write-protected scope-level variable + func Tfunc1(this_is_a_long_parameter_name) +! call assert_fails("call remove(a:, 'this_is_a_long_parameter_name')", 'E742') + endfunc + func Test_dict_scope_var_remove() + call Tfunc1('testval') + endfunc + + " No extend() of write-protected scope-level variable ++ func Test_dict_scope_var_extend() ++ call assert_fails("call extend(a:, {'this_is_a_long_parameter_name': 1234})", 'E742') ++ endfunc ++ + func Tfunc2(this_is_a_long_parameter_name) + call assert_fails("call extend(a:, {'this_is_a_long_parameter_name': 1234})", 'E742') + endfunc +! func Test_dict_scope_var_extend_overwrite() + call Tfunc2('testval') + endfunc + +*************** +*** 651,653 **** +--- 655,729 ---- + call assert_fails("call extend(d, d, 'error')", 'E737:') + call assert_equal({'a': {'b': 'B'}}, d) + endfunc ++ ++ func s:check_scope_dict(x, fixed) ++ func s:gen_cmd(cmd, x) ++ return substitute(a:cmd, '\<x\ze:', a:x, 'g') ++ endfunc ++ ++ let cmd = s:gen_cmd('let x:foo = 1', a:x) ++ if a:fixed ++ call assert_fails(cmd, 'E461') ++ else ++ exe cmd ++ exe s:gen_cmd('call assert_equal(1, x:foo)', a:x) ++ endif ++ ++ let cmd = s:gen_cmd('let x:["bar"] = 2', a:x) ++ if a:fixed ++ call assert_fails(cmd, 'E461') ++ else ++ exe cmd ++ exe s:gen_cmd('call assert_equal(2, x:bar)', a:x) ++ endif ++ ++ let cmd = s:gen_cmd('call extend(x:, {"baz": 3})', a:x) ++ if a:fixed ++ call assert_fails(cmd, 'E742') ++ else ++ exe cmd ++ exe s:gen_cmd('call assert_equal(3, x:baz)', a:x) ++ endif ++ ++ if a:fixed ++ if a:x ==# 'a' ++ call assert_fails('unlet a:x', 'E795') ++ call assert_fails('call remove(a:, "x")', 'E742') ++ elseif a:x ==# 'v' ++ call assert_fails('unlet v:count', 'E795') ++ call assert_fails('call remove(v:, "count")', 'E742') ++ endif ++ else ++ exe s:gen_cmd('unlet x:foo', a:x) ++ exe s:gen_cmd('unlet x:bar', a:x) ++ exe s:gen_cmd('call remove(x:, "baz")', a:x) ++ endif ++ ++ delfunc s:gen_cmd ++ endfunc ++ ++ func Test_scope_dict() ++ " Test for g: ++ call s:check_scope_dict('g', v:false) ++ ++ " Test for s: ++ call s:check_scope_dict('s', v:false) ++ ++ " Test for l: ++ call s:check_scope_dict('l', v:false) ++ ++ " Test for a: ++ call s:check_scope_dict('a', v:true) ++ ++ " Test for b: ++ call s:check_scope_dict('b', v:false) ++ ++ " Test for w: ++ call s:check_scope_dict('w', v:false) ++ ++ " Test for t: ++ call s:check_scope_dict('t', v:false) ++ ++ " Test for v: ++ call s:check_scope_dict('v', v:true) ++ endfunc +*** ../vim-8.1.0887/src/version.c 2019-02-10 21:55:23.109307873 +0100 +--- src/version.c 2019-02-10 22:13:09.808900292 +0100 +*************** +*** 785,786 **** +--- 785,788 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 888, + /**/ + +-- +ARTHUR: CHARGE! + [The mighty ARMY charges. Thundering noise of feet. Clatter of coconuts. + Shouts etc. Suddenly there is a wail of a siren and a couple of police + cars roar round in front of the charging ARMY and the POLICE leap out and + stop them. TWO POLICEMAN and the HISTORIAN'S WIFE. Black Marias skid up + behind them.] +HISTORIAN'S WIFE: They're the ones, I'm sure. + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// 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 /// |