Index: src/utils.h |
diff --git a/src/utils.h b/src/utils.h |
index 21e70d758e9df8e980fc439dbcafc3910e984f82..219343b7fab0fe096c35aae938c781c3f034ff51 100644 |
--- a/src/utils.h |
+++ b/src/utils.h |
@@ -760,20 +760,32 @@ static inline int TenToThe(int exponent) { |
// you can use BitCast to cast one pointer type to another. This confuses gcc |
// enough that it can no longer see that you have cast one pointer type to |
// another thus avoiding the warning. |
+ |
+// We need different implementations of BitCast for pointer and non-pointer |
+// values. We use partial specialization of auxiliary struct to work around |
+// issues with template functions overloading. |
template <class Dest, class Source> |
-inline Dest BitCast(const Source& source) { |
- // Compile time assertion: sizeof(Dest) == sizeof(Source) |
- // A compile error here means your Dest and Source have different sizes. |
- typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1]; |
+struct BitCastHelper { |
+ STATIC_ASSERT(sizeof(Dest) == sizeof(Source)); |
- Dest dest; |
- memcpy(&dest, &source, sizeof(dest)); |
- return dest; |
-} |
+ INLINE(static Dest cast(const Source& source)) { |
+ Dest dest; |
+ memcpy(&dest, &source, sizeof(dest)); |
+ return dest; |
+ } |
+}; |
template <class Dest, class Source> |
-inline Dest BitCast(Source* source) { |
- return BitCast<Dest>(reinterpret_cast<uintptr_t>(source)); |
+struct BitCastHelper<Dest, Source*> { |
+ INLINE(static Dest cast(Source* source)) { |
+ return BitCastHelper<Dest, uintptr_t>:: |
+ cast(reinterpret_cast<uintptr_t>(source)); |
+ } |
+}; |
+ |
Erik Corry
2011/01/25 10:30:40
Two blank lines.
|
+template <class Dest, class Source> |
+inline Dest BitCast(const Source& source) { |
+ return BitCastHelper<Dest, Source>::cast(source); |
} |
} } // namespace v8::internal |