# HG changeset patch # User Bram Moolenaar # Date 1578509104 -3600 # Node ID fd1070ff696b7fc05f63f004f8bb70b04104b71a # Parent cd25e7f5434491749b24f3350fb15c1ce0f60756 patch 8.2.0103: using null object with execute() has strange effects Commit: https://github.com/vim/vim/commit/e2a8f0773e91685843c062b1e48259712d5f2213 Author: Bram Moolenaar Date: Wed Jan 8 19:32:18 2020 +0100 patch 8.2.0103: using null object with execute() has strange effects Problem: Using null object with execute() has strange effects. Solution: Give an error message ofr Job and Channel. diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -5667,7 +5667,7 @@ tv_get_string_buf_chk(typval_T *varp, ch #endif break; case VAR_UNKNOWN: - emsg(_("E908: using an invalid value as a String")); + emsg(_(e_inval_string)); break; } return NULL; diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -2015,6 +2015,12 @@ execute_common(typval_T *argvars, typval return; ++list->lv_refcount; } + else if (argvars[arg_off].v_type == VAR_JOB + || argvars[arg_off].v_type == VAR_CHANNEL) + { + emsg(_(e_inval_string)); + return; + } else { cmd = tv_get_string_chk(&argvars[arg_off]); diff --git a/src/globals.h b/src/globals.h --- a/src/globals.h +++ b/src/globals.h @@ -1599,6 +1599,7 @@ EXTERN char e_listreq[] INIT(= N_("E714: EXTERN char e_listblobreq[] INIT(= N_("E897: List or Blob required")); EXTERN char e_listdictarg[] INIT(= N_("E712: Argument of %s must be a List or Dictionary")); EXTERN char e_listdictblobarg[] INIT(= N_("E896: Argument of %s must be a List, Dictionary or Blob")); +EXTERN char e_inval_string[] INIT(= N_("E908: using an invalid value as a String")); #endif #ifdef FEAT_QUICKFIX EXTERN char e_readerrf[] INIT(= N_("E47: Error while reading errorfile")); diff --git a/src/testdir/test_execute_func.vim b/src/testdir/test_execute_func.vim --- a/src/testdir/test_execute_func.vim +++ b/src/testdir/test_execute_func.vim @@ -38,8 +38,6 @@ func Test_execute_string() call assert_equal("\nsomething", execute('echo "something"', 'silent!')) call assert_equal("", execute('burp', 'silent!')) call assert_fails('call execute("echo \"x\"", 3.4)', 'E806:') - - call assert_equal("", execute(test_null_string())) endfunc func Test_execute_list() @@ -50,7 +48,6 @@ func Test_execute_list() call assert_equal("\n0\n1\n2\n3", execute(l)) call assert_equal("", execute([])) - call assert_equal("", execute(test_null_list())) endfunc func Test_execute_does_not_change_col() @@ -132,3 +129,15 @@ func Test_win_execute_other_tab() tabclose unlet xyz endfunc + +func Test_execute_null() + call assert_equal("", execute(test_null_string())) + call assert_equal("", execute(test_null_list())) + call assert_fails('call execute(test_null_dict())', 'E731:') + call assert_fails('call execute(test_null_blob())', 'E976:') + call assert_fails('call execute(test_null_partial())','E729:') + if has('job') + call assert_fails('call execute(test_null_job())', 'E908:') + call assert_fails('call execute(test_null_channel())', 'E908:') + endif +endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -743,6 +743,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 103, +/**/ 102, /**/ 101,