diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-07-28 13:21:01 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-07-28 13:21:01 +0200 |
commit | f91aac5e3e3b8b1633d84eac2687ebbd76d8133b (patch) | |
tree | 6f3bc3154aca85970a460d1aab452f5980596311 | |
parent | 5328cb8986d2620f45b41acf28778f8ce2f8cac1 (diff) | |
download | vim-git-f91aac5e3e3b8b1633d84eac2687ebbd76d8133b.tar.gz |
patch 8.1.1765: get(func, dict, def) does not work properlyv8.1.1765
Problem: get(func, dict, def) does not work properly.
Solution: Handle NULL dict better. (Takuya Fujiwara, closes #4734)
-rw-r--r-- | src/evalfunc.c | 13 | ||||
-rw-r--r-- | src/testdir/test_getvar.vim | 44 | ||||
-rw-r--r-- | src/testdir/test_partial.vim | 5 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 61 insertions, 3 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c index 804dbb47d..449bc67b4 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -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) - rettv_dict_set(rettv, pt->pt_dict); + { + 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,7 +4289,11 @@ f_get(typval_T *argvars, typval_T *rettv) } else semsg(_(e_invarg2), what); - return; + + // When {what} == "dict" and pt->pt_dict == NULL, evaluate the + // third argument + if (!what_is_dict) + return; } } else diff --git a/src/testdir/test_getvar.vim b/src/testdir/test_getvar.vim index d6b6b69aa..3b61d68eb 100644 --- a/src/testdir/test_getvar.vim +++ b/src/testdir/test_getvar.vim @@ -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 diff --git a/src/testdir/test_partial.vim b/src/testdir/test_partial.vim index b18051094..e7a7d058f 100644 --- a/src/testdir/test_partial.vim +++ b/src/testdir/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() diff --git a/src/version.c b/src/version.c index 6619c7b26..2ec8f4db7 100644 --- a/src/version.c +++ b/src/version.c @@ -778,6 +778,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1765, +/**/ 1764, /**/ 1763, |