patch 9.1.1332: Vim9: segfault when using super within a lambda

Problem:  Vim9: segfault when using super within a lambda
          (lifepillar)
Solution: inherit the class from the current function
          (Yegappan Lakshmanan)

fixes: #17166
closes: #17185

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Yegappan Lakshmanan
2025-04-22 19:55:38 +02:00
committed by Christian Brabandt
parent 5c3d1e3258
commit 69e6ab6db3
3 changed files with 36 additions and 0 deletions

View File

@ -12544,6 +12544,35 @@ def Test_super_keyword()
assert_equal('A.Foo B.Foo', b.Bar())
END
v9.CheckSourceSuccess(lines)
# Test for using super in a lambda function to invoke a base class method from
# the new() method.
lines =<< trim END
vim9script
def G(F: func): string
return F()
enddef
class Base
def F(): string
return 'Base.F()'
enddef
endclass
class Foo extends Base
var s: string = 'x'
def new()
this.s = G((): string => {
return super.F()
})
enddef
endclass
var f = Foo.new()
assert_equal('Base.F()', f.s)
END
v9.CheckSourceSuccess(lines)
enddef
" Test for using a list of objects

View File

@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1332,
/**/
1331,
/**/

View File

@ -1647,6 +1647,11 @@ compile_lambda(char_u **arg, cctx_T *cctx)
++ufunc->uf_refcount;
clear_tv(&rettv);
if (cctx->ctx_ufunc != NULL)
// This lambda might be defined in a class method. Inherit the class
// from the current function.
ufunc->uf_defclass = cctx->ctx_ufunc->uf_defclass;
// Compile it here to get the return type. The return type is optional,
// when it's missing use t_unknown. This is recognized in
// compile_return().