mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00: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:
		| @@ -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) { | ||||||
|  |         what_is_dict = true; | ||||||
|  |         if (pt->pt_dict != NULL) { | ||||||
|           tv_dict_set_ret(rettv, pt->pt_dict); |           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,8 +9656,13 @@ static void f_get(typval_T *argvars, typval_T *rettv, FunPtr fptr) | |||||||
|       } else { |       } else { | ||||||
|         EMSG2(_(e_invarg2), what); |         EMSG2(_(e_invarg2), what); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|  |       // When {what} == "dict" and pt->pt_dict == NULL, evaluate the | ||||||
|  |       // third argument | ||||||
|  |       if (!what_is_dict) { | ||||||
|         return; |         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() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jan Edmund Lazo
					Jan Edmund Lazo