changeset 29420:4ee5a22dd4fe

fix interrupt and dbquit behavior when using server mode * pt-eval.cc (debugger::server_loop): Set octave_interrupt_state to 1 before calling interpreter::recover_from_exception. (debugger::quitting_debugger): Make server mode and top-level repl behavior the same. (tree_evaluator::server_loop): Set octave_interrupt_state to 1 before calling interpreter::recover_from_exception. Also handle quit_debug_exception.
author John W. Eaton <jwe@octave.org>
date Tue, 09 Mar 2021 22:19:58 -0500
parents 2cfdcae08e84
children e4904768ca48
files libinterp/parse-tree/pt-eval.cc
diffstat 1 files changed, 14 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/parse-tree/pt-eval.cc	Tue Mar 09 15:20:31 2021 -0800
+++ b/libinterp/parse-tree/pt-eval.cc	Tue Mar 09 22:19:58 2021 -0500
@@ -193,6 +193,7 @@
           }
         catch (const interrupt_exception&)
           {
+            octave_interrupt_state = 1;
             m_interpreter.recover_from_exception ();
 
             // Required newline when the user does Ctrl+C at the prompt.
@@ -506,7 +507,8 @@
         // If there is no enclosing debug level or the top-level
         // repl is not active, handle dbquit the same as dbcont.
 
-        if (m_level > 0 || m_interpreter.in_top_level_repl ())
+        if (m_level > 0 || m_interpreter.server_mode ()
+            || m_interpreter.in_top_level_repl ())
           throw quit_debug_exception ();
         else
           return true;
@@ -517,7 +519,7 @@
         // If the top-level repl is not active, handle "dbquit all"
         // the same as dbcont.
 
-        if (m_interpreter.in_top_level_repl ())
+        if (m_interpreter.server_mode () || m_interpreter.in_top_level_repl ())
           throw quit_debug_exception (true);
         else
           return true;
@@ -793,6 +795,7 @@
           }
         catch (const interrupt_exception&)
           {
+            octave_interrupt_state = 1;
             m_interpreter.recover_from_exception ();
 
             m_parser->reset ();
@@ -831,6 +834,13 @@
                 break;
               }
           }
+        catch (const quit_debug_exception&)
+          {
+            octave_interrupt_state = 1;
+            m_interpreter.recover_from_exception ();
+
+            m_parser->reset ();
+          }
         catch (const std::bad_alloc&)
           {
             m_interpreter.recover_from_exception ();
@@ -3179,6 +3189,8 @@
     if (echo ())
       push_echo_state (tree_evaluator::ECHO_SCRIPTS, file_name);
 
+    // FIXME: Should we be using tree_evaluator::eval here?
+
     cmd_list->accept (*this);
 
     if (m_returning)