summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2023-02-17 21:08:50 +0000
committerBram Moolenaar <Bram@vim.org>2023-02-17 21:08:50 +0000
commit552bdca781bd202012224316ffae3439aac83b7b (patch)
treefcc7acc9a36ad99b9d74635a76d84f7ab688b8da
parenteea0a00811e8e8e3c2d07964ea61795cce5a4665 (diff)
downloadvim-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.h6
-rw-r--r--src/testdir/test_vim9_class.vim15
-rw-r--r--src/version.c2
-rw-r--r--src/vim9class.c18
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;