0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 9.0.1363: crash when :def function has :break in skipped block

Problem:    Crash when :def function has :break in skipped block. (Ernie Rael)
Solution:   Don't generate a jump for a skipped :break. (closes #12077)
This commit is contained in:
Bram Moolenaar 2023-02-27 22:06:51 +00:00
parent 99ad3a8bb9
commit 3f45d67a15
3 changed files with 31 additions and 1 deletions

View File

@ -166,6 +166,31 @@ def Test_wrong_function_name()
delfunc g:Define delfunc g:Define
enddef enddef
def Test_break_in_skipped_block()
var lines =<< trim END
vim9script
def FixStackFrame(): string
for _ in [2]
var path = 'xxx'
if !!path
if false
break
else
return 'foo'
endif
endif
endfor
return 'xxx'
enddef
disas FixStackFrame
FixStackFrame()
END
v9.CheckScriptSuccess(lines)
enddef
def Test_autoload_name_mismatch() def Test_autoload_name_mismatch()
var dir = 'Xnamedir/autoload' var dir = 'Xnamedir/autoload'
mkdir(dir, 'pR') mkdir(dir, 'pR')

View File

@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1363,
/**/ /**/
1362, 1362,
/**/ /**/

View File

@ -1440,6 +1440,9 @@ compile_break(char_u *arg, cctx_T *cctx)
e_break_without_while_or_for, cctx) == FAIL) e_break_without_while_or_for, cctx) == FAIL)
return NULL; return NULL;
if (cctx->ctx_skip == SKIP_YES)
return arg;
if (try_scopes > 0) if (try_scopes > 0)
// Inside one or more try/catch blocks we first need to jump to the // Inside one or more try/catch blocks we first need to jump to the
// "finally" or "endtry" to cleanup. Then come to the next JUMP // "finally" or "endtry" to cleanup. Then come to the next JUMP
@ -1449,7 +1452,7 @@ compile_break(char_u *arg, cctx_T *cctx)
// Jump to the end of the FOR or WHILE loop. The instruction index will be // Jump to the end of the FOR or WHILE loop. The instruction index will be
// filled in later. // filled in later.
if (compile_jump_to_end(el, JUMP_ALWAYS, 0, cctx) == FAIL) if (compile_jump_to_end(el, JUMP_ALWAYS, 0, cctx) == FAIL)
return FAIL; return NULL;
return arg; return arg;
} }