Make exception throwing a bit more efficient
authorTom Tromey <tom@tromey.com>
Mon, 28 Jan 2019 17:56:58 +0000 (10:56 -0700)
committerTom Tromey <tom@tromey.com>
Mon, 8 Apr 2019 15:05:41 +0000 (09:05 -0600)
This makes exception throwing a bit more efficient, by removing some
copies.

gdb/ChangeLog
2019-04-08  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.
(struct gdb_exception_error): Add constructor.
(struct gdb_exception_quit): Add constructor.

gdb/ChangeLog
gdb/common/common-exceptions.c
gdb/common/common-exceptions.h

index 36b6b619fe7f9a30a8c3d53162e2680e35b8095c..a0d8d091e6e4dee541de4efb9f9fd3c47457940f 100644 (file)
@@ -1,3 +1,13 @@
+2019-04-08  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.
+       (struct gdb_exception_error): Add constructor.
+       (struct gdb_exception_quit): Add constructor.
+
 2019-04-08  Tom Tromey  <tom@tromey.com>
 
        * common/common-exceptions.h (exception_rethrow): Don't declare.
index d3c01e53387fb21284608a141cd33261339f7316..83f2c74bfd482cd098e763818aa44801b37c9f9e 100644 (file)
@@ -180,8 +180,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 gdb_exception &exception)
 {
   if (exception.reason == RETURN_QUIT)
     {
@@ -197,25 +197,24 @@ 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;
-
-  /* Create the exception.  */
-  e.reason = reason;
-  e.error = error;
-  e.message.reset (new std::string (string_vprintf (fmt, ap)));
-
-  /* Throw the exception.  */
-  throw_exception (e);
+  if (reason == RETURN_QUIT)
+    {
+      gdb_exception_quit ex (reason, error);
+      ex.message.reset (new std::string (string_vprintf (fmt, ap)));
+      throw ex;
+    }
+  else if (reason == RETURN_ERROR)
+    {
+      gdb_exception_error ex (reason, error);
+      ex.message.reset (new std::string (string_vprintf (fmt, ap)));
+      throw ex;
+    }
+  else
+    gdb_assert_not_reached ("invalid return reason");
 }
 
 void
index b09a34b0a3517ab4ccaf22fa101b2bba3c7f41a1..1aedb831a626797705e409fe9acdc9b89c9369ac 100644 (file)
@@ -214,6 +214,11 @@ extern int exceptions_state_mc_catch (struct gdb_exception *, int);
 
 struct gdb_exception_error : public gdb_exception
 {
+  gdb_exception_error (enum return_reason r, enum errors e)
+    : gdb_exception (r, e)
+  {
+  }
+
   explicit gdb_exception_error (const gdb_exception &ex) noexcept
     : gdb_exception (ex)
   {
@@ -222,6 +227,11 @@ struct gdb_exception_error : public gdb_exception
 
 struct gdb_exception_quit : public gdb_exception
 {
+  gdb_exception_quit (enum return_reason r, enum errors e)
+    : gdb_exception (r, e)
+  {
+  }
+
   explicit gdb_exception_quit (const gdb_exception &ex) noexcept
     : gdb_exception (ex)
   {
@@ -250,7 +260,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 gdb_exception &exception)
      ATTRIBUTE_NORETURN;
 
 /* Throw an exception by executing a LONG JUMP to the inner most