patch 8.2.3013: Vim: when debugging only first line of command is displayed
Problem: Vim: when debugging only the first line of a command using line
continuation is displayed.
Solution: Find the next command and concatenate lines until that one.
(closes #8392)
diff --git a/src/vim9execute.c b/src/vim9execute.c
index bbcf7ff..33e9244 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1433,6 +1433,52 @@
return NULL;
}
+ static void
+handle_debug(isn_T *iptr, ectx_T *ectx)
+{
+ char_u *line;
+ ufunc_T *ufunc = (((dfunc_T *)def_functions.ga_data)
+ + ectx->ec_dfunc_idx)->df_ufunc;
+ isn_T *ni;
+ int end_lnum = iptr->isn_lnum;
+ garray_T ga;
+ int lnum;
+
+ SOURCING_LNUM = iptr->isn_lnum;
+ debug_context = ectx;
+ debug_var_count = iptr->isn_arg.number;
+
+ for (ni = iptr + 1; ni->isn_type != ISN_FINISH; ++ni)
+ if (ni->isn_type == ISN_DEBUG
+ || ni->isn_type == ISN_RETURN
+ || ni->isn_type == ISN_RETURN_VOID)
+ {
+ end_lnum = ni->isn_lnum;
+ break;
+ }
+
+ if (end_lnum > iptr->isn_lnum)
+ {
+ ga_init2(&ga, sizeof(char_u *), 10);
+ for (lnum = iptr->isn_lnum; lnum < end_lnum; ++lnum)
+ if (ga_grow(&ga, 1) == OK)
+ ((char_u **)(ga.ga_data))[ga.ga_len++] =
+ skipwhite(((char_u **)ufunc->uf_lines.ga_data)[lnum - 1]);
+ line = ga_concat_strings(&ga, " ");
+ vim_free(ga.ga_data);
+ }
+ else
+ line = ((char_u **)ufunc->uf_lines.ga_data)[iptr->isn_lnum - 1];
+ if (line == NULL)
+ line = (char_u *)"[empty]";
+
+ do_debug(line);
+ debug_context = NULL;
+
+ if (end_lnum > iptr->isn_lnum)
+ vim_free(line);
+}
+
/*
* Execute instructions in execution context "ectx".
* Return OK or FAIL;
@@ -4156,21 +4202,7 @@
case ISN_DEBUG:
if (ex_nesting_level <= debug_break_level)
- {
- char_u *line;
- ufunc_T *ufunc = (((dfunc_T *)def_functions.ga_data)
- + ectx->ec_dfunc_idx)->df_ufunc;
-
- SOURCING_LNUM = iptr->isn_lnum;
- debug_context = ectx;
- debug_var_count = iptr->isn_arg.number;
- line = ((char_u **)ufunc->uf_lines.ga_data)[
- iptr->isn_lnum - 1];
- if (line == NULL)
- line = (char_u *)"[empty]";
- do_debug(line);
- debug_context = NULL;
- }
+ handle_debug(iptr, ectx);
break;
case ISN_SHUFFLE: