diff libinterp/interpfcn/input.cc @ 16395:fc491da603f6

also provide a hook for exiting debugger * file-editor-interface.h (file_editor_interface::insert_debugger_pointer_request): Rename from file_editor_interface::handle_update_debug_pointer_request (file_editor_interface::delete_debugger_pointer_request): New function. * file-editor-tab.h, file-editor-tab.cc (file_editor_tab::insert_debugger_pointer): Rename from file_editor_tab::set_debugger_position. Change all uses. (file_editor_tab::delete_debugger_pointer): New function. * file-editor.h, file-editor.cc (file_editor::handle_insert_debugger_pointer_request): Renamem from file_editor::handle_update_debug_pointer_request. Change all uses. (file_editor::handle_delete_debugger_pointer_request): New function. (file_editor::add_file_editor_tab): Connect fetab_delete_debugger_pointer signal to delete_debugger_pointer. (file_editor::fetab_insert_debugger_pointer): Rename from file_editor::fetab_set_debugger_position. Change all uses. (file_editor::fetab_delete_debugger_pointer): New signal. * main-window.h, main-window.cc (main_window::handle_insert_debugger_pointer_request): Rename from main_window::handle_update_debug_pointer_request. (main_window::handle_delete_debugger_pointer_request): New function. (main_window::construct): Connect delete_debugger_pointer_signal to handle_delete_debugger_pointer_request. * octave-event-listener.h (event_listener::insert_debugger_pointer): Rename from event_listener::update_debug_pointer): (event_listener::delete_debugger_pointer): New function * octave-link.h, octave-link.cc (octave_link::do_insert_debugger_pointer): Rename from octave_link::do_update_debug_pointer. Change all uses. (octave_link::do_delete_debugger_pointer): New function. (octave_link::do_enter_debugger_event_hook_fcn): Rename from octave_link::do_debug_input_event_hook_fcn. (octave_link::do_exit_debugger_event_hook_fcn): New function. (enter_debugger_event_hook_fcn): Rename form debug_input_event_hook_fcn. Change all uses. (octave_link::exit_debugger_event_hook_fcn): New function. * octave-main-thread.h, octave-main-thread.cc (enter_debugger_event_hook_fcn): Rename from debug_input_event_hook_fcn. (exit_debugger_event_hook_fcn): New function. (octave_main_thread::run): Install exit_debugger_event_hook_fcn hook function. * octave-qt-event-listener.h, octave-qt-event-listener.cc (octave_qt_event_listener::insert_debugger_pointer): Rename from octave_qt_event_listener::update_debug_pointer. Change all uses. (octave_qt_event_listener::delete_debugger_pointer): New function. * octave-qt-event-listener.h (octave_qt_event_listener::update_debug_pointer_signal): Rename from octave_qt_event_listener::insert_debugger_pointer_signal. Change all uses. (octave_qt_event_listner::delete_debugger_pointer_signal): New signal. * input.cc (enter_debugger_event_hook_functions): Rename from debug_input_event_hook_functions. Change all uses. (exit_debugger_event_hook_functions): New static variable. (exit_debugger_cleanup): new function. (get_debug_input): Use unwind-protect to run exit_debugger_event_hook_functions on return. (Fadd_enter_debugger_event_hook): Rename from Fadd_debug_input_event_hook. Change all uses. (Fremove_enter_debugger_event_hook): Rename from Fremove_debug_input_event_hook. Change all uses. (Fadd_exit_debugger_event_hook, Fremove_exit_debugger_event_hook): New functions.
author John W. Eaton <jwe@octave.org>
date Fri, 29 Mar 2013 22:37:01 -0400
parents 4902484f9181
children 169f71c9d9c8
line wrap: on
line diff
--- a/libinterp/interpfcn/input.cc	Fri Mar 29 12:14:52 2013 -0700
+++ b/libinterp/interpfcn/input.cc	Fri Mar 29 22:37:01 2013 -0400
@@ -125,7 +125,8 @@
 static hook_function_list pre_input_event_hook_functions;
 static hook_function_list input_event_hook_functions;
 static hook_function_list post_input_event_hook_functions;
-static hook_function_list debug_input_event_hook_functions;
+static hook_function_list enter_debugger_event_hook_functions;
+static hook_function_list exit_debugger_event_hook_functions;
 
 // For octave_quit.
 void
@@ -457,8 +458,16 @@
 }
 
 static void
+exit_debugger_cleanup (const octave_value& loc_info)
+{
+  exit_debugger_event_hook_functions.run (loc_info);
+}
+
+static void
 get_debug_input (const std::string& prompt)
 {
+  unwind_protect frame;
+
   octave_user_code *caller = octave_call_stack::caller_user_code ();
   std::string nm;
 
@@ -501,8 +510,11 @@
 
           if (have_file)
             {
-              debug_input_event_hook_functions.run
-                (location_info (nm, curr_debug_line));
+              octave_value loc_info = location_info (nm, curr_debug_line);
+
+              enter_debugger_event_hook_functions.run (loc_info);
+
+              frame.add_fcn (exit_debugger_cleanup, loc_info);
 
               std::string line_buf
                 = get_file_line (nm, curr_debug_line);
@@ -518,8 +530,6 @@
   if (! msg.empty ())
     std::cerr << msg << std::endl;
 
-  unwind_protect frame;
-
   frame.protect_var (VPS1);
   VPS1 = prompt;
 
@@ -1362,10 +1372,10 @@
   return retval;
 }
 
-DEFUN (add_debug_input_event_hook, args, ,
+DEFUN (add_enter_debugger_event_hook, args, ,
   "-*- texinfo -*-\n\
-@deftypefn  {Built-in Function} {@var{id} =} add_debug_input_event_hook (@var{fcn})\n\
-@deftypefnx {Built-in Function} {@var{id} =} add_debug_input_event_hook (@var{fcn}, @var{data})\n\
+@deftypefn  {Built-in Function} {@var{id} =} add_enter_debugger_event_hook (@var{fcn})\n\
+@deftypefnx {Built-in Function} {@var{id} =} add_enter_debugger_event_hook (@var{fcn}, @var{data})\n\
 Add the named function or function handle @var{fcn} to the list of\n\
 functions to call when a debugger breakpoint is reached.  The function\n\
 should have the form\n\
@@ -1388,7 +1398,7 @@
 \n\
 The returned identifier may be used to remove the function handle from\n\
 the list of input hook functions.\n\
-@seealso{remove_debug_input_event_hook}\n\
+@seealso{remove_enter_debugger_event_hook}\n\
 @end deftypefn")
 {
   octave_value retval;
@@ -1406,12 +1416,12 @@
 
       if (! error_state)
         {
-          debug_input_event_hook_functions.insert (hook_fcn.id (), hook_fcn);
+          enter_debugger_event_hook_functions.insert (hook_fcn.id (), hook_fcn);
 
           retval = hook_fcn.id ();
         }
       else
-        error ("add_debug_input_event_hook: expecting string as first arg");
+        error ("add_enter_debugger_event_hook: expecting string as first arg");
     }
   else
     print_usage ();
@@ -1419,14 +1429,14 @@
   return retval;
 }
 
-DEFUN (remove_debug_input_event_hook, args, ,
+DEFUN (remove_enter_debugger_event_hook, args, ,
   "-*- texinfo -*-\n\
-@deftypefn {Built-in Function} {} remove_debug_input_event_hook (@var{name})\n\
-@deftypefnx {Built-in Function} {} remove_debug_input_event_hook (@var{fcn_id})\n\
+@deftypefn {Built-in Function} {} remove_enter_debugger_event_hook (@var{name})\n\
+@deftypefnx {Built-in Function} {} remove_enter_debugger_event_hook (@var{fcn_id})\n\
 Remove the named function or function handle with the given identifier\n\
 from the list of functions to call immediately after accepting\n\
 interactive user input.\n\
-@seealso{add_debug_input_event_hook}\n\
+@seealso{add_enter_debugger_event_hook}\n\
 @end deftypefn")
 {
   octave_value_list retval;
@@ -1442,16 +1452,113 @@
       if (! error_state)
         {
           hook_function_list::iterator p
-            = debug_input_event_hook_functions.find (hook_fcn_id);
+            = enter_debugger_event_hook_functions.find (hook_fcn_id);
 
-          if (p != debug_input_event_hook_functions.end ())
-            debug_input_event_hook_functions.erase (p);
+          if (p != enter_debugger_event_hook_functions.end ())
+            enter_debugger_event_hook_functions.erase (p);
           else if (warn)
-            warning ("remove_debug_input_event_hook: %s not found in list",
+            warning ("remove_enter_debugger_event_hook: %s not found in list",
                      hook_fcn_id.c_str ());
         }
       else
-        error ("remove_debug_input_event_hook: argument not valid as a hook function name or id");
+        error ("remove_enter_debugger_event_hook: argument not valid as a hook function name or id");
+    }
+  else
+    print_usage ();
+
+  return retval;
+}
+
+DEFUN (add_exit_debugger_event_hook, args, ,
+  "-*- texinfo -*-\n\
+@deftypefn  {Built-in Function} {@var{id} =} add_exit_debugger_event_hook (@var{fcn})\n\
+@deftypefnx {Built-in Function} {@var{id} =} add_exit_debugger_event_hook (@var{fcn}, @var{data})\n\
+Add the named function or function handle @var{fcn} to the list of\n\
+functions to call when continuing execution after a debugger breakpoint.\n\
+The function should have the form\n\
+\n\
+@example\n\
+@var{fcn} (@var{location}, @var{data})\n\
+@end example\n\
+\n\
+in which @var{location} is a structure containing the following elements:\n\
+\n\
+@table @code\n\
+@item file\n\
+The name of the file where the breakpoint is located.\n\
+@item line\n\
+The line number corresponding to the breakpoint.\n\
+@end table\n\
+\n\
+If @var{data} is omitted when the hook function is added, the hook\n\
+function is called with a single argument.\n\
+\n\
+The returned identifier may be used to remove the function handle from\n\
+the list of input hook functions.\n\
+@seealso{remove_exit_debugger_event_hook}\n\
+@end deftypefn")
+{
+  octave_value retval;
+
+  int nargin = args.length ();
+
+  if (nargin == 1 || nargin == 2)
+    {
+      octave_value user_data;
+
+      if (nargin == 2)
+        user_data = args(1);
+
+      hook_function hook_fcn (args(0), user_data);
+
+      if (! error_state)
+        {
+          exit_debugger_event_hook_functions.insert (hook_fcn.id (), hook_fcn);
+
+          retval = hook_fcn.id ();
+        }
+      else
+        error ("add_exit_debugger_event_hook: expecting string as first arg");
+    }
+  else
+    print_usage ();
+
+  return retval;
+}
+
+DEFUN (remove_exit_debugger_event_hook, args, ,
+  "-*- texinfo -*-\n\
+@deftypefn {Built-in Function} {} remove_exit_debugger_event_hook (@var{name})\n\
+@deftypefnx {Built-in Function} {} remove_exit_debugger_event_hook (@var{fcn_id})\n\
+Remove the named function or function handle with the given identifier\n\
+from the list of functions to call immediately after accepting\n\
+interactive user input.\n\
+@seealso{add_exit_debugger_event_hook}\n\
+@end deftypefn")
+{
+  octave_value_list retval;
+
+  int nargin = args.length ();
+
+  if (nargin == 1 || nargin == 2)
+    {
+      std::string hook_fcn_id = args(0).string_value ();
+
+      bool warn = (nargin < 2);
+
+      if (! error_state)
+        {
+          hook_function_list::iterator p
+            = exit_debugger_event_hook_functions.find (hook_fcn_id);
+
+          if (p != exit_debugger_event_hook_functions.end ())
+            exit_debugger_event_hook_functions.erase (p);
+          else if (warn)
+            warning ("remove_exit_debugger_event_hook: %s not found in list",
+                     hook_fcn_id.c_str ());
+        }
+      else
+        error ("remove_exit_debugger_event_hook: argument not valid as a hook function name or id");
     }
   else
     print_usage ();