summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-07-28 13:21:01 +0200
committerBram Moolenaar <Bram@vim.org>2019-07-28 13:21:01 +0200
commitf91aac5e3e3b8b1633d84eac2687ebbd76d8133b (patch)
tree6f3bc3154aca85970a460d1aab452f5980596311
parent5328cb8986d2620f45b41acf28778f8ce2f8cac1 (diff)
downloadvim-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.c13
-rw-r--r--src/testdir/test_getvar.vim44
-rw-r--r--src/testdir/test_partial.vim5
-rw-r--r--src/version.c2
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,