]> granicus.if.org Git - vim/commitdiff
patch 9.0.1164: evaluating string expression advances function line v9.0.1164
authorh-east <h.east.727@gmail.com>
Mon, 9 Jan 2023 15:10:40 +0000 (15:10 +0000)
committerBram Moolenaar <Bram@vim.org>
Mon, 9 Jan 2023 15:10:40 +0000 (15:10 +0000)
Problem:    Evaluating string expression advances function line.
Solution:   Disable function lines while parsing a string expression.
            (Hirohito Higashi, closes #11796)

src/testdir/test_vim9_expr.vim
src/version.c
src/vim9expr.c

index 63547820cfa2f93c56041d7ac174a0164005d945..29a17fe2561636b9e37303ca5aef908e88dd754b 100644 (file)
@@ -3700,6 +3700,17 @@ def Test_expr9_method_call_linebreak()
       assert_equal('', v:errmsg)
   END
   v9.CheckScriptSuccess(lines)
+
+  # this was skipping over the expression without an error
+  lines =<< trim END
+      vim9script
+      def Test(s: string): string
+        return substitute(s, 'A', '\=toupper("x")', 'g')
+                          ->tolower()
+      enddef
+      assert_equal('xbcd', Test('ABCD'))
+  END
+  v9.CheckScriptSuccess(lines)
 enddef
 
 def Test_expr9_method_call_import()
index 4fbd96de0d30f32b541f2958b6d9f72d651fb53c..1f808f3c622b94d53544909e5a72c266b2ad3e23 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1164,
 /**/
     1163,
 /**/
index 3acb97bef6c491cebd747dc28a3d9c1a3293bc67..7f5f4c8b0d94cfe29e070fe4ede425591c8cd7ef 100644 (file)
@@ -733,7 +733,15 @@ compile_string(isn_T *isn, cctx_T *cctx, int str_offset)
     cctx->ctx_instr.ga_len = 0;
     cctx->ctx_instr.ga_maxlen = 0;
     cctx->ctx_instr.ga_data = NULL;
+
+    // avoid peeking a next line
+    int galen_save = cctx->ctx_ufunc->uf_lines.ga_len;
+    cctx->ctx_ufunc->uf_lines.ga_len = 0;
+
     expr_res = compile_expr0(&s, cctx);
+
+    cctx->ctx_ufunc->uf_lines.ga_len = galen_save;
+
     s = skipwhite(s);
     trailing_error = *s != NUL;