diff src/vim9execute.c @ 24978:2818b8108d92 v8.2.3026

patch 8.2.3026: Vim9: cannot set breakpoint in compiled function Commit: https://github.com/vim/vim/commit/4f8f54280fa728b7d5a63b67d02b60a3b3dce543 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jun 20 19:28:14 2021 +0200 patch 8.2.3026: Vim9: cannot set breakpoint in compiled function Problem: Vim9: cannot set breakpoint in compiled function. Solution: Check for breakpoint when calling a function.
author Bram Moolenaar <Bram@vim.org>
date Sun, 20 Jun 2021 19:30:03 +0200
parents 64b70a958f19
children 2cb78583fada
line wrap: on
line diff
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -148,6 +148,23 @@ exe_newlist(int count, ectx_T *ectx)
 }
 
 /*
+ * If debug_tick changed check if "ufunc" has a breakpoint and update
+ * "uf_has_breakpoint".
+ */
+    static void
+update_has_breakpoint(ufunc_T *ufunc)
+{
+    if (ufunc->uf_debug_tick != debug_tick)
+    {
+	linenr_T breakpoint;
+
+	ufunc->uf_debug_tick = debug_tick;
+	breakpoint = dbg_find_breakpoint(FALSE, ufunc->uf_name, 0);
+	ufunc->uf_has_breakpoint = breakpoint > 0;
+    }
+}
+
+/*
  * Call compiled function "cdf_idx" from compiled code.
  * This adds a stack frame and sets the instruction pointer to the start of the
  * called function.
@@ -1444,6 +1461,20 @@ handle_debug(isn_T *iptr, ectx_T *ectx)
     garray_T	ga;
     int		lnum;
 
+    if (ex_nesting_level > debug_break_level)
+    {
+	linenr_T breakpoint;
+
+	if (!ufunc->uf_has_breakpoint)
+	    return;
+
+	// check for the next breakpoint if needed
+	breakpoint = dbg_find_breakpoint(FALSE, ufunc->uf_name,
+							   iptr->isn_lnum - 1);
+	if (breakpoint <= 0 || breakpoint > iptr->isn_lnum)
+	    return;
+    }
+
     SOURCING_LNUM = iptr->isn_lnum;
     debug_context = ectx;
     debug_var_count = iptr->isn_arg.number;
@@ -4206,8 +4237,7 @@ exec_instructions(ectx_T *ectx)
 		break;
 
 	    case ISN_DEBUG:
-		if (ex_nesting_level <= debug_break_level)
-		    handle_debug(iptr, ectx);
+		handle_debug(iptr, ectx);
 		break;
 
 	    case ISN_SHUFFLE:
@@ -4383,6 +4413,9 @@ call_def_function(
 #undef STACK_TV_VAR
 #define STACK_TV_VAR(idx) (((typval_T *)ectx.ec_stack.ga_data) + ectx.ec_frame_idx + STACK_FRAME_SIZE + idx)
 
+    // Update uf_has_breakpoint if needed.
+    update_has_breakpoint(ufunc);
+
     if (ufunc->uf_def_status == UF_NOT_COMPILED
 	    || ufunc->uf_def_status == UF_COMPILE_ERROR
 	    || (func_needs_compiling(ufunc, COMPILE_TYPE(ufunc))