changeset 31740:22a4824d7964 v9.0.1202

patch 9.0.1202: crash when iterating over list of objects Commit: https://github.com/vim/vim/commit/f450804e1438307c79a62053f8c32eef1508383a Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jan 15 16:54:57 2023 +0000 patch 9.0.1202: crash when iterating over list of objects Problem: Crash when iterating over list of objects. Solution: Do not make a copy of tt_member for object or class. (closes #11823)
author Bram Moolenaar <Bram@vim.org>
date Sun, 15 Jan 2023 18:00:03 +0100
parents edfc3b562968
children 47e20df6fce5
files src/testdir/test_vim9_class.vim src/version.c src/vim9type.c
diffstat 3 files changed, 25 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -219,6 +219,27 @@ def Test_assignment_with_operator()
   v9.CheckScriptSuccess(lines)
 enddef
 
+def Test_list_of_objects()
+  var lines =<< trim END
+      vim9script
+
+      class Foo
+        def Add()
+        enddef
+      endclass
+
+      def ProcessList(fooList: list<Foo>)
+        for foo in fooList
+          foo.Add()
+        endfor
+      enddef
+
+      var l: list<Foo> = [Foo.new()]
+      ProcessList(l)
+  END
+  v9.CheckScriptSuccess(lines)
+enddef
+
 def Test_class_default_new()
   var lines =<< trim END
       vim9script
--- 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 */
 /**/
+    1202,
+/**/
     1201,
 /**/
     1200,
--- a/src/vim9type.c
+++ b/src/vim9type.c
@@ -86,7 +86,8 @@ copy_type_deep_rec(type_T *type, garray_
     ((type_T **)seen_types->ga_data)[seen_types->ga_len * 2 + 1] = copy;
     ++seen_types->ga_len;
 
-    if (copy->tt_member != NULL)
+    if (copy->tt_member != NULL
+	    && copy->tt_type != VAR_OBJECT && copy->tt_type != VAR_CLASS)
 	copy->tt_member = copy_type_deep_rec(copy->tt_member,
 							 type_gap, seen_types);