# HG changeset patch # User Bram Moolenaar # Date 1685898903 -7200 # Node ID feb9a581eb0019abe791f78eab52c29c7fc21781 # Parent 3f3e8b7ec2d5b1b3592560279286e448e6f8bf30 patch 9.0.1605: crash when calling method on super in child constructor Commit: https://github.com/vim/vim/commit/114ec813b3a7f70d7a1c86e87226f5273e9d1def Author: Ernie Rael Date: Sun Jun 4 18:11:35 2023 +0100 patch 9.0.1605: crash when calling method on super in child constructor Problem: Crash when calling method on super in child constructor. (Israel Chauca Fuentes) Solution: Clear the type list. (Ernie Rael, closes #12489, closes #12471) diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim --- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -1636,6 +1636,28 @@ def Test_using_base_class() END v9.CheckScriptSuccess(lines) unlet g:result + + # Using super, Child invokes Base method which has optional arg. #12471 + lines =<< trim END + vim9script + + class Base + this.success: bool = false + def Method(arg = 0) + this.success = true + enddef + endclass + + class Child extends Base + def new() + super.Method() + enddef + endclass + + var obj = Child.new() + assert_equal(true, obj.success) + END + v9.CheckScriptSuccess(lines) enddef diff --git a/src/userfunc.c b/src/userfunc.c --- a/src/userfunc.c +++ b/src/userfunc.c @@ -5651,8 +5651,8 @@ copy_function(ufunc_T *fp) // type_T **uf_arg_types; // type_T *uf_ret_type; - ufunc->uf_type_list.ga_len = 0; - ufunc->uf_type_list.ga_data = NULL; + // make uf_type_list empty + ga_init(&ufunc->uf_type_list); // TODO: partial_T *uf_partial; diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 1605, +/**/ 1604, /**/ 1603, diff --git a/src/vim9class.c b/src/vim9class.c --- a/src/vim9class.c +++ b/src/vim9class.c @@ -1025,7 +1025,9 @@ early_ret: if (*fup == NULL) goto cleanup; - mch_memmove(*fup, gap->ga_data, sizeof(ufunc_T *) * gap->ga_len); + if (gap->ga_len != 0) + mch_memmove(*fup, gap->ga_data, + sizeof(ufunc_T *) * gap->ga_len); vim_free(gap->ga_data); if (loop == 1) cl->class_class_function_count_child = gap->ga_len;