]> granicus.if.org Git - vim/commitdiff
patch 9.0.1205: crash when handling class that extends another class v9.0.1205
authorBram Moolenaar <Bram@vim.org>
Sun, 15 Jan 2023 20:49:00 +0000 (20:49 +0000)
committerBram Moolenaar <Bram@vim.org>
Sun, 15 Jan 2023 20:49:00 +0000 (20:49 +0000)
Problem:    Crash when handling class that extends another class with more
            than one object members.
Solution:   Correct pointer computations. (closes #11824)

src/testdir/test_vim9_class.vim
src/version.c
src/vim9class.c

index 83717eb5d35d14f6c41213354df3a034e4de3c6c..85f47a88be8416de775655605e8f8f3f7812c89a 100644 (file)
@@ -1081,6 +1081,26 @@ def Test_class_extends()
       var c = Child.new()
   END
   v9.CheckScriptFailure(lines, 'E1325: Method not found on class "Child": new(')
+
+  # base class with more than one object member
+  lines =<< trim END
+      vim9script
+
+      class Result
+        this.success: bool
+        this.value: any = null
+      endclass
+
+      class Success extends Result
+        def new(this.value = v:none)
+          this.success = true
+        enddef
+      endclass
+
+      var v = Success.new('asdf')
+      assert_equal("object of Success {success: true, value: 'asdf'}", string(v))
+  END
+  v9.CheckScriptSuccess(lines)
 enddef
 
 def Test_class_import()
index 95b92e4a8dd4cae561632750fd9625beb54be361..6baed862d1bfde95bb6f1eb27a680faa86c1726e 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1205,
 /**/
     1204,
 /**/
index 8dcd92b6ebd7c7074acb34138ee5457e8cae80e5..1ead953eb02b878e02d16ee1e0fc6f4205178dcf 100644 (file)
@@ -182,10 +182,11 @@ add_members_to_class(
     for (int i = 0; i < parent_count; ++i)
     {
        // parent members need to be copied
-       *members[i] = parent_members[i];
-       members[i]->ocm_name = vim_strsave(members[i]->ocm_name);
-       if (members[i]->ocm_init != NULL)
-           members[i]->ocm_init = vim_strsave(members[i]->ocm_init);
+       ocmember_T      *m = *members + i;
+       *m = parent_members[i];
+       m->ocm_name = vim_strsave(m->ocm_name);
+       if (m->ocm_init != NULL)
+           m->ocm_init = vim_strsave(m->ocm_init);
     }
     if (gap->ga_len > 0)
        // new members are moved