Mercurial > octave
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 ();