patch 9.0.1292: :defer may call the wrong method for an object
Problem: :defer may call the wrong method for an object. (Ernie Rael)
Solution: When en object is from a class that extends or implements, figure
out the method to call at runtime. (closes #11910)
diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim
index 184a61f..0f812f1 100644
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -1480,6 +1480,43 @@
END
v9.CheckScriptSuccess(lines)
unlet g:result
+
+ lines =<< trim END
+ vim9script
+
+ class BaseWithEE
+ def Enter()
+ g:result ..= "entered-base/"
+ enddef
+ def Exit()
+ g:result ..= "exited-base"
+ enddef
+ endclass
+
+ class CWithEE extends BaseWithEE
+ def Enter()
+ g:result ..= "entered-child/"
+ enddef
+ def Exit()
+ g:result ..= "exited-child"
+ enddef
+ endclass
+
+ def With(ee: BaseWithEE, F: func)
+ ee.Enter()
+ defer ee.Exit()
+ F()
+ enddef
+
+ g:result = ''
+ var obj = CWithEE.new()
+ obj->With(() => {
+ g:result ..= "called/"
+ })
+ assert_equal('entered-child/called/exited-child', g:result)
+ END
+ v9.CheckScriptSuccess(lines)
+ unlet g:result
enddef