Mercurial > vim
changeset 31517:cd5247f4da06 v9.0.1091
patch 9.0.1091: assignment to non-existing member causes a crash
Commit: https://github.com/vim/vim/commit/f54cedd6763e7727b4bfaeb34bb7c365a17675eb
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Dec 23 17:56:27 2022 +0000
patch 9.0.1091: assignment to non-existing member causes a crash
Problem: Assignment to non-existing member causes a crash. (Yegappan
Lakshmanan)
Solution: Give an error message and bail out when a member cannot be found.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 23 Dec 2022 19:00:04 +0100 |
parents | c57bab16e1db |
children | e241223a3c5c |
files | src/testdir/test_vim9_class.vim src/version.c src/vim9class.c src/vim9compile.c |
diffstat | 4 files changed, 22 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -111,6 +111,17 @@ def Test_class_basic() lines =<< trim END vim9script class Something + def new() + this.state = 0 + enddef + endclass + var obj = Something.new() + END + v9.CheckScriptFailure(lines, 'E1089:') + + lines =<< trim END + vim9script + class Something this.count : number endclass END @@ -330,7 +341,9 @@ def Test_class_member_access() assert_equal(0, TextPos.counter) TextPos.AddToCounter(3) assert_equal(3, TextPos.counter) + assert_fails('echo TextPos.noSuchMember', 'E1338:') + assert_fails('TextPos.noSuchMember = 2', 'E1337:') assert_fails('TextPos.counter += 5', 'E1335') END v9.CheckScriptSuccess(lines)
--- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1091, +/**/ 1090, /**/ 1089,
--- a/src/vim9class.c +++ b/src/vim9class.c @@ -569,8 +569,9 @@ cleanup: } /* - * Find member "name" in class "cl" and return its type. - * When not found t_any is returned. + * Find member "name" in class "cl", set "member_idx" to the member index and + * return its type. + * When not found "member_idx" is set to -1 and t_any is returned. */ type_T * class_member_type( @@ -591,6 +592,8 @@ class_member_type( return m->ocm_type; } } + + semsg(_(e_unknown_variable_str), name); return &t_any; }
--- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -1823,6 +1823,8 @@ compile_lhs( class_T *cl = (class_T *)lhs->lhs_type->tt_member; lhs->lhs_member_type = class_member_type(cl, after + 1, lhs->lhs_end, &lhs->lhs_member_idx); + if (lhs->lhs_member_idx < 0) + return FAIL; } else lhs->lhs_member_type = lhs->lhs_type->tt_member;