diff src/typval.c @ 25314:7e620652bd13 v8.2.3194

patch 8.2.3194: Vim9: argument types are not checked at compile time Commit: https://github.com/vim/vim/commit/cd9172077bc8c0aafddf2e5367cc0ae2c00c8ff7 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Wed Jul 21 19:09:09 2021 +0200 patch 8.2.3194: Vim9: argument types are not checked at compile time Problem: Vim9: argument types are not checked at compile time. Solution: Add several more type checks, simplify some. (Yegappan Lakshmanan, closes #8598)
author Bram Moolenaar <Bram@vim.org>
date Wed, 21 Jul 2021 19:15:04 +0200
parents 4d3c68196d05
children e2be9f3c5907
line wrap: on
line diff
--- a/src/typval.c
+++ b/src/typval.c
@@ -575,31 +575,63 @@ check_for_string_or_number_arg(typval_T 
 }
 
 /*
- * Give an error and return FAIL unless "args[idx]" is a string or
- * a number (buffer)
+ * Check for an optional string or number argument at 'idx'.
+ */
+    int
+check_for_opt_string_or_number_arg(typval_T *args, int idx)
+{
+    return (args[idx].v_type == VAR_UNKNOWN
+	    || check_for_string_or_number_arg(args, idx) != FAIL);
+}
+
+/*
+ * Give an error and return FAIL unless "args[idx]" is a buffer number.
+ * Buffer number can be a number or a string.
  */
     int
 check_for_buffer_arg(typval_T *args, int idx)
 {
-    if (args[idx].v_type != VAR_STRING && args[idx].v_type != VAR_NUMBER)
-    {
-	if (idx >= 0)
-	    semsg(_(e_string_required_for_argument_nr), idx + 1);
-	else
-	    emsg(_(e_stringreq));
-	return FAIL;
-    }
-    return OK;
+    return check_for_string_or_number_arg(args, idx);
+}
+
+/*
+ * Check for an optional buffer argument at 'idx'
+ */
+    int
+check_for_opt_buffer_arg(typval_T *args, int idx)
+{
+    return (args[idx].v_type == VAR_UNKNOWN
+	    || check_for_buffer_arg(args, idx));
+}
+
+/*
+ * Give an error and return FAIL unless "args[idx]" is a line number.
+ * Line number can be a number or a string.
+ */
+    int
+check_for_lnum_arg(typval_T *args, int idx)
+{
+    return check_for_string_or_number_arg(args, idx);
+}
+
+/*
+ * Check for an optional line number argument at 'idx'
+ */
+    int
+check_for_opt_lnum_arg(typval_T *args, int idx)
+{
+    return (args[idx].v_type == VAR_UNKNOWN
+	    || check_for_lnum_arg(args, idx));
 }
 
 /*
  * Give an error and return FAIL unless "args[idx]" is a string or
- * a number (line)
+ * a blob.
  */
     int
-check_for_lnum_arg(typval_T *args, int idx)
+check_for_string_or_blob_arg(typval_T *args, int idx)
 {
-    if (args[idx].v_type != VAR_STRING && args[idx].v_type != VAR_NUMBER)
+    if (args[idx].v_type != VAR_STRING && args[idx].v_type != VAR_BLOB)
     {
 	if (idx >= 0)
 	    semsg(_(e_string_required_for_argument_nr), idx + 1);
@@ -612,14 +644,12 @@ check_for_lnum_arg(typval_T *args, int i
 
 /*
  * Give an error and return FAIL unless "args[idx]" is a string or
- * a number (line)
+ * a list.
  */
     int
-check_for_opt_lnum_arg(typval_T *args, int idx)
+check_for_string_or_list_arg(typval_T *args, int idx)
 {
-    if (args[idx].v_type != VAR_UNKNOWN
-	    && args[idx].v_type != VAR_STRING
-	    && args[idx].v_type != VAR_NUMBER)
+    if (args[idx].v_type != VAR_STRING && args[idx].v_type != VAR_LIST)
     {
 	if (idx >= 0)
 	    semsg(_(e_string_required_for_argument_nr), idx + 1);
@@ -631,23 +661,15 @@ check_for_opt_lnum_arg(typval_T *args, i
 }
 
 /*
- * Check for an optional string or number argument at 'idx'
+ * Give an error and return FAIL unless "args[idx]" is a buffer
+ * number or a dict.
  */
     int
-check_for_opt_string_or_number_arg(typval_T *args, int idx)
+check_for_buffer_or_dict_arg(typval_T *args, int idx)
 {
-    return (args[idx].v_type == VAR_UNKNOWN
-	    || check_for_string_or_number_arg(args, idx) != FAIL);
-}
-
-/*
- * Give an error and return FAIL unless "args[idx]" is a string or
- * a blob.
- */
-    int
-check_for_string_or_blob_arg(typval_T *args, int idx)
-{
-    if (args[idx].v_type != VAR_STRING && args[idx].v_type != VAR_BLOB)
+    if (args[idx].v_type != VAR_STRING
+	    && args[idx].v_type != VAR_NUMBER
+	    && args[idx].v_type != VAR_DICT)
     {
 	if (idx >= 0)
 	    semsg(_(e_string_required_for_argument_nr), idx + 1);