Mercurial > vim
changeset 24471:baf75c8e1b7b v8.2.2775
patch 8.2.2775: Vim9: wrong line number used for some commands
Commit: https://github.com/vim/vim/commit/c70fe460b09f6182a13e4385f3232df4fdcd0741
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Apr 17 17:59:19 2021 +0200
patch 8.2.2775: Vim9: wrong line number used for some commands
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.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 17 Apr 2021 18:00:04 +0200 |
parents | 9e75cdb46bc5 |
children | 56a9d1063ba0 |
files | src/structs.h src/testdir/test_vim9_script.vim src/version.c src/vim9compile.c src/vim9execute.c |
diffstat | 5 files changed, 46 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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;
--- 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
--- 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,
--- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -8221,6 +8221,7 @@ compile_mult_expr(char_u *arg, int cmdid 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 cmdid 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 cmdid generate_MULT_EXPR(cctx, ISN_ECHOMSG, count); else generate_MULT_EXPR(cctx, ISN_ECHOERR, count); + + cctx->ctx_lnum = save_lnum; } return p; }
--- 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 // 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;