mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
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 vim/vim#4734)
f91aac5e3e
This commit is contained in:
parent
fe2ada7375
commit
98d389ce55
@ -9600,6 +9600,7 @@ static void f_get(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
|||||||
dictitem_T *di;
|
dictitem_T *di;
|
||||||
dict_T *d;
|
dict_T *d;
|
||||||
typval_T *tv = NULL;
|
typval_T *tv = NULL;
|
||||||
|
bool what_is_dict = false;
|
||||||
|
|
||||||
if (argvars[0].v_type == VAR_LIST) {
|
if (argvars[0].v_type == VAR_LIST) {
|
||||||
if ((l = argvars[0].vval.v_list) != NULL) {
|
if ((l = argvars[0].vval.v_list) != NULL) {
|
||||||
@ -9641,7 +9642,10 @@ static void f_get(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
|||||||
func_ref(rettv->vval.v_string);
|
func_ref(rettv->vval.v_string);
|
||||||
}
|
}
|
||||||
} else if (strcmp(what, "dict") == 0) {
|
} else if (strcmp(what, "dict") == 0) {
|
||||||
tv_dict_set_ret(rettv, pt->pt_dict);
|
what_is_dict = true;
|
||||||
|
if (pt->pt_dict != NULL) {
|
||||||
|
tv_dict_set_ret(rettv, pt->pt_dict);
|
||||||
|
}
|
||||||
} else if (strcmp(what, "args") == 0) {
|
} else if (strcmp(what, "args") == 0) {
|
||||||
rettv->v_type = VAR_LIST;
|
rettv->v_type = VAR_LIST;
|
||||||
if (tv_list_alloc_ret(rettv, pt->pt_argc) != NULL) {
|
if (tv_list_alloc_ret(rettv, pt->pt_argc) != NULL) {
|
||||||
@ -9652,7 +9656,12 @@ static void f_get(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
|||||||
} else {
|
} else {
|
||||||
EMSG2(_(e_invarg2), what);
|
EMSG2(_(e_invarg2), what);
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
|
// When {what} == "dict" and pt->pt_dict == NULL, evaluate the
|
||||||
|
// third argument
|
||||||
|
if (!what_is_dict) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
EMSG2(_(e_listdictarg), "get()");
|
EMSG2(_(e_listdictarg), "get()");
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
" Tests for getwinvar(), gettabvar() and gettabwinvar().
|
" Tests for getwinvar(), gettabvar(), gettabwinvar() and get().
|
||||||
|
|
||||||
func Test_var()
|
func Test_var()
|
||||||
" Use strings to test for memory leaks. First, check that in an empty
|
" Use strings to test for memory leaks. First, check that in an empty
|
||||||
" window, gettabvar() returns the correct value
|
" window, gettabvar() returns the correct value
|
||||||
@ -102,3 +103,44 @@ func Test_gettabvar_in_tabline()
|
|||||||
close
|
close
|
||||||
redrawstatus!
|
redrawstatus!
|
||||||
endfunc
|
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
|
||||||
|
@ -285,6 +285,11 @@ func Test_get_partial_items()
|
|||||||
call assert_equal('MyDictFunc', get(Func, 'name'))
|
call assert_equal('MyDictFunc', get(Func, 'name'))
|
||||||
call assert_equal([], get(Func, 'args'))
|
call assert_equal([], get(Func, 'args'))
|
||||||
call assert_true(empty( get(Func, 'dict')))
|
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
|
endfunc
|
||||||
|
|
||||||
func Test_compare_partials()
|
func Test_compare_partials()
|
||||||
|
Loading…
Reference in New Issue
Block a user