]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1363: crash when :def function has :break in skipped block v9.0.1363
authorBram Moolenaar <Bram@vim.org>
Mon, 27 Feb 2023 22:06:51 +0000 (22:06 +0000)
committerBram Moolenaar <Bram@vim.org>
Mon, 27 Feb 2023 22:06:51 +0000 (22:06 +0000)
Problem:    Crash when :def function has :break in skipped block. (Ernie Rael)
Solution:   Don't generate a jump for a skipped :break. (closes #12077)

src/testdir/test_vim9_func.vim
src/version.c
src/vim9cmds.c

index f9ff3bc3e6c1c5a4c2d26bb333bb6f823678b88c..0f28ba038ff712b9394a0dfee34d1938e90b017b 100644 (file)
@@ -166,6 +166,31 @@ def Test_wrong_function_name()
   delfunc g:Define
 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()
   var dir = 'Xnamedir/autoload'
   mkdir(dir, 'pR')
index b694119a50de3218fa42379f9a716e00a2338d06..aa9f88424bf2dda862b05933ba1b2194ef5ff2a9 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1363,
 /**/
     1362,
 /**/
index fb09780cb36b385cd8b426e728879eb84c02ee1a..bc01cd83dac715b25d735bad47295e94decec89a 100644 (file)
@@ -1440,6 +1440,9 @@ compile_break(char_u *arg, cctx_T *cctx)
                                   e_break_without_while_or_for, cctx) == FAIL)
        return NULL;
 
+    if (cctx->ctx_skip == SKIP_YES)
+       return arg;
+
     if (try_scopes > 0)
        // 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
@@ -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
     // filled in later.
     if (compile_jump_to_end(el, JUMP_ALWAYS, 0, cctx) == FAIL)
-       return FAIL;
+       return NULL;
 
     return arg;
 }