changeset 31928:7b1cbb43506c v9.0.1296

patch 9.0.1296: calling an object method with arguments does not work Commit: https://github.com/vim/vim/commit/094cf9f4d588b1c29f4e35c4ccbf8505510569fb Author: Bram Moolenaar <Bram@vim.org> Date: Fri Feb 10 15:52:25 2023 +0000 patch 9.0.1296: calling an object method with arguments does not work Problem: Calling an object method with arguments does not work. (Ernie Rael) Solution: Take the argument count into account when looking up the object. (closes #11911)
author Bram Moolenaar <Bram@vim.org>
date Fri, 10 Feb 2023 17:00:04 +0100
parents 5fff7ec54ca6
children 23759178127e
files src/testdir/test_vim9_class.vim src/version.c src/vim9execute.c
diffstat 3 files changed, 46 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -1373,6 +1373,47 @@ def Test_class_extends()
   v9.CheckScriptSuccess(lines)
 enddef
 
+def Test_using_base_class()
+  var lines =<< trim END
+    vim9script
+
+    class BaseEE
+        def Enter(): any
+            return null
+        enddef
+        def Exit(resource: any): void
+        enddef
+    endclass
+
+    class ChildEE extends BaseEE
+        def Enter(): any
+            return 42
+        enddef
+
+        def Exit(resource: number): void
+            g:result ..= '/exit'
+        enddef
+    endclass
+
+    def With(ee: BaseEE)
+        var r = ee.Enter()
+        try
+            g:result ..= r
+        finally
+            g:result ..= '/finally'
+            ee.Exit(r)
+        endtry
+    enddef
+
+    g:result = ''
+    With(ChildEE.new())
+    assert_equal('42/finally/exit', g:result)
+  END
+  v9.CheckScriptSuccess(lines)
+  unlet g:result
+enddef
+
+
 def Test_class_import()
   var lines =<< trim END
       vim9script
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1296,
+/**/
     1295,
 /**/
     1294,
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -4143,8 +4143,10 @@ exec_instructions(ectx_T *ectx)
 	    // call a method on an interface
 	    case ISN_METHODCALL:
 		{
+		    cmfunc_T *mfunc = iptr->isn_arg.mfunc;
+
 		    SOURCING_LNUM = iptr->isn_lnum;
-		    tv = STACK_TV_BOT(-1);
+		    tv = STACK_TV_BOT(-1 - mfunc->cmf_argcount);
 		    if (tv->v_type != VAR_OBJECT)
 		    {
 			object_required_error(tv);
@@ -4154,7 +4156,6 @@ exec_instructions(ectx_T *ectx)
 		    class_T *cl = obj->obj_class;
 
 		    // convert the interface index to the object index
-		    cmfunc_T *mfunc = iptr->isn_arg.mfunc;
 		    int idx = object_index_from_itf_index(mfunc->cmf_itf,
 						    TRUE, mfunc->cmf_idx, cl);