diff src/vim9type.c @ 33949:84b93d95a952 v9.0.2169

patch 9.0.2169: Vim9: builtin funcs may accept a non-value Commit: https://github.com/vim/vim/commit/d8bf87c9fbd92fd6b837446e886d47e557adadbc Author: Ernie Rael <errael@raelity.com> Date: Sat Dec 16 14:03:33 2023 +0100 patch 9.0.2169: Vim9: builtin funcs may accept a non-value Problem: Vim9: builtin funcs may accept a non-value Solution: Restrict builtin functions that accept `type` This PR finishes off detection and prevention of using a type as a value. It takes care of builtin functions. However there are some builtin functions, that need to be able to handle types as well as non-args: instanceof(), type(), typename(), string(). A "bit", FE_X, is added to funcentry_T; when set, the builtin function can handle a type (class or type-alias) in addition to a value. Noteworthy change: Discovered that in compile_call() the builtin add() is compiled inline instead of calling the builtin. Had to add a check there. closes: #13688 Signed-off-by: Ernie Rael <errael@raelity.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Sat, 16 Dec 2023 14:15:03 +0100
parents aceaf677dd92
children ab6a70fad5b5
line wrap: on
line diff
--- a/src/vim9type.c
+++ b/src/vim9type.c
@@ -1867,6 +1867,8 @@ f_typename(typval_T *argvars, typval_T *
     int
 check_typval_is_value(typval_T *tv)
 {
+    if (tv == NULL)
+	return OK;
     if (tv->v_type == VAR_CLASS)
     {
         semsg(_(e_using_class_as_value_str), tv->vval.v_class->class_name);
@@ -1886,6 +1888,8 @@ check_typval_is_value(typval_T *tv)
     int
 check_type_is_value(type_T *type)
 {
+    if (type == NULL)
+	return OK;
     if (type->tt_type == VAR_CLASS)
     {
         semsg(_(e_using_class_as_value_str), type->tt_class->class_name);
@@ -1893,31 +1897,12 @@ check_type_is_value(type_T *type)
     }
     else if (type->tt_type == VAR_TYPEALIAS)
     {
-	// Not sure what could be done here to get a name
-	// TODO: MAYBE AN OPTIONAL ARGUMENT
+	// TODO: Not sure what could be done here to get a name.
+	//       Maybe an optional argument?
         emsg(_(e_using_typealias_as_var_val));
 	return FAIL;
     }
     return OK;
 }
 
-/*
- * Same as above, except check vartype_T.
- */
-    int
-check_vartype_is_value(vartype_T typ)
-{
-    if (typ == VAR_CLASS)
-    {
-	emsg(_(e_using_class_as_var_val));
-	return FAIL;
-    }
-    else if (typ == VAR_TYPEALIAS)
-    {
-        emsg(_(e_using_typealias_as_var_val));
-        return FAIL;
-    }
-    return OK;
-}
-
 #endif // FEAT_EVAL