From 114ec813b3a7f70d7a1c86e87226f5273e9d1def Mon Sep 17 00:00:00 2001 From: Ernie Rael Date: Sun, 4 Jun 2023 18:11:35 +0100 Subject: [PATCH] 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) --- src/testdir/test_vim9_class.vim | 22 ++++++++++++++++++++++ src/userfunc.c | 4 ++-- src/version.c | 2 ++ src/vim9class.c | 4 +++- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim index d89b14ea74233..52812eac73896 100644 --- 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 index c30c3524bd68f..8facd2fdfd238 100644 --- 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 index c9a4febe014de..335e3bd705b2f 100644 --- a/src/version.c +++ b/src/version.c @@ -695,6 +695,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1605, /**/ 1604, /**/ diff --git a/src/vim9class.c b/src/vim9class.c index 062de8fad4fc2..734967a802938 100644 --- a/src/vim9class.c +++ b/src/vim9class.c @@ -1025,7 +1025,9 @@ ex_class(exarg_T *eap) 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;