# HG changeset patch # User Bram Moolenaar # Date 1676668505 -3600 # Node ID fe66019e7a23ff439d04f2956b596b09d48fdb6e # Parent 39d6012603dfe8aec7d831ea9db71fd31be5d5f3 patch 9.0.1317: crash when using an unset object variable Commit: https://github.com/vim/vim/commit/552bdca781bd202012224316ffae3439aac83b7b Author: Bram Moolenaar 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) diff --git a/src/errors.h b/src/errors.h --- 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 diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim --- 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 diff --git a/src/version.c b/src/version.c --- 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, diff --git a/src/vim9class.c b/src/vim9class.c --- 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;