Skip to content

Commit 2fecb53

Browse files
committed
patch 8.2.2650: Vim9: command modifiers not handled in nested function
Problem: Vim9: command modifiers not handled in nested function. Solution: Keep function-local info in a structure and save it on the stack.
1 parent 1ff89de commit 2fecb53

4 files changed

Lines changed: 127 additions & 45 deletions

File tree

src/testdir/test_vim9_func.vim

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2363,6 +2363,29 @@ def Test_cmdmod_silent_restored()
23632363
delete(fname)
23642364
enddef
23652365

2366+
def Test_cmdmod_silent_nested()
2367+
var lines =<< trim END
2368+
vim9script
2369+
var result = ''
2370+
2371+
def Error()
2372+
result ..= 'Eb'
2373+
eval [][0]
2374+
result ..= 'Ea'
2375+
enddef
2376+
2377+
def Crash()
2378+
result ..= 'Cb'
2379+
sil! Error()
2380+
result ..= 'Ca'
2381+
enddef
2382+
2383+
Crash()
2384+
assert_equal('CbEbEaCa', result)
2385+
END
2386+
CheckScriptSuccess(lines)
2387+
enddef
2388+
23662389
def Test_dict_member_with_silent()
23672390
var lines =<< trim END
23682391
vim9script

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -750,6 +750,8 @@ static char *(features[]) =
750750

751751
static int included_patches[] =
752752
{ /* Add new patch number below this line */
753+
/**/
754+
2650,
753755
/**/
754756
2649,
755757
/**/

src/vim9.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,12 +402,14 @@ struct dfunc_S {
402402
// - ec_dfunc_idx: function index
403403
// - ec_iidx: instruction index
404404
// - ec_outer: stack used for closures
405+
// - funclocal: function-local data
405406
// - ec_frame_idx: previous frame index
406407
#define STACK_FRAME_FUNC_OFF 0
407408
#define STACK_FRAME_IIDX_OFF 1
408409
#define STACK_FRAME_OUTER_OFF 2
409-
#define STACK_FRAME_IDX_OFF 3
410-
#define STACK_FRAME_SIZE 4
410+
#define STACK_FRAME_FUNCLOCAL_OFF 3
411+
#define STACK_FRAME_IDX_OFF 4
412+
#define STACK_FRAME_SIZE 5
411413

412414

413415
#ifdef DEFINE_VIM9_GLOBALS

0 commit comments

Comments
 (0)