diff src/vim9execute.c @ 24952:ffe784fdec57 v8.2.3013

patch 8.2.3013: Vim: when debugging only first line of command is displayed Commit: https://github.com/vim/vim/commit/4cea536bdf48df459e7ad651dfee006844bbf2c0 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Jun 16 22:24:40 2021 +0200 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)
author Bram Moolenaar <Bram@vim.org>
date Wed, 16 Jun 2021 22:30:03 +0200
parents 5c418c774f95
children 9b7fac4c70a0
line wrap: on
line diff
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1433,6 +1433,52 @@ lookup_debug_var(char_u *name)
     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 @@ exec_instructions(ectx_T *ectx)
 
 	    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: