patch 9.1.0909: Vim9: crash when calling instance method
Problem: Vim9: crash when calling instance method
(Igbanam Ogbuluijah)
Solution: Pass the object when calling a partial function
(Yegappan Lakshmanan)
fixes: #16166
closes: #16180
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
51d4d84d6a
commit
481992cea9
@ -271,8 +271,10 @@ eval_expr_partial(
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
// Shortcut to call a compiled function with minimal overhead.
|
// Shortcut to call a compiled function with minimal overhead.
|
||||||
|
if (partial->pt_obj != NULL)
|
||||||
|
partial->pt_obj->obj_refcount++;
|
||||||
r = call_def_function(partial->pt_func, argc, argv, DEF_USE_PT_ARGV,
|
r = call_def_function(partial->pt_func, argc, argv, DEF_USE_PT_ARGV,
|
||||||
partial, NULL, fc, rettv);
|
partial, partial->pt_obj, fc, rettv);
|
||||||
if (fc_arg == NULL)
|
if (fc_arg == NULL)
|
||||||
remove_funccal();
|
remove_funccal();
|
||||||
if (r == FAIL)
|
if (r == FAIL)
|
||||||
|
|||||||
@ -11596,4 +11596,65 @@ def Test_any_obj_var_type()
|
|||||||
v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected list<any> but got string', 1)
|
v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected list<any> but got string', 1)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
" Test for using an object method with mapnew()
|
||||||
|
def Test_mapnew_with_instance_method()
|
||||||
|
var lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
|
||||||
|
class Foo
|
||||||
|
var str: string
|
||||||
|
var nums: list<number> = [1, 2, 3]
|
||||||
|
|
||||||
|
def InstanceMethod(n: number): string
|
||||||
|
return this.str .. n
|
||||||
|
enddef
|
||||||
|
|
||||||
|
def MapperMethod(idx: number, elem: number): string
|
||||||
|
return elem->this.InstanceMethod()
|
||||||
|
enddef
|
||||||
|
|
||||||
|
def MapTest()
|
||||||
|
this.str = "foo"
|
||||||
|
var l = ['foo1', 'foo2', 'foo3']
|
||||||
|
assert_equal(l, this.nums->mapnew(this.MapperMethod))
|
||||||
|
enddef
|
||||||
|
endclass
|
||||||
|
|
||||||
|
Foo.new().MapTest()
|
||||||
|
END
|
||||||
|
v9.CheckSourceSuccess(lines)
|
||||||
|
|
||||||
|
# Error in the mapnew() function
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
|
||||||
|
class Foo
|
||||||
|
var str: string
|
||||||
|
var nums: list<number> = [1, 2, 3]
|
||||||
|
|
||||||
|
def InstanceMethod(n: number): string
|
||||||
|
throw "InstanceMethod failed"
|
||||||
|
enddef
|
||||||
|
|
||||||
|
def MapperMethod(idx: number, elem: number): string
|
||||||
|
return elem->this.InstanceMethod()
|
||||||
|
enddef
|
||||||
|
|
||||||
|
def MapTest()
|
||||||
|
this.str = "foo"
|
||||||
|
var caught_exception: bool = false
|
||||||
|
try
|
||||||
|
this.nums->mapnew(this.MapperMethod)
|
||||||
|
catch /InstanceMethod failed/
|
||||||
|
caught_exception = true
|
||||||
|
endtry
|
||||||
|
assert_true(caught_exception)
|
||||||
|
enddef
|
||||||
|
endclass
|
||||||
|
|
||||||
|
Foo.new().MapTest()
|
||||||
|
END
|
||||||
|
v9.CheckSourceSuccess(lines)
|
||||||
|
enddef
|
||||||
|
|
||||||
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
||||||
|
|||||||
@ -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 */
|
||||||
|
/**/
|
||||||
|
909,
|
||||||
/**/
|
/**/
|
||||||
908,
|
908,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user