summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2023-10-15 09:53:41 +0200
committerChristian Brabandt <cb@256bit.org>2023-10-15 09:53:41 +0200
commit1ace49fb98fa93e2fcff421a5f7da1aa41c512ed (patch)
tree81bdee80df4b3e83614071cdbb2c66728c6407c7
parent5d03525cdef5db1b1cedfa26c6f8a21aaa207ec0 (diff)
patch 9.0.2029: Vim9: no support for partials using call()v9.0.2029
Problem: Vim9: no support for partials using call() Solution: Add support closes: #13341 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
-rw-r--r--src/eval.c6
-rw-r--r--src/testdir/test_vim9_class.vim69
-rw-r--r--src/userfunc.c12
-rw-r--r--src/version.c2
4 files changed, 89 insertions, 0 deletions
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
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2029,
+/**/
2028,
/**/
2027,