mirror of
https://github.com/vim/vim.git
synced 2025-11-10 10:47:23 -05:00
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:
committed by
Christian Brabandt
parent
5c3d1e3258
commit
69e6ab6db3
@@ -12544,6 +12544,35 @@ def Test_super_keyword()
|
|||||||
assert_equal('A.Foo B.Foo', b.Bar())
|
assert_equal('A.Foo B.Foo', b.Bar())
|
||||||
END
|
END
|
||||||
v9.CheckSourceSuccess(lines)
|
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
|
enddef
|
||||||
|
|
||||||
" Test for using a list of objects
|
" Test for using a list of objects
|
||||||
|
|||||||
@@ -704,6 +704,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1332,
|
||||||
/**/
|
/**/
|
||||||
1331,
|
1331,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
@@ -1647,6 +1647,11 @@ compile_lambda(char_u **arg, cctx_T *cctx)
|
|||||||
++ufunc->uf_refcount;
|
++ufunc->uf_refcount;
|
||||||
clear_tv(&rettv);
|
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,
|
// Compile it here to get the return type. The return type is optional,
|
||||||
// when it's missing use t_unknown. This is recognized in
|
// when it's missing use t_unknown. This is recognized in
|
||||||
// compile_return().
|
// compile_return().
|
||||||
|
|||||||
Reference in New Issue
Block a user