Cut throwOnFail
authorYedidya Feldblum <yfeldblum@fb.com>
Wed, 26 Jul 2017 07:04:24 +0000 (00:04 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Wed, 26 Jul 2017 07:13:31 +0000 (00:13 -0700)
Summary:
[Folly] Cut `throwOnFail`.

It is not necessary, and `CHECK_THROW`, its reason for existing, can be implemented without it.

It can also easily be a pessimization because there is no way to delay computation of the arguments to the exception ctor until after the check. So if there is, say, a computation using `sformat` to compute a string argument to the exception ctor, that will always be performed rather than being performed only should the check fail.

Reviewed By: Orvid

Differential Revision: D5478804

fbshipit-source-id: 71a125c126eae76c6e95ef1bd23ee883b1db39a5

folly/Exception.h

index 28e0793816dbfcf448416fe5e441623792be1d1b..4a05535b3f5d828081981f98c5b42ca018c04c57 100644 (file)
@@ -103,18 +103,15 @@ void checkFopenErrorExplicit(FILE* fp, int savedErrno, Args&&... args) {
   }
 }
 
-template <typename E, typename V, typename... Args>
-void throwOnFail(V&& value, Args&&... args) {
-  if (!value) {
-    throw E(std::forward<Args>(args)...);
-  }
-}
-
 /**
  * If cond is not true, raise an exception of type E.  E must have a ctor that
  * works with const char* (a description of the failure).
  */
-#define CHECK_THROW(cond, E) \
-  ::folly::throwOnFail<E>((cond), "Check failed: " #cond)
+#define CHECK_THROW(cond, E)           \
+  do {                                 \
+    if (!(cond)) {                     \
+      throw E("Check failed: " #cond); \
+    }                                  \
+  } while (0)
 
 }  // namespace folly