diff src/filepath.c @ 25384:e8e2c4d33b9b v8.2.3229

patch 8.2.3229: Vim9: runtime and compile time type checks are not the same Commit: https://github.com/vim/vim/commit/4490ec4e839e45a2e6923c265c7e9e64c240b805 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Tue Jul 27 22:00:44 2021 +0200 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)
author Bram Moolenaar <Bram@vim.org>
date Tue, 27 Jul 2021 22:15:06 +0200
parents 1cde96e768e4
children 460790b520dd
line wrap: on
line diff
--- a/src/filepath.c
+++ b/src/filepath.c
@@ -834,6 +834,11 @@ f_delete(typval_T *argvars, typval_T *re
     if (check_restricted() || check_secure())
 	return;
 
+    if (in_vim9script()
+	    && (check_for_string_arg(argvars, 0) == FAIL
+		|| check_for_opt_string_arg(argvars, 1) == FAIL))
+	return;
+
     name = tv_get_string(&argvars[0]);
     if (name == NULL || *name == NUL)
     {
@@ -899,6 +904,7 @@ f_filereadable(typval_T *argvars, typval
 
     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
 	return;
+
 #ifndef O_NONBLOCK
 # define O_NONBLOCK 0
 #endif
@@ -946,7 +952,11 @@ findfilendir(
 
     rettv->vval.v_string = NULL;
     rettv->v_type = VAR_STRING;
-    if (in_vim9script() && check_for_nonempty_string_arg(argvars, 0) == FAIL)
+    if (in_vim9script()
+	    && (check_for_nonempty_string_arg(argvars, 0) == FAIL
+		|| check_for_opt_string_arg(argvars, 1) == FAIL
+		|| (argvars[1].v_type != VAR_UNKNOWN
+		    && check_for_opt_number_arg(argvars, 2) == FAIL)))
 	return;
 
 #ifdef FEAT_SEARCHPATH
@@ -1027,9 +1037,11 @@ f_fnamemodify(typval_T *argvars, typval_
     char_u	*fbuf = NULL;
     char_u	buf[NUMBUFLEN];
 
-    if (in_vim9script() && (check_for_string_arg(argvars, 0) == FAIL
-	    || check_for_string_arg(argvars, 1) == FAIL))
+    if (in_vim9script()
+	    && (check_for_string_arg(argvars, 0) == FAIL
+		|| check_for_string_arg(argvars, 1) == FAIL))
 	return;
+
     fname = tv_get_string_chk(&argvars[0]);
     mods = tv_get_string_buf_chk(&argvars[1], buf);
     if (mods == NULL || fname == NULL)
@@ -1077,6 +1089,12 @@ f_getcwd(typval_T *argvars, typval_T *re
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
 
+    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;
+
     if (argvars[0].v_type == VAR_NUMBER
 	    && argvars[0].vval.v_number == -1
 	    && argvars[1].v_type == VAR_UNKNOWN)
@@ -1141,6 +1159,7 @@ f_getfperm(typval_T *argvars, typval_T *
 
     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
 	return;
+
     fname = tv_get_string(&argvars[0]);
 
     rettv->v_type = VAR_STRING;
@@ -1190,6 +1209,7 @@ f_getftime(typval_T *argvars, typval_T *
 
     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
 	return;
+
     fname = tv_get_string(&argvars[0]);
     if (mch_stat((char *)fname, &st) >= 0)
 	rettv->vval.v_number = (varnumber_T)st.st_mtime;
@@ -1236,6 +1256,7 @@ f_getftype(typval_T *argvars, typval_T *
 
     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
 	return;
+
     fname = tv_get_string(&argvars[0]);
 
     rettv->v_type = VAR_STRING;
@@ -1311,9 +1332,12 @@ f_glob(typval_T *argvars, typval_T *rett
 f_glob2regpat(typval_T *argvars, typval_T *rettv)
 {
     char_u	buf[NUMBUFLEN];
-    char_u	*pat = tv_get_string_buf_chk_strict(&argvars[0], buf,
-							      in_vim9script());
-
+    char_u	*pat;
+
+    if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
+	return;
+
+    pat = tv_get_string_buf_chk_strict(&argvars[0], buf, in_vim9script());
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = (pat == NULL)
 			 ? NULL : file_pat_to_reg_pat(pat, NULL, NULL, FALSE);
@@ -1382,6 +1406,9 @@ f_globpath(typval_T *argvars, typval_T *
     void
 f_isdirectory(typval_T *argvars, typval_T *rettv)
 {
+    if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
+	return;
+
     rettv->vval.v_number = mch_isdir(tv_get_string(&argvars[0]));
 }
 
@@ -1429,6 +1456,13 @@ f_mkdir(typval_T *argvars, typval_T *ret
     if (check_restricted() || check_secure())
 	return;
 
+    if (in_vim9script()
+	    && (check_for_nonempty_string_arg(argvars, 0) == FAIL
+		|| check_for_opt_string_arg(argvars, 1) == FAIL
+		|| (argvars[1].v_type != VAR_UNKNOWN
+		    && check_for_opt_number_arg(argvars, 2) == FAIL)))
+	return;
+
     dir = tv_get_string_buf(&argvars[0], buf);
     if (*dir == NUL)
 	return;
@@ -1919,6 +1953,9 @@ read_file_or_blob(typval_T *argvars, typ
     void
 f_readblob(typval_T *argvars, typval_T *rettv)
 {
+    if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
+	return;
+
     read_file_or_blob(argvars, rettv, TRUE);
 }
 
@@ -1928,6 +1965,13 @@ f_readblob(typval_T *argvars, typval_T *
     void
 f_readfile(typval_T *argvars, typval_T *rettv)
 {
+    if (in_vim9script()
+	    && (check_for_nonempty_string_arg(argvars, 0) == FAIL
+		|| check_for_opt_string_arg(argvars, 1) == FAIL
+		|| (argvars[1].v_type != VAR_UNKNOWN
+		    && check_for_opt_number_arg(argvars, 2) == FAIL)))
+	return;
+
     read_file_or_blob(argvars, rettv, FALSE);
 }
 
@@ -1942,6 +1986,9 @@ f_resolve(typval_T *argvars, typval_T *r
     char_u	*buf = NULL;
 #endif
 
+    if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
+	return;
+
     p = tv_get_string(&argvars[0]);
 #ifdef FEAT_SHORTCUT
     {
@@ -2497,6 +2544,11 @@ f_browsedir(typval_T *argvars UNUSED, ty
     char_u	*initdir;
     char_u	buf[NUMBUFLEN];
 
+    if (in_vim9script()
+	    && (check_for_string_arg(argvars, 0) == FAIL
+		|| check_for_string_arg(argvars, 1) == FAIL))
+	return;
+
     title = tv_get_string_chk(&argvars[0]);
     initdir = tv_get_string_buf_chk(&argvars[1], buf);