patch 8.2.3229: Vim9: runtime and compile time type checks are not the same

Problem:    Vim9: runtime and compile time type checks are not the same.
Solution:   Add more runtime type checks for builtin functions. (Yegappan
            Lakshmanan, closes #8646)
diff --git a/src/evalwindow.c b/src/evalwindow.c
index d47680c..737ca7d 100644
--- a/src/evalwindow.c
+++ b/src/evalwindow.c
@@ -468,6 +468,9 @@
     if (rettv_list_alloc(rettv) != OK)
 	return;
 
+    if (in_vim9script() && check_for_opt_number_arg(argvars, 0) == FAIL)
+	return;
+
     if (argvars[0].v_type != VAR_UNKNOWN)
     {
 	// Information about one tab page
@@ -504,6 +507,9 @@
     if (rettv_list_alloc(rettv) != OK)
 	return;
 
+    if (in_vim9script() && check_for_opt_number_arg(argvars, 0) == FAIL)
+	return;
+
     if (argvars[0].v_type != VAR_UNKNOWN)
     {
 	wparg = win_id2wp(tv_get_number(&argvars[0]));
@@ -559,6 +565,10 @@
 
     if (rettv_list_alloc(rettv) == FAIL)
 	return;
+
+    if (in_vim9script() && check_for_opt_number_arg(argvars, 0) == FAIL)
+	return;
+
 #if defined(FEAT_GUI) \
 	|| (defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE)) \
 	|| defined(MSWIN)
@@ -624,6 +634,9 @@
     int		nr = 1;
     char_u	*arg;
 
+    if (in_vim9script() && check_for_opt_string_arg(argvars, 0) == FAIL)
+	return;
+
     if (argvars[0].v_type != VAR_UNKNOWN)
     {
 	arg = tv_get_string_chk(&argvars[0]);
@@ -672,9 +685,9 @@
     void
 f_win_execute(typval_T *argvars, typval_T *rettv)
 {
-    int		id = (int)tv_get_number(argvars);
+    int		id;
     tabpage_T	*tp;
-    win_T	*wp = win_id2wp_tp(id, &tp);
+    win_T	*wp;
     win_T	*save_curwin;
     tabpage_T	*save_curtab;
 
@@ -682,6 +695,14 @@
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
 
+    if (in_vim9script()
+	    && (check_for_number_arg(argvars, 0) == FAIL
+		|| check_for_string_or_list_arg(argvars, 1) == FAIL
+		|| check_for_opt_string_arg(argvars, 2) == FAIL))
+	return;
+
+    id = (int)tv_get_number(argvars);
+    wp = win_id2wp_tp(id, &tp);
     if (wp != NULL && tp != NULL)
     {
 	pos_T	curpos = wp->w_cursor;
@@ -705,6 +726,9 @@
     void
 f_win_findbuf(typval_T *argvars, typval_T *rettv)
 {
+    if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
+	return;
+
     if (rettv_list_alloc(rettv) != FAIL)
 	win_findbuf(argvars, rettv->vval.v_list);
 }
@@ -715,6 +739,12 @@
     void
 f_win_getid(typval_T *argvars, typval_T *rettv)
 {
+    if (in_vim9script()
+	    && (check_for_opt_number_arg(argvars, 0) == FAIL
+		|| (argvars[0].v_type != VAR_UNKNOWN
+		    && check_for_opt_number_arg(argvars, 1) == FAIL)))
+	return;
+
     rettv->vval.v_number = win_getid(argvars);
 }
 
@@ -726,8 +756,12 @@
 {
     win_T	*wp;
     tabpage_T   *tp;
-    int		id = tv_get_number(&argvars[0]);
+    int		id;
 
+    if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
+	return;
+
+    id = tv_get_number(&argvars[0]);
 #ifdef FEAT_CMDWIN
     if (cmdwin_type != 0)
     {
@@ -750,6 +784,9 @@
     void
 f_win_id2tabwin(typval_T *argvars, typval_T *rettv)
 {
+    if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
+	return;
+
     if (rettv_list_alloc(rettv) != FAIL)
 	win_id2tabwin(argvars, rettv->vval.v_list);
 }
@@ -760,6 +797,9 @@
     void
 f_win_id2win(typval_T *argvars, typval_T *rettv)
 {
+    if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
+	return;
+
     rettv->vval.v_number = win_id2win(argvars);
 }
 
@@ -774,6 +814,9 @@
     if (rettv_list_alloc(rettv) == FAIL)
 	return;
 
+    if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
+	return;
+
     wp = find_win_by_nr_or_id(&argvars[0]);
     list_append_number(rettv->vval.v_list, wp == NULL ? 0 : wp->w_winrow + 1);
     list_append_number(rettv->vval.v_list, wp == NULL ? 0 : wp->w_wincol + 1);
@@ -883,6 +926,10 @@
 
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
+
+    if (in_vim9script() && check_for_opt_number_arg(argvars, 0) == FAIL)
+	return;
+
     if (argvars[0].v_type != VAR_UNKNOWN)
     {
 	wp = find_win_by_nr_or_id(&argvars[0]);
@@ -934,6 +981,9 @@
 {
     win_T	*wp;
 
+    if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
+	return;
+
     wp = find_win_by_nr_or_id(&argvars[0]);
     if (wp == NULL)
 	rettv->vval.v_number = -1;
@@ -959,6 +1009,9 @@
 {
     win_T	*wp;
 
+    if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
+	return;
+
     wp = find_win_by_nr_or_id(&argvars[0]);
     if (wp == NULL)
 	rettv->vval.v_number = -1;
@@ -977,6 +1030,9 @@
     if (rettv_list_alloc(rettv) != OK)
 	return;
 
+    if (in_vim9script() && check_for_opt_number_arg(argvars, 0) == FAIL)
+	return;
+
     if (argvars[0].v_type == VAR_UNKNOWN)
 	tp = curtab;
     else
@@ -1007,6 +1063,9 @@
 {
     int		nr = 1;
 
+    if (in_vim9script() && check_for_opt_string_arg(argvars, 0) == FAIL)
+	return;
+
     nr = get_winnr(curtab, &argvars[0]);
     rettv->vval.v_number = nr;
 }
@@ -1052,6 +1111,9 @@
 {
     dict_T	*dict;
 
+    if (in_vim9script() && check_for_dict_arg(argvars, 0) == FAIL)
+	return;
+
     if (argvars[0].v_type != VAR_DICT
 	    || (dict = argvars[0].vval.v_dict) == NULL)
 	emsg(_(e_invarg));
@@ -1129,6 +1191,9 @@
 {
     win_T	*wp;
 
+    if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
+	return;
+
     wp = find_win_by_nr_or_id(&argvars[0]);
     if (wp == NULL)
 	rettv->vval.v_number = -1;