0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 9.0.1920: Vim9: cannot write public var in nested object

Problem:  Vim9: cannot write public var in nested object
Solution: Write variable in nested read-only object reference.
          Also test write fails.

closes: #13130
closes: #13131

Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Ernie Rael <errael@raelity.com>
This commit is contained in:
Ernie Rael
2023-09-20 20:13:06 +02:00
committed by Christian Brabandt
parent 03cd697d63
commit 98e68c07ce
3 changed files with 60 additions and 0 deletions

View File

@@ -1564,6 +1564,9 @@ get_lval(
om->ocm_name); om->ocm_name);
return NULL; return NULL;
case VIM_ACCESS_READ: case VIM_ACCESS_READ:
// If [idx] or .key following, read only OK.
if (*p == '[' || *p == '.')
break;
if ((flags & GLV_READ_ONLY) == 0) if ((flags & GLV_READ_ONLY) == 0)
{ {
semsg(_(e_member_is_not_writable_str), semsg(_(e_member_is_not_writable_str),

View File

@@ -613,8 +613,63 @@ def Test_assignment_nested_type()
enddef enddef
Test_assign_to_nested_typed_member() Test_assign_to_nested_typed_member()
var script_inner = Inner.new(0)
var script_outer = Outer.new(script_inner)
script_outer.inner.value = 1
assert_equal(1, script_inner.value)
END END
v9.CheckSourceSuccess(lines) v9.CheckSourceSuccess(lines)
# Assignment where target item is read only in :def
lines =<< trim END
vim9script
class Inner
this.value: number = 0
endclass
class Outer
this.inner: Inner
endclass
def F(outer: Outer)
outer.inner.value = 1
enddef
def Test_assign_to_nested_typed_member()
var inner = Inner.new(0)
var outer = Outer.new(inner)
F(outer)
assert_equal(1, inner.value)
enddef
Test_assign_to_nested_typed_member()
END
v9.CheckSourceFailure(lines, 'E46: Cannot change read-only variable "value"')
# Assignment where target item is read only script level
lines =<< trim END
vim9script
class Inner
this.value: number = 0
endclass
class Outer
this.inner: Inner
endclass
def F(outer: Outer)
outer.inner.value = 1
enddef
var script_inner = Inner.new(0)
var script_outer = Outer.new(script_inner)
script_outer.inner.value = 1
assert_equal(1, script_inner.value)
END
v9.CheckSourceFailure(lines, 'E1335: Member is not writable: value')
enddef enddef
def Test_assignment_with_operator() def Test_assignment_with_operator()

View File

@@ -699,6 +699,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 */
/**/
1920,
/**/ /**/
1919, 1919,
/**/ /**/