mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
patch 9.1.0861: Vim9: no runtime check for object member access of any var
Problem: Vim9: no runtime check for object member access of any var (after: 9.1.0850) Solution: Add runtime type compatibility check for object member accessed using a any variable (Yegappan Lakshmanan). closes: #16037 Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
210c49bbe8
commit
e798446362
@@ -11546,6 +11546,54 @@ def Test_any_obj_var_type()
|
|||||||
Fn(null_object)
|
Fn(null_object)
|
||||||
END
|
END
|
||||||
v9.CheckScriptFailure(lines, 'E1360: Using a null object', 1)
|
v9.CheckScriptFailure(lines, 'E1360: Using a null object', 1)
|
||||||
|
|
||||||
|
# Try to change a const object variable using a "any" variable
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
class A
|
||||||
|
public const v1: number = 123
|
||||||
|
endclass
|
||||||
|
|
||||||
|
def Fn(o: any)
|
||||||
|
o.v1 = 321
|
||||||
|
enddef
|
||||||
|
|
||||||
|
var a = A.new()
|
||||||
|
Fn(a)
|
||||||
|
END
|
||||||
|
v9.CheckScriptFailure(lines, 'E1409: Cannot change read-only variable "v1" in class "A"', 1)
|
||||||
|
|
||||||
|
# Try to change a final object variable using a "any" variable
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
class A
|
||||||
|
public final v1: number = 123
|
||||||
|
endclass
|
||||||
|
|
||||||
|
def Fn(o: any)
|
||||||
|
o.v1 = 321
|
||||||
|
enddef
|
||||||
|
|
||||||
|
var a = A.new()
|
||||||
|
Fn(a)
|
||||||
|
END
|
||||||
|
v9.CheckScriptFailure(lines, 'E1409: Cannot change read-only variable "v1" in class "A"', 1)
|
||||||
|
|
||||||
|
# Assign a different type of value to an "any" type object variable
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
class A
|
||||||
|
public var v1: list<any> = [1, 2]
|
||||||
|
endclass
|
||||||
|
|
||||||
|
def Fn(o: A)
|
||||||
|
o.v1 = 'abc'
|
||||||
|
enddef
|
||||||
|
|
||||||
|
var a = A.new()
|
||||||
|
Fn(a)
|
||||||
|
END
|
||||||
|
v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected list<any> but got string', 1)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
||||||
|
@@ -704,6 +704,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
861,
|
||||||
/**/
|
/**/
|
||||||
860,
|
860,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -2271,6 +2271,7 @@ execute_storeindex(isn_T *iptr, ectx_T *ectx)
|
|||||||
// Get the current function
|
// Get the current function
|
||||||
ufunc_T *ufunc = (((dfunc_T *)def_functions.ga_data)
|
ufunc_T *ufunc = (((dfunc_T *)def_functions.ga_data)
|
||||||
+ ectx->ec_dfunc_idx)->df_ufunc;
|
+ ectx->ec_dfunc_idx)->df_ufunc;
|
||||||
|
where_T where = WHERE_INIT;
|
||||||
|
|
||||||
// Check whether the member variable is writeable
|
// Check whether the member variable is writeable
|
||||||
if ((m->ocm_access != VIM_ACCESS_ALL) &&
|
if ((m->ocm_access != VIM_ACCESS_ALL) &&
|
||||||
@@ -2283,6 +2284,12 @@ execute_storeindex(isn_T *iptr, ectx_T *ectx)
|
|||||||
emsg_var_cl_define(msg, m->ocm_name, 0, cl);
|
emsg_var_cl_define(msg, m->ocm_name, 0, cl);
|
||||||
status = FAIL;
|
status = FAIL;
|
||||||
}
|
}
|
||||||
|
// Fail if the variable is a const or final or the type
|
||||||
|
// is not compatible
|
||||||
|
else if (oc_var_check_ro(cl, m) ||
|
||||||
|
check_typval_type(m->ocm_type, tv, where)
|
||||||
|
== FAIL)
|
||||||
|
status = FAIL;
|
||||||
else
|
else
|
||||||
lidx = m_idx;
|
lidx = m_idx;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user