Mercurial > vim
changeset 31970:fe66019e7a23 v9.0.1317
patch 9.0.1317: crash when using an unset object variable
Commit: https://github.com/vim/vim/commit/552bdca781bd202012224316ffae3439aac83b7b
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Feb 17 21:08:50 2023 +0000
patch 9.0.1317: crash when using an unset object variable
Problem: Crash when using an unset object variable.
Solution: Give an error instead. (closes https://github.com/vim/vim/issues/12005)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 17 Feb 2023 22:15:05 +0100 |
parents | 39d6012603df |
children | 70d210736f3e |
files | src/errors.h src/testdir/test_vim9_class.vim src/version.c src/vim9class.c |
diffstat | 4 files changed, 35 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/errors.h +++ b/src/errors.h @@ -1182,6 +1182,8 @@ EXTERN char e_invalid_command[] INIT(= N_("E476: Invalid command")); EXTERN char e_invalid_command_str[] INIT(= N_("E476: Invalid command: %s")); +EXTERN char e_invalid_command_str_expected_str[] + INIT(= N_("E476: Invalid command: %s, expected %s")); EXTERN char e_no_bang_allowed[] INIT(= N_("E477: No ! allowed")); EXTERN char e_dont_panic[] @@ -3442,6 +3444,6 @@ EXTERN char e_using_super_not_in_child_c INIT(= N_("E1358: Using \"super\" not in a child class")); EXTERN char e_cannot_define_new_function_in_abstract_class[] INIT(= N_("E1359: Cannot define a \"new\" function in an abstract class")); -EXTERN char e_invalid_command_str_expected_str[] - INIT(= N_("E476: Invalid command: %s, expected %s")); -#endif +EXTERN char e_using_null_object[] + INIT(= N_("E1360: Using a null object")); +#endif
--- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -182,6 +182,21 @@ def Test_class_interface_wrong_end() v9.CheckScriptFailure(lines, 'E476: Invalid command: endclass, expected endinterface') enddef +def Test_object_not_set() + var lines =<< trim END + vim9script + + class State + this.value = 'xyz' + endclass + + var state: State + var db = {'xyz': 789} + echo db[state.value] + END + v9.CheckScriptFailure(lines, 'E1360:') +enddef + def Test_class_member_initializer() var lines =<< trim END vim9script
--- 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 */ /**/ + 1317, +/**/ 1316, /**/ 1315,
--- a/src/vim9class.c +++ b/src/vim9class.c @@ -1234,9 +1234,6 @@ class_object_index( evalarg_T *evalarg, int verbose UNUSED) // give error messages { - // int evaluate = evalarg != NULL - // && (evalarg->eval_flags & EVAL_EVALUATE); - if (VIM_ISWHITE((*arg)[1])) { semsg(_(e_no_white_space_allowed_after_str_str), ".", *arg); @@ -1250,8 +1247,19 @@ class_object_index( return FAIL; size_t len = name_end - name; - class_T *cl = rettv->v_type == VAR_CLASS ? rettv->vval.v_class - : rettv->vval.v_object->obj_class; + class_T *cl; + if (rettv->v_type == VAR_CLASS) + cl = rettv->vval.v_class; + else // VAR_OBJECT + { + if (rettv->vval.v_object == NULL) + { + emsg(_(e_using_null_object)); + return FAIL; + } + cl = rettv->vval.v_object->obj_class; + } + if (*name_end == '(') { int on_class = rettv->v_type == VAR_CLASS;