changeset 24504:e7577f79d6eb v8.2.2792

patch 8.2.2792: Vim9: :disas shows instructions for default args but no text Commit: https://github.com/vim/vim/commit/9ce47ec0b65f81358febacbd9b808ac8ef7af85c Author: Bram Moolenaar <Bram@vim.org> Date: Tue Apr 20 22:16:39 2021 +0200 patch 8.2.2792: Vim9: :disas shows instructions for default args but no text Problem: Vim9: :disas shows instructions for default args but no text. Solution: Show the expression test above the default argument instructions. (closes #8129)
author Bram Moolenaar <Bram@vim.org>
date Tue, 20 Apr 2021 22:30:04 +0200
parents 5e394def267d
children b68e47dd5919
files src/testdir/test_vim9_disassemble.vim src/version.c src/vim9execute.c
diffstat 3 files changed, 25 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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*' ..
--- 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,
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -4338,6 +4338,7 @@ list_instructions(char *pfx, isn_T *inst
     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 *inst
 	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 *inst
 		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)
 	{