# HG changeset patch # User Bram Moolenaar # Date 1623779103 -7200 # Node ID afaa7f3aae5649d6f16213c20d78dbf516bd55bb # Parent 7cefad55cbf80960bde45885ab8d1014020bcc1a patch 8.2.3003: Vim9: closure compiled with wrong compile type Commit: https://github.com/vim/vim/commit/968a5b62ffd3e08005d907d93eaaf807be466a88 Author: Bram Moolenaar Date: Tue Jun 15 19:32:40 2021 +0200 patch 8.2.3003: Vim9: closure compiled with wrong compile type Problem: Vim9: closure compiled with wrong compile type. Solution: Use COMPILE_TYPE() when calling a function. (closes https://github.com/vim/vim/issues/8384) diff --git a/src/testdir/test_debugger.vim b/src/testdir/test_debugger.vim --- a/src/testdir/test_debugger.vim +++ b/src/testdir/test_debugger.vim @@ -932,6 +932,33 @@ func Test_Backtrace_DefFunction() call delete('Xtest2.vim') endfunc +func Test_debug_def_function() + CheckCWD + let file =<< trim END + vim9script + def g:Func() + var n: number + def Closure(): number + return n + 3 + enddef + n += Closure() + echo 'result: ' .. n + enddef + END + call writefile(file, 'Xtest.vim') + + let buf = RunVimInTerminal('-S Xtest.vim', {}) + + call RunDbgCmd(buf, + \ ':debug call Func()', + \ ['cmd: call Func()']) + call RunDbgCmd(buf, 'next', ['result: 3']) + call term_sendkeys(buf, "\r") + + call StopVimInTerminal(buf) + call delete('Xtest.vim') +endfunc + func Test_debug_backtrace_level() CheckCWD let lines =<< trim END diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3003, +/**/ 3002, /**/ 3001, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -752,12 +752,8 @@ call_ufunc( int error; int idx; int did_emsg_before = did_emsg; - compiletype_T compile_type = CT_NONE; - -#ifdef FEAT_PROFILE - if (do_profiling == PROF_YES && ufunc->uf_profiling) - compile_type = CT_PROFILE; -#endif + compiletype_T compile_type = COMPILE_TYPE(ufunc); + if (func_needs_compiling(ufunc, compile_type) && compile_def_function(ufunc, FALSE, compile_type, NULL) == FAIL)