1
0
forked from aniani/vim

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>
This commit is contained in:
Ernie Rael
2023-12-16 14:03:33 +01:00
committed by Christian Brabandt
parent df12e39b8b
commit d8bf87c9fb
7 changed files with 354 additions and 42 deletions

View File

@@ -1867,6 +1867,8 @@ f_typename(typval_T *argvars, typval_T *rettv)
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