summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-04-17 17:59:19 +0200
committerBram Moolenaar <Bram@vim.org>2021-04-17 17:59:19 +0200
commitc70fe460b09f6182a13e4385f3232df4fdcd0741 (patch)
tree54bd1289b9a4c1fec951c3571011e01b37017df6
parent6c7cc347af4f4bc1bf180d80ef81413f89e78f56 (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.h2
-rw-r--r--src/testdir/test_vim9_script.vim31
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c8
-rw-r--r--src/vim9execute.c8
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;