]> granicus.if.org Git - vim/commitdiff
patch 8.2.2792: Vim9: :disas shows instructions for default args but no text v8.2.2792
authorBram Moolenaar <Bram@vim.org>
Tue, 20 Apr 2021 20:16:39 +0000 (22:16 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 20 Apr 2021 20:16:39 +0000 (22:16 +0200)
Problem:    Vim9: :disas shows instructions for default args but no text.
Solution:   Show the expression test above the default argument instructions.
            (closes #8129)

src/testdir/test_vim9_disassemble.vim
src/version.c
src/vim9execute.c

index bf88d9396a6da1bf425ecbcc33d0ac95e43303e6..b1c1c18326e187c21d72fb2a84168a2743d17e98 100644 (file)
@@ -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*' ..
index fa2dfae84dfa1d0301b89a9dcd5ce1f3662597a9..01ec9a1bf6dbdd4062a6f31b6dca2877ff9adf8b 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2792,
 /**/
     2791,
 /**/
index f471454f802df835e3bfe2d72013d9a77777f036..c90fb65b679fba689800f2b2a8232d27a3715eb2 100644 (file)
@@ -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)
        {