Patch 7.4.1564
Problem: An empty list in function() causes an error.
Solution: Handle an empty list like there is no list of arguments.
Files: src/eval.c, src/testdir/test_partial.vim
*** ../vim-7.4.1563/src/eval.c 2016-03-14 23:04:49.698923062 +0100
--- src/eval.c 2016-03-15 12:30:04.205184835 +0100
***************
*** 11786,11791 ****
--- 11786,11795 ----
EMSG2(_("E700: Unknown function: %s"), s);
else
{
+ int dict_idx = 0;
+ int arg_idx = 0;
+ list_T *list = NULL;
+
if (STRNCMP(s, "s:", 2) == 0 || STRNCMP(s, "<SID>", 5) == 0)
{
char sid_buf[25];
***************
*** 11808,11817 ****
if (argvars[1].v_type != VAR_UNKNOWN)
{
- partial_T *pt;
- int dict_idx = 0;
- int arg_idx = 0;
-
if (argvars[2].v_type != VAR_UNKNOWN)
{
/* function(name, [args], dict) */
--- 11812,11817 ----
***************
*** 11824,11850 ****
else
/* function(name, [args]) */
arg_idx = 1;
! if (dict_idx > 0 && (argvars[dict_idx].v_type != VAR_DICT
! || argvars[dict_idx].vval.v_dict == NULL))
{
! EMSG(_("E922: expected a dict"));
! vim_free(name);
! return;
}
! if (arg_idx > 0 && (argvars[arg_idx].v_type != VAR_LIST
! || argvars[arg_idx].vval.v_list == NULL))
{
! EMSG(_("E923: Second argument of function() must be a list or a
dict"));
! vim_free(name);
! return;
}
- pt = (partial_T *)alloc_clear(sizeof(partial_T));
if (pt != NULL)
{
if (arg_idx > 0)
{
- list_T *list = argvars[arg_idx].vval.v_list;
listitem_T *li;
int i = 0;
--- 11824,11861 ----
else
/* function(name, [args]) */
arg_idx = 1;
! if (dict_idx > 0)
{
! if (argvars[dict_idx].v_type != VAR_DICT)
! {
! EMSG(_("E922: expected a dict"));
! vim_free(name);
! return;
! }
! if (argvars[dict_idx].vval.v_dict == NULL)
! dict_idx = 0;
}
! if (arg_idx > 0)
{
! if (argvars[arg_idx].v_type != VAR_LIST)
! {
! EMSG(_("E923: Second argument of function() must be a list
or a dict"));
! vim_free(name);
! return;
! }
! list = argvars[arg_idx].vval.v_list;
! if (list == NULL || list->lv_len == 0)
! arg_idx = 0;
}
+ }
+ if (dict_idx > 0 || arg_idx > 0)
+ {
+ partial_T *pt = (partial_T *)alloc_clear(sizeof(partial_T));
if (pt != NULL)
{
if (arg_idx > 0)
{
listitem_T *li;
int i = 0;
*** ../vim-7.4.1563/src/testdir/test_partial.vim 2016-03-15
11:05:40.565905732 +0100
--- src/testdir/test_partial.vim 2016-03-15 12:34:11.102610386 +0100
***************
*** 19,24 ****
--- 19,27 ----
call assert_equal("foo/bar/xxx", Cb("xxx"))
call assert_equal("foo/bar/yyy", call(Cb, ["yyy"]))
+ let Cb = function('MyFunc', [])
+ call assert_equal("a/b/c", Cb("a", "b", "c"))
+
let Sort = function('MySort', [1])
call assert_equal([1, 2, 3], sort([3, 1, 2], Sort))
let Sort = function('MySort', [0])
***************
*** 34,43 ****
let Cb = function('MyDictFunc', ["foo", "bar"], dict)
call assert_equal("hello/foo/bar", Cb())
call assert_fails('Cb("xxx")', 'E492:')
let Cb = function('MyDictFunc', ["foo"], dict)
call assert_equal("hello/foo/xxx", Cb("xxx"))
call assert_fails('Cb()', 'E492:')
let Cb = function('MyDictFunc', dict)
call assert_equal("hello/xxx/yyy", Cb("xxx", "yyy"))
! call assert_fails('Cb()', 'E492:')
endfunc
--- 37,52 ----
let Cb = function('MyDictFunc', ["foo", "bar"], dict)
call assert_equal("hello/foo/bar", Cb())
call assert_fails('Cb("xxx")', 'E492:')
+
let Cb = function('MyDictFunc', ["foo"], dict)
call assert_equal("hello/foo/xxx", Cb("xxx"))
call assert_fails('Cb()', 'E492:')
+
+ let Cb = function('MyDictFunc', [], dict)
+ call assert_equal("hello/ttt/xxx", Cb("ttt", "xxx"))
+ call assert_fails('Cb("yyy")', 'E492:')
+
let Cb = function('MyDictFunc', dict)
call assert_equal("hello/xxx/yyy", Cb("xxx", "yyy"))
! call assert_fails('Cb("fff")', 'E492:')
endfunc
*** ../vim-7.4.1563/src/version.c 2016-03-15 11:05:40.569905689 +0100
--- src/version.c 2016-03-15 12:34:23.458481555 +0100
***************
*** 745,746 ****
--- 745,748 ----
{ /* Add new patch number below this line */
+ /**/
+ 1564,
/**/
--
A fine is a tax for doing wrong. A tax is a fine for doing well.
/// Bram Moolenaar -- [email protected] -- 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 ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.