forked from aniani/vim
patch 8.1.1765: get(func, dict, def) does not work properly
Problem: get(func, dict, def) does not work properly. Solution: Handle NULL dict better. (Takuya Fujiwara, closes #4734)
This commit is contained in:
@@ -4197,6 +4197,7 @@ f_get(typval_T *argvars, typval_T *rettv)
|
||||
dictitem_T *di;
|
||||
dict_T *d;
|
||||
typval_T *tv = NULL;
|
||||
int what_is_dict = FALSE;
|
||||
|
||||
if (argvars[0].v_type == VAR_BLOB)
|
||||
{
|
||||
@@ -4270,7 +4271,11 @@ f_get(typval_T *argvars, typval_T *rettv)
|
||||
}
|
||||
}
|
||||
else if (STRCMP(what, "dict") == 0)
|
||||
{
|
||||
what_is_dict = TRUE;
|
||||
if (pt->pt_dict != NULL)
|
||||
rettv_dict_set(rettv, pt->pt_dict);
|
||||
}
|
||||
else if (STRCMP(what, "args") == 0)
|
||||
{
|
||||
rettv->v_type = VAR_LIST;
|
||||
@@ -4284,6 +4289,10 @@ f_get(typval_T *argvars, typval_T *rettv)
|
||||
}
|
||||
else
|
||||
semsg(_(e_invarg2), what);
|
||||
|
||||
// When {what} == "dict" and pt->pt_dict == NULL, evaluate the
|
||||
// third argument
|
||||
if (!what_is_dict)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,5 @@
|
||||
" Tests for getwinvar(), gettabvar() and gettabwinvar().
|
||||
" Tests for getwinvar(), gettabvar(), gettabwinvar() and get().
|
||||
|
||||
func Test_var()
|
||||
" Use strings to test for memory leaks. First, check that in an empty
|
||||
" window, gettabvar() returns the correct value
|
||||
@@ -102,3 +103,44 @@ func Test_gettabvar_in_tabline()
|
||||
close
|
||||
redrawstatus!
|
||||
endfunc
|
||||
|
||||
" Test get() function using default value.
|
||||
|
||||
" get({dict}, {key} [, {default}])
|
||||
func Test_get_dict()
|
||||
let d = {'foo': 42}
|
||||
call assert_equal(42, get(d, 'foo', 99))
|
||||
call assert_equal(999, get(d, 'bar', 999))
|
||||
endfunc
|
||||
|
||||
" get({list}, {idx} [, {default}])
|
||||
func Test_get_list()
|
||||
let l = [1,2,3]
|
||||
call assert_equal(1, get(l, 0, 999))
|
||||
call assert_equal(3, get(l, -1, 999))
|
||||
call assert_equal(999, get(l, 3, 999))
|
||||
endfunc
|
||||
|
||||
" get({blob}, {idx} [, {default}]) - in test_blob.vim
|
||||
|
||||
" get({lambda}, {what} [, {default}])
|
||||
func Test_get_lambda()
|
||||
let l:L = {-> 42}
|
||||
call assert_match('^<lambda>', get(l:L, 'name'))
|
||||
call assert_equal(l:L, get(l:L, 'func'))
|
||||
call assert_equal({'lambda has': 'no dict'}, get(l:L, 'dict', {'lambda has': 'no dict'}))
|
||||
call assert_equal(0, get(l:L, 'dict'))
|
||||
call assert_equal([], get(l:L, 'args'))
|
||||
endfunc
|
||||
|
||||
" get({func}, {what} [, {default}])
|
||||
func Test_get_func()
|
||||
let l:F = function('tr')
|
||||
call assert_equal('tr', get(l:F, 'name'))
|
||||
call assert_equal(l:F, get(l:F, 'func'))
|
||||
call assert_equal({'func has': 'no dict'}, get(l:F, 'dict', {'func has': 'no dict'}))
|
||||
call assert_equal(0, get(l:F, 'dict'))
|
||||
call assert_equal([], get(l:F, 'args'))
|
||||
endfunc
|
||||
|
||||
" get({partial}, {what} [, {default}]) - in test_partial.vim
|
||||
|
@@ -320,6 +320,11 @@ func Test_get_partial_items()
|
||||
call assert_equal('MyDictFunc', get(Func, 'name'))
|
||||
call assert_equal([], get(Func, 'args'))
|
||||
call assert_true(empty( get(Func, 'dict')))
|
||||
|
||||
let P = function('substitute', ['hello there', 'there'])
|
||||
let dict = {'partial has': 'no dict'}
|
||||
call assert_equal(dict, get(P, 'dict', dict))
|
||||
call assert_equal(0, get(l:P, 'dict'))
|
||||
endfunc
|
||||
|
||||
func Test_compare_partials()
|
||||
|
@@ -777,6 +777,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1765,
|
||||
/**/
|
||||
1764,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user