Chromium Code Reviews| 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 |