[17/20] Make exception throwing a bit more efficient

Message ID 20190213212927.9474-18-tom@tromey.com
State Superseded
Headers show
Series
  • Remove cleanups
Related show

Commit Message

Tom Tromey Feb. 13, 2019, 9:29 p.m.
This makes exception throwing a bit more efficient, by removing some
copies.  This is good now that exceptions are more expensive to copy.

gdb/ChangeLog
2019-02-13  Tom Tromey  <tom@tromey.com>

	* common/common-exceptions.c (throw_exception): Rename from
	throw_exception_cxx.  Remove old copy.  Make argument const.
	(throw_it): Create and throw exception objects directly.
	* common/common-exceptions.h (throw_exception): Make argument
	const.
---
 gdb/ChangeLog                  |  8 ++++++++
 gdb/common/common-exceptions.c | 37 ++++++++++++++++++++--------------
 gdb/common/common-exceptions.h |  2 +-
 3 files changed, 31 insertions(+), 16 deletions(-)

-- 
2.17.2

Patch

diff --git a/gdb/common/common-exceptions.c b/gdb/common/common-exceptions.c
index d2ec1994844..b6a386bad24 100644
--- a/gdb/common/common-exceptions.c
+++ b/gdb/common/common-exceptions.c
@@ -188,8 +188,8 @@  throw_exception_sjlj (struct gdb_exception exception)
 
 /* Implementation of throw_exception that uses C++ try/catch.  */
 
-static ATTRIBUTE_NORETURN void
-throw_exception_cxx (struct gdb_exception exception)
+void
+throw_exception (const struct gdb_exception &exception)
 {
   if (exception.reason == RETURN_QUIT)
     {
@@ -209,25 +209,32 @@  throw_exception_cxx (struct gdb_exception exception)
     gdb_assert_not_reached ("invalid return reason");
 }
 
-void
-throw_exception (struct gdb_exception exception)
-{
-  throw_exception_cxx (exception);
-}
-
 static void ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (3, 0)
 throw_it (enum return_reason reason, enum errors error, const char *fmt,
 	  va_list ap)
 {
-  struct gdb_exception e;
+  if (reason == RETURN_QUIT)
+    {
+      gdb_exception_RETURN_MASK_QUIT ex;
 
-  /* Create the exception.  */
-  e.reason = reason;
-  e.error = error;
-  e.message = string_vprintf (fmt, ap);
+      ex.reason = reason;
+      ex.error = error;
+      ex.message = string_vprintf (fmt, ap);
 
-  /* Throw the exception.  */
-  throw_exception (e);
+      throw ex;
+    }
+  else if (reason == RETURN_ERROR)
+    {
+      gdb_exception_RETURN_MASK_ERROR ex;
+
+      ex.reason = reason;
+      ex.error = error;
+      ex.message = string_vprintf (fmt, ap);
+
+      throw ex;
+    }
+  else
+    gdb_assert_not_reached ("invalid return reason");
 }
 
 void
diff --git a/gdb/common/common-exceptions.h b/gdb/common/common-exceptions.h
index 245807c68d6..25cfc7247bc 100644
--- a/gdb/common/common-exceptions.h
+++ b/gdb/common/common-exceptions.h
@@ -209,7 +209,7 @@  struct gdb_quit_bad_alloc
 /* Throw an exception (as described by "struct gdb_exception"),
    landing in the inner most containing exception handler established
    using TRY/CATCH.  */
-extern void throw_exception (struct gdb_exception exception)
+extern void throw_exception (const struct gdb_exception &exception)
      ATTRIBUTE_NORETURN;
 
 /* Throw an exception by executing a LONG JUMP to the inner most