Skip to content

Commit

Permalink
patch 9.0.1091: assignment to non-existing member causes a crash
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
brammool committed Dec 23, 2022
1 parent c9207d5 commit f54cedd
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 2 deletions.
13 changes: 13 additions & 0 deletions src/testdir/test_vim9_class.vim
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,17 @@ def Test_class_basic()
END
v9.CheckScriptFailure(lines, 'E1022:')

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
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -695,6 +695,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1091,
/**/
1090,
/**/
Expand Down
7 changes: 5 additions & 2 deletions src/vim9class.c
Original file line number Diff line number Diff line change
Expand Up @@ -569,8 +569,9 @@ ex_class(exarg_T *eap)
}

/*
* 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(
Expand All @@ -591,6 +592,8 @@ class_member_type(
return m->ocm_type;
}
}

semsg(_(e_unknown_variable_str), name);
return &t_any;
}

Expand Down
2 changes: 2 additions & 0 deletions src/vim9compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit f54cedd

Please sign in to comment.