From: Bram Moolenaar Date: Fri, 17 Feb 2023 21:08:50 +0000 (+0000) Subject: patch 9.0.1317: crash when using an unset object variable X-Git-Tag: v9.0.1317 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=552bdca781bd202012224316ffae3439aac83b7b;p=vim 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 #12005) --- diff --git a/src/errors.h b/src/errors.h index 336c187d6..0bfafac1f 100644 --- 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_class[] 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")); +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 index be9b18e3a..f1aadde5d 100644 --- 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 index 6cd2f1685..ff0b29ea1 100644 --- a/src/version.c +++ b/src/version.c @@ -695,6 +695,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1317, /**/ 1316, /**/ diff --git a/src/vim9class.c b/src/vim9class.c index ecf5de711..e11324d9c 100644 --- 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;