]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.2029: Vim9: no support for partials using call() v9.0.2029
authorYegappan Lakshmanan <yegappan@yahoo.com>
Sun, 15 Oct 2023 07:53:41 +0000 (09:53 +0200)
committerChristian Brabandt <cb@256bit.org>
Sun, 15 Oct 2023 07:53:41 +0000 (09:53 +0200)
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>
src/eval.c
src/testdir/test_vim9_class.vim
src/userfunc.c
src/version.c

index 34502f965b3f88d4f9121a2ebec255c839d03da7..e888fecc8ae7ae547d27eea111343326f39d746c 100644 (file)
@@ -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;
index 3af9a1f87a0dadc96754eaa01affe408c08063c9..b9f2910205c077ebe32d12a850ce8205b3f7500a 100644 (file)
@@ -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
index 0f487fc1207021fcfa6009a214d83d1bc11a8f46..db16b68049e55f32c633f9ba34a004c2926e1429 100644 (file)
@@ -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;
index 997acf39dc6bf1130e817b240965caca3b2ca3aa..ec9a07d0740d706646ed16d7f66102e5ad6acbf0 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2029,
 /**/
     2028,
 /**/