summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-04-14 12:40:00 +0200
committerBram Moolenaar <Bram@vim.org>2021-04-14 12:40:00 +0200
commitf62d73933af7830301989eb8162ce94a80e61fbf (patch)
tree61cd05f8b37027a585279eb0dedb43f465cb943d /src
parent2e240bd428c0033d16f201d7f837636412358199 (diff)
patch 8.2.2762: Vim9: function line truncated when compilingv8.2.2762
Problem: Vim9: function line truncated when compiling. Solution: Copy the line before processing it. (closes #8101)
Diffstat (limited to 'src')
-rw-r--r--src/testdir/test_vim9_disassemble.vim39
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c10
3 files changed, 51 insertions, 0 deletions
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index 363aaea356..3ea2ad9a40 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -386,6 +386,33 @@ def Test_disassemble_blob_add()
res)
enddef
+def s:BlobIndexSlice()
+ var b: blob = 0z112233
+ echo b[1]
+ echo b[1 : 2]
+enddef
+
+def Test_disassemble_blob_index_slice()
+ var res = execute('disass s:BlobIndexSlice')
+ assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
+ 'var b: blob = 0z112233\_s*' ..
+ '\d PUSHBLOB 0z112233\_s*' ..
+ '\d STORE $0\_s*' ..
+ 'echo b\[1\]\_s*' ..
+ '\d LOAD $0\_s*' ..
+ '\d PUSHNR 1\_s*' ..
+ '\d BLOBINDEX\_s*' ..
+ '\d ECHO 1\_s*' ..
+ 'echo b\[1 : 2\]\_s*' ..
+ '\d LOAD $0\_s*' ..
+ '\d PUSHNR 1\_s*' ..
+ '\d\+ PUSHNR 2\_s*' ..
+ '\d\+ BLOBSLICE\_s*' ..
+ '\d\+ ECHO 1\_s*' ..
+ '\d\+ RETURN 0',
+ res)
+enddef
+
def s:ScriptFuncUnlet()
g:somevar = "value"
unlet g:somevar
@@ -2018,5 +2045,17 @@ def Test_profiled()
res)
enddef
+def s:EchoMessages()
+ echohl ErrorMsg | echom v:exception | echohl NONE
+enddef
+
+def Test_disassemble_nextcmd()
+ # splitting commands and removing trailing blanks should not change the line
+ var res = execute('disass s:EchoMessages')
+ assert_match('<SNR>\d*_EchoMessages\_s*' ..
+ 'echohl ErrorMsg | echom v:exception | echohl NONE',
+ res)
+enddef
+
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
diff --git a/src/version.c b/src/version.c
index 5372cb46cb..72da5f91ba 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2762,
+/**/
2761,
/**/
2760,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 4a55f1973b..0ada441a4b 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -8486,6 +8486,7 @@ compile_def_function(
cctx_T *outer_cctx)
{
char_u *line = NULL;
+ char_u *line_to_free = NULL;
char_u *p;
char *errormsg = NULL; // error message
cctx_T cctx;
@@ -8647,6 +8648,14 @@ compile_def_function(
#endif
break;
}
+ // Make a copy, splitting off nextcmd and removing trailing spaces
+ // may change it.
+ if (line != NULL)
+ {
+ line = vim_strsave(line);
+ vim_free(line_to_free);
+ line_to_free = line;
+ }
}
CLEAR_FIELD(ea);
@@ -9095,6 +9104,7 @@ erret:
if (do_estack_push)
estack_pop();
+ vim_free(line_to_free);
free_imported(&cctx);
free_locals(&cctx);
ga_clear(&cctx.ctx_type_stack);