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:
parent
99ad3a8bb9
commit
3f45d67a15
@ -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')
|
||||||
|
@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user