patch 9.1.1074: Strange error when heredoc marker starts with "trim"
Commit: https://github.com/vim/vim/commit/449c2e5454735fe1cfc8c21b2c6880d6bdf4cd6e Author: zeertzjq <zeert...@outlook.com> Date: Mon Feb 3 18:56:16 2025 +0100 patch 9.1.1074: Strange error when heredoc marker starts with "trim" Problem: Strange error when heredoc marker starts with "trim". Solution: Check for whitespace after "trim" or "eval" (zeertzjq) For :python3 etc., a heredoc marker that starts with a lower-case letter is valid, and when it starts with "trim" it works in a script but not in a function, and this PR makes it works in a function. For :let, a heredoc marker that starts with a lower-case letter is not valid, but when it starts with "trim" or "eval" the error can be a bit confusing in a function, and this PR make it less confusing. closes: #16574 Signed-off-by: zeertzjq <zeert...@outlook.com> Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/src/testdir/test_let.vim b/src/testdir/test_let.vim index 2aba1d3e2..e31b51476 100644 --- a/src/testdir/test_let.vim +++ b/src/testdir/test_let.vim @@ -435,6 +435,24 @@ func Test_let_heredoc_fails() call assert_report('Caught exception: ' .. v:exception) endtry + try + let v =<< trim trimm + trimm + call assert_report('No exception thrown') + catch /E221:/ + catch + call assert_report('Caught exception: ' .. v:exception) + endtry + + try + let v =<< trim trim evall + evall + call assert_report('No exception thrown') + catch /E221:/ + catch + call assert_report('Caught exception: ' .. v:exception) + endtry + let text =<< trim END func WrongSyntax() let v =<< that there diff --git a/src/testdir/test_lua.vim b/src/testdir/test_lua.vim index 5225ce8f8..043531a55 100644 --- a/src/testdir/test_lua.vim +++ b/src/testdir/test_lua.vim @@ -934,7 +934,10 @@ vim.command('let s ..= "B"') lua << trim eof vim.command('let s ..= "E"') eof - call assert_equal('ABCDE', s) + lua << trimm +vim.command('let s ..= "F"') +trimm + call assert_equal('ABCDEF', s) endfunc " Test for adding, accessing and removing global variables using the vim.g diff --git a/src/testdir/test_perl.vim b/src/testdir/test_perl.vim index 721179c8e..31329ca79 100644 --- a/src/testdir/test_perl.vim +++ b/src/testdir/test_perl.vim @@ -359,7 +359,10 @@ VIM::DoCommand('let s ..= "B"') perl << trim eof VIM::DoCommand('let s ..= "E"') eof - call assert_equal('ABCDE', s) + perl << trimm +VIM::DoCommand('let s ..= "F"') +trimm + call assert_equal('ABCDEF', s) endfunc func Test_perl_in_sandbox() diff --git a/src/testdir/test_python2.vim b/src/testdir/test_python2.vim index de5f60794..4ba0f8ef9 100644 --- a/src/testdir/test_python2.vim +++ b/src/testdir/test_python2.vim @@ -263,7 +263,10 @@ s+='B' python << trim eof s+='E' eof - call assert_equal('ABCDE', pyxeval('s')) +python << trimm +s+='F' +trimm + call assert_equal('ABCDEF', pyxeval('s')) endfunc " Test for the buffer range object diff --git a/src/testdir/test_python3.vim b/src/testdir/test_python3.vim index 20f9dc6c6..c04495433 100644 --- a/src/testdir/test_python3.vim +++ b/src/testdir/test_python3.vim @@ -467,7 +467,10 @@ s+='B' python3 << trim eof s+='E' eof - call assert_equal('ABCDE', pyxeval('s')) + python3 << trimm +s+='F' +trimm + call assert_equal('ABCDEF', pyxeval('s')) endfunc " Test for the buffer range object diff --git a/src/testdir/test_pyx2.vim b/src/testdir/test_pyx2.vim index 781bb4178..68f1901e2 100644 --- a/src/testdir/test_pyx2.vim +++ b/src/testdir/test_pyx2.vim @@ -140,7 +140,10 @@ result+='B' pyx << trim eof result+='E' eof - call assert_equal('ABCDE', pyxeval('result')) + pyx << trimm +result+='F' +trimm + call assert_equal('ABCDEF', pyxeval('result')) endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/testdir/test_pyx3.vim b/src/testdir/test_pyx3.vim index b34fdcbd7..b02f447e2 100644 --- a/src/testdir/test_pyx3.vim +++ b/src/testdir/test_pyx3.vim @@ -139,7 +139,10 @@ result+='B' pyx << trim eof result+='E' eof - call assert_equal('ABCDE', pyxeval('result')) + pyx << trimm +result+='F' +trimm + call assert_equal('ABCDEF', pyxeval('result')) endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/testdir/test_ruby.vim b/src/testdir/test_ruby.vim index cc5f4193f..d4ff8e0b7 100644 --- a/src/testdir/test_ruby.vim +++ b/src/testdir/test_ruby.vim @@ -446,7 +446,10 @@ Vim.command('let s ..= "B"') ruby << trim eof Vim.command('let s ..= "E"') eof - call assert_equal('ABCDE', s) +ruby << trimm +Vim.command('let s ..= "F"') +trimm + call assert_equal('ABCDEF', s) endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/userfunc.c b/src/userfunc.c index a60eeb2d7..b7d2752dc 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -1322,7 +1322,8 @@ get_function_body( { // ":python <<" continues until a dot, like ":append" p = skipwhite(arg + 2); - if (STRNCMP(p, "trim", 4) == 0) + if (STRNCMP(p, "trim", 4) == 0 + && (p[4] == NUL || VIM_ISWHITE(p[4]))) { // Ignore leading white space. p = skipwhite(p + 4); @@ -1367,20 +1368,21 @@ get_function_body( current_sctx.sc_version = save_sc_version; if (arg != NULL && STRNCMP(arg, "=<<", 3) == 0) { + int has_trim = FALSE; + p = skipwhite(arg + 3); while (TRUE) { - if (STRNCMP(p, "trim", 4) == 0) + if (STRNCMP(p, "trim", 4) == 0 + && (p[4] == NUL || VIM_ISWHITE(p[4]))) { // Ignore leading white space. p = skipwhite(p + 4); - heredoc_trimmedlen = skipwhite(theline) - theline; - heredoc_trimmed = vim_strnsave(theline, heredoc_trimmedlen); - if (heredoc_trimmed == NULL) - heredoc_trimmedlen = 0; + has_trim = TRUE; continue; } - if (STRNCMP(p, "eval", 4) == 0) + if (STRNCMP(p, "eval", 4) == 0 + && (p[4] == NUL || VIM_ISWHITE(p[4]))) { // Ignore leading white space. p = skipwhite(p + 4); @@ -1388,6 +1390,13 @@ get_function_body( } break; } + if (has_trim) + { + heredoc_trimmedlen = skipwhite(theline) - theline; + heredoc_trimmed = vim_strnsave(theline, heredoc_trimmedlen); + if (heredoc_trimmed == NULL) + heredoc_trimmedlen = 0; + } skip_until = vim_strnsave(p, skiptowhite(p) - p); getline_options = GETLINE_NONE; is_heredoc = TRUE; diff --git a/src/version.c b/src/version.c index add59593a..545b6354d 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1074, /**/ 1073, /**/ -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_dev/E1tf0k1-003YBF-Iv%40256bit.org.