]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1099: Vim9: import with extends may crash v9.1.1099
authorYegappan Lakshmanan <yegappan@yahoo.com>
Mon, 10 Feb 2025 20:35:07 +0000 (21:35 +0100)
committerChristian Brabandt <cb@256bit.org>
Mon, 10 Feb 2025 20:35:07 +0000 (21:35 +0100)
Problem:  Vim9: import with extends may crash, v9.1.1087 wasn't the
          correct way to fix it)
Solution: When using an import class, Check for a valid class member
          variable at compile time (Yegappan Lakshmanan)

related: #16601
closes: #16603

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/testdir/Makefile
src/testdir/test_vim9_import.vim
src/version.c
src/vim9compile.c
src/vim9execute.c

index 4c7a273035440eaf4f06cc44e9fe35384cb2af3c..680d1a121dc9fed06f0d3d81e59dfdc18dc1d2e6 100644 (file)
@@ -96,7 +96,7 @@ clean:
        -rm -f opt_test.vim test_result.log $(CLEANUP_FILES)
        -rm -rf $(RM_ON_RUN) $(RM_ON_START)
        -rm -f valgrind.*
-       -rm -f asan.*
+       -rm -f asan.* asan_test_*
        -rm -f guidialog guidialogfile
 
 # Delete the files produced by benchmarking, so they can run again.
index c8dfa1e7311d6499bd9cdaa53c8283579b0e5ed1..5f5c928b6dbb98cbbc452af95e8185fc483c7d7f 100644 (file)
@@ -3454,8 +3454,7 @@ def Test_vim9_import_and_class_extends()
     var myView = View.new('This should be ok')
     assert_equal('This should be ok', myView.content.value)
   END
-  # TODO: The root cause will be identified later.
-  v9.CheckScriptFailure(lines, 'E1099: Unknown error while executing new', 7)
+  v9.CheckScriptFailure(lines, 'E1376: Object variable "value2" accessible only using class "Run" object', 2)
 enddef
 
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
index 12cdfce5f6213aa9d27f7a136a598f69559b60df..f72f817e137b6a592e26a7441863f726f1eefb82 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1099,
 /**/
     1098,
 /**/
index aa3e17ef6b8bff18e0352d50c554a51b1521fdbb..be26c9bad956a602af782ad3a4a8a90bb7020976 100644 (file)
@@ -2496,9 +2496,10 @@ compile_load_lhs(
        lhs->lhs_type = cctx->ctx_type_stack.ga_len == 0 ? &t_void
                                                  : get_type_on_stack(cctx, 0);
 
-       if (lhs->lhs_type->tt_type == VAR_OBJECT)
+       if (lhs->lhs_type->tt_type == VAR_CLASS
+               || lhs->lhs_type->tt_type == VAR_OBJECT)
        {
-           // Check whether the object variable is modifiable
+           // Check whether the class or object variable is modifiable
            if (!lhs_class_member_modifiable(lhs, var_start, cctx))
                return FAIL;
        }
index 50220006bf6bc099078039e02626aec358e9b9b1..c7f0e673b22845c56920e080c1f5828cd874426c 100644 (file)
@@ -2461,14 +2461,8 @@ execute_storeindex(isn_T *iptr, ectx_T *ectx)
                otv = class->class_members_tv;
            }
 
-           if (otv != NULL)
-           {
-               clear_tv(&otv[lidx]);
-               otv[lidx] = *tv;
-           }
-           else
-               status = FAIL;
-
+           clear_tv(&otv[lidx]);
+           otv[lidx] = *tv;
        }
        else
        {