diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-04-17 17:59:19 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-04-17 17:59:19 +0200 |
commit | c70fe460b09f6182a13e4385f3232df4fdcd0741 (patch) | |
tree | 54bd1289b9a4c1fec951c3571011e01b37017df6 | |
parent | 6c7cc347af4f4bc1bf180d80ef81413f89e78f56 (diff) |
patch 8.2.2775: Vim9: wrong line number used for some commandsv8.2.2775
Problem: Vim9: wrong line number used for some commands.
Solution: For :exe, :echo and the like use the line number of the start of
the command. When calling a function set the line number in the
script context.
-rw-r--r-- | src/structs.h | 2 | ||||
-rw-r--r-- | src/testdir/test_vim9_script.vim | 31 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 8 | ||||
-rw-r--r-- | src/vim9execute.c | 8 |
5 files changed, 46 insertions, 5 deletions
diff --git a/src/structs.h b/src/structs.h index b4bafa5a98..6c8ef48c0b 100644 --- a/src/structs.h +++ b/src/structs.h @@ -2045,7 +2045,7 @@ typedef struct { except_T *except; // exception info } es_info; #if defined(FEAT_EVAL) - scid_T es_save_sid; // saved sc_sid when calling function + sctx_T es_save_sctx; // saved current_sctx when calling function #endif } estack_T; diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index 2f2fc9cc02..1810c5bc82 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -3848,6 +3848,37 @@ def Test_unsupported_commands() CheckScriptFailure(['vim9script'] + lines, 'E1100:') enddef +def Test_mapping_line_number() + var lines =<< trim END + vim9script + def g:FuncA() + # Some comment + FuncB(0) + enddef + # Some comment + def FuncB( + # Some comment + n: number + ) + exe 'nno ' + # Some comment + .. '<F3> a' + .. 'b' + .. 'c' + enddef + END + CheckScriptSuccess(lines) + var res = execute('verbose nmap <F3>') + assert_match('No mapping found', res) + + g:FuncA() + res = execute('verbose nmap <F3>') + assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) + + nunmap <F3> + delfunc g:FuncA +enddef + " Keep this last, it messes up highlighting. def Test_substitute_cmd() new diff --git a/src/version.c b/src/version.c index 5d26348add..3f3b2c91f8 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 */ /**/ + 2775, +/**/ 2774, /**/ 2773, diff --git a/src/vim9compile.c b/src/vim9compile.c index 4ae3b41aed..801f9c193c 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -8221,6 +8221,7 @@ compile_mult_expr(char_u *arg, int cmdidx, cctx_T *cctx) char_u *p = arg; char_u *prev = arg; int count = 0; + int start_ctx_lnum = cctx->ctx_lnum; for (;;) { @@ -8235,6 +8236,11 @@ compile_mult_expr(char_u *arg, int cmdidx, cctx_T *cctx) if (count > 0) { + long save_lnum = cctx->ctx_lnum; + + // Use the line number where the command started. + cctx->ctx_lnum = start_ctx_lnum; + if (cmdidx == CMD_echo || cmdidx == CMD_echon) generate_ECHO(cctx, cmdidx == CMD_echo, count); else if (cmdidx == CMD_execute) @@ -8243,6 +8249,8 @@ compile_mult_expr(char_u *arg, int cmdidx, cctx_T *cctx) generate_MULT_EXPR(cctx, ISN_ECHOMSG, count); else generate_MULT_EXPR(cctx, ISN_ECHOERR, count); + + cctx->ctx_lnum = save_lnum; } return p; } diff --git a/src/vim9execute.c b/src/vim9execute.c index b7db0e2944..abcbce0682 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -329,9 +329,9 @@ call_dfunc( if (entry != NULL) { // Set the script context to the script where the function was defined. - // TODO: save more than the SID? - entry->es_save_sid = current_sctx.sc_sid; - current_sctx.sc_sid = ufunc->uf_script_ctx.sc_sid; + // Save the current context so it can be restored on return. + entry->es_save_sctx = current_sctx; + current_sctx = ufunc->uf_script_ctx; } // Start execution at the first instruction. @@ -562,7 +562,7 @@ func_return(funclocal_T *funclocal, ectx_T *ectx) // execution context goes one level up entry = estack_pop(); if (entry != NULL) - current_sctx.sc_sid = entry->es_save_sid; + current_sctx = entry->es_save_sctx; if (handle_closure_in_use(ectx, TRUE) == FAIL) return FAIL; |