# HG changeset patch # User John W. Eaton # Date 1562942507 14400 # Node ID 336c640c481b1a2efe8e680122602782a093b029 # Parent bee80e27dcc5f312e8d2e0146e72c538d7c361bc make "dbquit all" work and fix dbquit compatibility (bug #56616) * debug.cc (Fdbquit): Accept "all" argument. Don't throw exception, just set debugger flags. * pt-eval.cc (tree_evaluator::do_breakpoint): Don't check current debugger for exit or abort flags. (debugger::repl): Throw interrupt exception if m_abort_debug_repl is true. diff -r bee80e27dcc5 -r 336c640c481b libinterp/corefcn/debug.cc --- a/libinterp/corefcn/debug.cc Thu Jul 11 20:16:58 2019 -0700 +++ b/libinterp/corefcn/debug.cc Fri Jul 12 10:41:47 2019 -0400 @@ -1151,8 +1151,10 @@ DEFMETHOD (dbquit, interp, args, , doc: /* -*- texinfo -*- @deftypefn {} {} dbquit -Quit debugging mode immediately without further code execution and return to -the Octave prompt. +@deftypefnx {} {} dbquit all +Quit debugging mode immediately without further code execution. With no +arguments, exit the current debugging level. With argument @code{all}, +exit all debugging levels and return to the Octave prompt. @seealso{dbcont, dbstep} @end deftypefn */) { @@ -1161,12 +1163,25 @@ if (! tw.in_debug_repl ()) error ("dbquit: can only be called in debug mode"); - if (args.length () != 0) + int nargin = args.length (); + + if (nargin > 1) print_usage (); - tw.debug_mode (false); + if (nargin == 1) + { + std::string arg + = args(0).xstring_value ("dbquit: input argument must be a string"); - throw octave::interrupt_exception (); + if (arg == "all") + tw.abort_debug_repl (true); + else + error ("dbquit: unrecognized argument '%s'", arg.c_str ()); + } + else + tw.exit_debug_repl (true); + + tw.debug_mode (false); return ovl (); } diff -r bee80e27dcc5 -r 336c640c481b libinterp/parse-tree/pt-eval.cc --- a/libinterp/parse-tree/pt-eval.cc Thu Jul 11 20:16:58 2019 -0700 +++ b/libinterp/parse-tree/pt-eval.cc Fri Jul 12 10:41:47 2019 -0400 @@ -239,9 +239,12 @@ while (m_in_debug_repl) { - if (m_exit_debug_repl || m_abort_debug_repl || tw.dbstep_flag ()) + if (m_exit_debug_repl || tw.dbstep_flag ()) break; + if (m_abort_debug_repl) + throw interrupt_exception (); + try { Vtrack_line_num = false; @@ -4405,25 +4408,6 @@ { bool break_on_this_statement = false; - debugger *curr_debugger - = (m_debugger_stack.empty () ? nullptr : m_debugger_stack.top ()); - - if (curr_debugger) - { - if (curr_debugger->exit_debug_repl ()) - { - // This action corresponds to dbcont. - reset_debug_state (); - } - else if (curr_debugger->abort_debug_repl ()) - { - // This action corresponds to dbquit. - debug_mode (false); - - throw interrupt_exception (); - } - } - if (is_breakpoint) break_on_this_statement = true; else if (m_dbstep_flag > 0)