diff --git a/src/eval.c b/src/eval.c index 34502f965b..e888fecc8a 100644 --- a/src/eval.c +++ b/src/eval.c @@ -2551,6 +2551,12 @@ eval_func( funcexe.fe_lastline = curwin->w_cursor.lnum; funcexe.fe_evaluate = evaluate; funcexe.fe_partial = partial; + if (partial != NULL) + { + funcexe.fe_object = partial->pt_obj; + if (funcexe.fe_object != NULL) + ++funcexe.fe_object->obj_refcount; + } funcexe.fe_basetv = basetv; funcexe.fe_check_type = type; funcexe.fe_found_var = found_var; diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim index 3af9a1f87a..b9f2910205 100644 --- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -7510,6 +7510,21 @@ def Test_object_funcref() END v9.CheckSourceSuccess(lines) + # Using object method funcref at the script level + lines =<< trim END + vim9script + class A + this.val: number + def Foo(): number + return this.val + enddef + endclass + var a = A.new(345) + var Fn = a.Foo + assert_equal(345, Fn()) + END + v9.CheckSourceSuccess(lines) + # Using object method funcref from another object method lines =<< trim END vim9script @@ -7604,6 +7619,26 @@ def Test_object_funcref() a.Bar() END v9.CheckSourceSuccess(lines) + + # Using object method funcref using call() + lines =<< trim END + vim9script + class A + this.val: number + def Foo(): number + return this.val + enddef + endclass + + def Bar(obj: A) + assert_equal(123, call(obj.Foo, [])) + enddef + + var a = A.new(123) + Bar(a) + assert_equal(123, call(a.Foo, [])) + END + v9.CheckSourceSuccess(lines) enddef " Test for using a class method as a funcref @@ -7637,6 +7672,21 @@ def Test_class_funcref() END v9.CheckSourceSuccess(lines) + # Using class method funcref at the script level + lines =<< trim END + vim9script + class A + public static val: number + static def Foo(): number + return val + enddef + endclass + A.val = 567 + var Fn = A.Foo + assert_equal(567, Fn()) + END + v9.CheckSourceSuccess(lines) + # Using function() to get a class method funcref lines =<< trim END vim9script @@ -7725,6 +7775,25 @@ def Test_class_funcref() A.Bar() END v9.CheckSourceSuccess(lines) + + # Using class method funcref using call() + lines =<< trim END + vim9script + class A + public static val: number + static def Foo(): number + return val + enddef + endclass + + def Bar() + A.val = 468 + assert_equal(468, call(A.Foo, [])) + enddef + Bar() + assert_equal(468, call(A.Foo, [])) + END + v9.CheckSourceSuccess(lines) enddef " Test for using an object member as a funcref diff --git a/src/userfunc.c b/src/userfunc.c index 0f487fc120..db16b68049 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -3540,6 +3540,12 @@ func_call( funcexe.fe_lastline = curwin->w_cursor.lnum; funcexe.fe_evaluate = TRUE; funcexe.fe_partial = partial; + if (partial != NULL) + { + funcexe.fe_object = partial->pt_obj; + if (funcexe.fe_object != NULL) + ++funcexe.fe_object->obj_refcount; + } funcexe.fe_selfdict = selfdict; r = call_func(name, -1, rettv, argc, argv, &funcexe); } @@ -3580,6 +3586,12 @@ call_callback( CLEAR_FIELD(funcexe); funcexe.fe_evaluate = TRUE; funcexe.fe_partial = callback->cb_partial; + if (callback->cb_partial != NULL) + { + funcexe.fe_object = callback->cb_partial->pt_obj; + if (funcexe.fe_object != NULL) + ++funcexe.fe_object->obj_refcount; + } ++callback_depth; ret = call_func(callback->cb_name, len, rettv, argcount, argvars, &funcexe); --callback_depth; diff --git a/src/version.c b/src/version.c index 997acf39dc..ec9a07d074 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2029, /**/ 2028, /**/