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
index 6e88c5c..e0f27a0 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -5667,7 +5667,7 @@
 #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
index af43fb9..f192506 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -2015,6 +2015,12 @@
 	    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
index e173869..34430d3 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -1599,6 +1599,7 @@
 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
index 7934e60..30dcb62 100644
--- a/src/testdir/test_execute_func.vim
+++ b/src/testdir/test_execute_func.vim
@@ -38,8 +38,6 @@
   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 @@
   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 @@
   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
index a02b198..54104eb 100644
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    103,
+/**/
     102,
 /**/
     101,