Mercurial > vim
changeset 33075:0346ff4c3ee7 v9.0.1824
patch 9.0.1824: Vim9: private members may be modifiable
Commit: https://github.com/vim/vim/commit/5bbcfbc4a260bc082829311086c3a1109c40f2d3
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Wed Aug 30 16:38:26 2023 +0200
patch 9.0.1824: Vim9: private members may be modifiable
Problem: Vim9: private members may be modifiable
Solution: prevent modification for def function
closes: #12963
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Wed, 30 Aug 2023 16:45:10 +0200 |
parents | 5510af40c77b |
children | d36b31ab54c4 |
files | src/testdir/test_vim9_class.vim src/version.c src/vim9compile.c |
diffstat | 3 files changed, 44 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -3653,4 +3653,37 @@ def Test_dup_member_variable() v9.CheckScriptFailure(lines, 'E1369: Duplicate member: val') enddef +" Test for accessing a private member outside a class in a def function +def Test_private_member_access_outside_class() + # private object member variable + var lines =<< trim END + vim9script + class A + this._val = 10 + def GetVal(): number + return this._val + enddef + endclass + def T() + var a = A.new() + a._val = 20 + enddef + T() + END + v9.CheckScriptFailure(lines, 'E1333: Cannot access private member: _val') + + # private class member variable + lines =<< trim END + vim9script + class A + static _val: number = 10 + endclass + def T() + A._val = 20 + enddef + T() + END + v9.CheckScriptFailure(lines, 'E1333: Cannot access private member: _val') +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
--- a/src/version.c +++ b/src/version.c @@ -700,6 +700,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1824, +/**/ 1823, /**/ 1822,
--- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -1866,6 +1866,15 @@ compile_lhs( { // for an object or class member get the type of the member class_T *cl = lhs->lhs_type->tt_class; + // If it is private member variable, then accessing it outside the + // class is not allowed. + if (*(after + 1) == '_' && !inside_class(cctx, cl)) + { + char_u *m_name = vim_strnsave(after + 1, lhs->lhs_end - after); + semsg(_(e_cannot_access_private_member_str), m_name); + vim_free(m_name); + return FAIL; + } lhs->lhs_member_type = class_member_type(cl, after + 1, lhs->lhs_end, &lhs->lhs_member_idx); if (lhs->lhs_member_idx < 0)