summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-04-20 22:16:39 +0200
committerBram Moolenaar <Bram@vim.org>2021-04-20 22:16:39 +0200
commit9ce47ec0b65f81358febacbd9b808ac8ef7af85c (patch)
tree8fa0092fcaf1c7c287f3d0aec2aaa8102fdfde44
parent5c787fb7928c4cc1e7d6eec0be1bbd63d903cc8d (diff)
downloadvim-git-9ce47ec0b65f81358febacbd9b808ac8ef7af85c.tar.gz
patch 8.2.2792: Vim9: :disas shows instructions for default args but no textv8.2.2792
Problem: Vim9: :disas shows instructions for default args but no text. Solution: Show the expression test above the default argument instructions. (closes #8129)
-rw-r--r--src/testdir/test_vim9_disassemble.vim6
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c19
3 files changed, 25 insertions, 2 deletions
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index bf88d9396..b1c1c1832 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -724,20 +724,22 @@ def Test_disassemble_update_instr()
enddef
-def FuncWithDefault(arg: string = 'default', nr = 77): string
+def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
return arg .. nr
enddef
def Test_disassemble_call_default()
var res = execute('disass FuncWithDefault')
assert_match('FuncWithDefault\_s*' ..
+ ' arg = "default"\_s*' ..
'\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
'\d PUSHS "default"\_s*' ..
'\d STORE arg\[-2]\_s*' ..
+ ' nr = 77\_s*' ..
'3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
'\d PUSHNR 77\_s*' ..
'\d STORE arg\[-1]\_s*' ..
- 'return arg .. nr\_s*' ..
+ ' return arg .. nr\_s*' ..
'6 LOAD arg\[-2]\_s*' ..
'\d LOAD arg\[-1]\_s*' ..
'\d 2STRING stack\[-1]\_s*' ..
diff --git a/src/version.c b/src/version.c
index fa2dfae84..01ec9a1bf 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 */
/**/
+ 2792,
+/**/
2791,
/**/
2790,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index f471454f8..c90fb65b6 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -4338,6 +4338,7 @@ list_instructions(char *pfx, isn_T *instr, int instr_count, ufunc_T *ufunc)
int line_idx = 0;
int prev_current = 0;
int current;
+ int def_arg_idx = 0;
for (current = 0; current < instr_count; ++current)
{
@@ -4345,6 +4346,7 @@ list_instructions(char *pfx, isn_T *instr, int instr_count, ufunc_T *ufunc)
char *line;
if (ufunc != NULL)
+ {
while (line_idx < iptr->isn_lnum
&& line_idx < ufunc->uf_lines.ga_len)
{
@@ -4357,6 +4359,23 @@ list_instructions(char *pfx, isn_T *instr, int instr_count, ufunc_T *ufunc)
if (line != NULL)
msg(line);
}
+ if (iptr->isn_type == ISN_JUMP_IF_ARG_SET)
+ {
+ int first_def_arg = ufunc->uf_args.ga_len
+ - ufunc->uf_def_args.ga_len;
+
+ if (def_arg_idx > 0)
+ msg_puts("\n\n");
+ msg_start();
+ msg_puts(" ");
+ msg_puts(((char **)(ufunc->uf_args.ga_data))[
+ first_def_arg + def_arg_idx]);
+ msg_puts(" = ");
+ msg_puts(((char **)(ufunc->uf_def_args.ga_data))[def_arg_idx++]);
+ msg_clr_eos();
+ msg_end();
+ }
+ }
switch (iptr->isn_type)
{