diff options
author | Bram Moolenaar <Bram@vim.org> | 2023-02-17 21:08:50 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2023-02-17 21:08:50 +0000 |
commit | 552bdca781bd202012224316ffae3439aac83b7b (patch) | |
tree | fcc7acc9a36ad99b9d74635a76d84f7ab688b8da | |
parent | eea0a00811e8e8e3c2d07964ea61795cce5a4665 (diff) | |
download | vim-git-552bdca781bd202012224316ffae3439aac83b7b.tar.gz |
patch 9.0.1317: crash when using an unset object variablev9.0.1317
Problem: Crash when using an unset object variable.
Solution: Give an error instead. (closes #12005)
-rw-r--r-- | src/errors.h | 6 | ||||
-rw-r--r-- | src/testdir/test_vim9_class.vim | 15 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9class.c | 18 |
4 files changed, 34 insertions, 7 deletions
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 @@ -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 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; |