changeset 32088:cdab211f342a v9.0.1375

patch 9.0.1375: crash when getting member of obj of unknown class Commit: https://github.com/vim/vim/commit/f77a7f704ffd0ca1050e82f609c8b8bd61863277 Author: Ernie Rael <errael@raelity.com> Date: Fri Mar 3 15:05:30 2023 +0000 patch 9.0.1375: crash when getting member of obj of unknown class Problem: Crash when getting member of obj of unknown class. Solution: Check for NULL class and give an error message. (Ernie Rael, closes #12096)
author Bram Moolenaar <Bram@vim.org>
date Fri, 03 Mar 2023 16:15:03 +0100
parents 25f303c924e3
children 0e974e1aeb82
files src/errors.h src/testdir/test_vim9_class.vim src/version.c src/vim9expr.c
diffstat 4 files changed, 31 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/errors.h
+++ b/src/errors.h
@@ -3452,4 +3452,6 @@ EXTERN char e_cannot_use_color_none_did_
 #ifdef FEAT_EVAL
 EXTERN char e_cannot_use_non_null_object[]
 	INIT(= N_("E1362: Cannot use a non-null object"));
-#endif
+EXTERN char e_incomplete_type[]
+	INIT(= N_("E1363: Incomplete type"));
+#endif
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -272,6 +272,25 @@ def Test_object_not_set()
       echo Colorscheme.new(bg).GetBackground()
   END
   v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected object<Background> but got object<Unknown>')
+
+  # TODO: this should not give an error but be handled at runtime
+  lines =<< trim END
+      vim9script
+
+      class Class
+          this.id: string
+          def Method1()
+              echo 'Method1' .. this.id
+          enddef
+      endclass
+
+      var obj = null_object
+      def Func()
+          obj.Method1()
+      enddef
+      Func()
+  END
+  v9.CheckScriptFailure(lines, 'E1363:')
 enddef
 
 def Test_class_member_initializer()
--- 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 */
 /**/
+    1375,
+/**/
     1374,
 /**/
     1373,
--- a/src/vim9expr.c
+++ b/src/vim9expr.c
@@ -293,6 +293,13 @@ compile_class_object_index(cctx_T *cctx,
 	}
     }
 
+    if (cl == NULL)
+    {
+	// TODO: this should not give an error but be handled at runtime
+	emsg(_(e_incomplete_type));
+	return FAIL;
+    }
+
     ++*arg;
     char_u *name = *arg;
     char_u *name_end = find_name_end(name, NULL, NULL, FNE_CHECK_START);