]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Don't allow new-ui to start the TUI
authorTom Tromey <tromey@adacore.com>
Tue, 16 Aug 2022 15:31:33 +0000 (09:31 -0600)
committerTom Tromey <tromey@adacore.com>
Fri, 17 May 2024 15:39:41 +0000 (09:39 -0600)
The TUI can't really work properly with new-ui, at least not as
currently written.  This patch changes new-ui to reject an attempt.
Attempting to make a DAP ui this way is also now rejected.

Regression tested on x86-64 Fedora 38.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29273
Approved-By: Andrew Burgess <aburgess@redhat.com>
gdb/interps.c
gdb/interps.h
gdb/main.c
gdb/python/py-dap.c
gdb/testsuite/gdb.base/new-ui.exp
gdb/tui/tui-interp.c
gdb/ui.c

index 94a982e97ab1a856a57ec13d679a4dad5f167dcf..59c4ec532a7e5a8d0314d9d26641940183824421 100644 (file)
@@ -187,13 +187,16 @@ interp_lookup (struct ui *ui, const char *name)
 /* See interps.h.  */
 
 void
-set_top_level_interpreter (const char *name)
+set_top_level_interpreter (const char *name, bool for_new_ui)
 {
   /* Find it.  */
   struct interp *interp = interp_lookup (current_ui, name);
 
   if (interp == NULL)
     error (_("Interpreter `%s' unrecognized"), name);
+  if (for_new_ui && !interp->supports_new_ui ())
+    error (_("interpreter '%s' cannot be used with a new UI"), name);
+
   /* Install it.  */
   interp_set (interp, true);
 }
index bd435d734afcc042bc3d29e039d9a8f26c5ffd69..8d80c005ded39600c5c83d3982103b8625dd2f99 100644 (file)
@@ -84,6 +84,10 @@ public:
   virtual bool supports_command_editing ()
   { return false; }
 
+  /* Returns true if this interpreter supports new UIs.  */
+  virtual bool supports_new_ui () const
+  { return true; }
+
   const char *name () const
   { return m_name; }
 
@@ -201,8 +205,10 @@ extern struct interp *interp_lookup (struct ui *ui, const char *name);
 
 /* Set the current UI's top level interpreter to the interpreter named
    NAME.  Throws an error if NAME is not a known interpreter or the
-   interpreter fails to initialize.  */
-extern void set_top_level_interpreter (const char *name);
+   interpreter fails to initialize.  FOR_NEW_UI is true when called
+   from the 'new-ui' command, and causes an extra check to ensure the
+   interpreter is valid for a new UI.  */
+extern void set_top_level_interpreter (const char *name, bool for_new_ui);
 
 /* Temporarily set the current interpreter, and reset it on
    destruction.  */
index 8b81640e8d22c6e2a8285a76e5bc0710bc3badde..efc04a66bbbb0b9bb94fa616ced1da57664de452 100644 (file)
@@ -1147,7 +1147,7 @@ captured_main_1 (struct captured_main_args *context)
 
   /* Install the default UI.  All the interpreters should have had a
      look at things by now.  Initialize the default interpreter.  */
-  set_top_level_interpreter (interpreter_p.c_str ());
+  set_top_level_interpreter (interpreter_p.c_str (), false);
 
   /* The interpreter should have installed the real uiout by now.  */
   gdb_assert (current_uiout != temp_uiout.get ());
index 861514d90021a59e1f7c718f0b3574a681146845..d5555c90a11bf91ba2a3070303d1f4684025cac3 100644 (file)
@@ -62,6 +62,9 @@ public:
 
   void pre_command_loop () override;
 
+  bool supports_new_ui () const override
+  { return false; }
+
 private:
 
   std::unique_ptr<ui_out> m_ui_out;
index 97166925c1bf86192b231658652d416d964a6274..2dfcbf7e108cca44603b47e1186c6e9bb31e9720 100644 (file)
@@ -183,6 +183,11 @@ proc_with_prefix do_test_invalid_args {} {
             "Interpreter `bloop' unrecognized" \
             "new-ui with bad interpreter name"
 
+    # Test that the TUI cannot be used for a new UI.
+    gdb_test "new-ui tui $extra_tty_name" \
+       "interpreter 'tui' cannot be used with a new UI" \
+       "new-ui with tui"
+
     # Test that we can continue working normally.
     if ![runto_main] {
        return
index a75708ba662427c7a7d1a33fade374f1df1852b2..7ebaf8f83f74e006c42db892f786b57b3cc8f7f8 100644 (file)
@@ -50,6 +50,9 @@ public:
   void suspend () override;
   void exec (const char *command_str) override;
   ui_out *interp_ui_out () override;
+
+  bool supports_new_ui () const override
+  { return false; }
 };
 
 /* Cleanup the tui before exiting.  */
index 80ee67dbae5a303b508eb6d5219de3396ed3df76..e5c7965d8dc1f847adbd57b1394b52a248d278b3 100644 (file)
--- a/gdb/ui.c
+++ b/gdb/ui.c
@@ -224,7 +224,7 @@ new_ui_command (const char *args, int from_tty)
 
     current_ui = ui.get ();
 
-    set_top_level_interpreter (interpreter_name);
+    set_top_level_interpreter (interpreter_name, true);
 
     top_level_interpreter ()->pre_command_loop ();