Index: src/base/macros.h |
diff --git a/src/base/macros.h b/src/base/macros.h |
index fa522fb94531c26f4eb7e95b0b3ed910ea43ad93..23d661f49f0982c7486ef0a4a39e9ffd68270a17 100644 |
--- a/src/base/macros.h |
+++ b/src/base/macros.h |
@@ -75,4 +75,38 @@ |
#define V8_IMMEDIATE_CRASH() ((void(*)())0)() |
#endif |
+ |
+// Use C++11 static_assert if possible, which gives error |
+// messages that are easier to understand on first sight. |
+#if V8_HAS_CXX11_STATIC_ASSERT |
+#define STATIC_ASSERT(test) static_assert(test, #test) |
+#else |
+// This is inspired by the static assertion facility in boost. This |
+// is pretty magical. If it causes you trouble on a platform you may |
+// find a fix in the boost code. |
+template <bool> class StaticAssertion; |
+template <> class StaticAssertion<true> { }; |
+// This macro joins two tokens. If one of the tokens is a macro the |
+// helper call causes it to be resolved before joining. |
+#define SEMI_STATIC_JOIN(a, b) SEMI_STATIC_JOIN_HELPER(a, b) |
+#define SEMI_STATIC_JOIN_HELPER(a, b) a##b |
+// Causes an error during compilation of the condition is not |
+// statically known to be true. It is formulated as a typedef so that |
+// it can be used wherever a typedef can be used. Beware that this |
+// actually causes each use to introduce a new defined type with a |
+// name depending on the source line. |
+template <int> class StaticAssertionHelper { }; |
+#define STATIC_ASSERT(test) \ |
+ typedef \ |
+ StaticAssertionHelper<sizeof(StaticAssertion<static_cast<bool>((test))>)> \ |
+ SEMI_STATIC_JOIN(__StaticAssertTypedef__, __LINE__) V8_UNUSED |
+ |
+#endif |
+ |
+ |
+// The USE(x) template is used to silence C++ compiler warnings |
+// issued for (yet) unused variables (typically parameters). |
+template <typename T> |
+inline void USE(T) { } |
+ |
#endif // V8_BASE_MACROS_H_ |