| Index: src/globals.h
|
| ===================================================================
|
| --- src/globals.h (revision 401)
|
| +++ src/globals.h (working copy)
|
| @@ -463,6 +463,42 @@
|
| #define INLINE(header) inline header
|
| #endif
|
|
|
| +// The type-based aliasing rule allows the compiler to assume that pointers of
|
| +// different types (for some definition of different) never alias each other.
|
| +// Thus the following code does not work:
|
| +//
|
| +// float f = foo();
|
| +// int fbits = *(int*)(&f);
|
| +//
|
| +// The compiler 'knows' that the int pointer can't refer to f since the types
|
| +// don't match, so the compiler may cache f in a register, leaving random data
|
| +// in fbits. Using C++ style casts makes no difference, however a pointer to
|
| +// char data is assumed to alias any other pointer. This is the 'memcpy
|
| +// exception'.
|
| +//
|
| +// Bit_cast uses the memcpy exception to move the bits from a variable of one
|
| +// type o a variable of another type. Of course the end result is likely to
|
| +// be implementation dependent. Most compilers (gcc-4.2 and MSVC 2005)
|
| +// will completely optimize bit_cast away.
|
| +//
|
| +// There is an additional use for bit_cast.
|
| +// Recent gccs will warn when they see casts that may result in breakage due to
|
| +// the type-based aliasing rule. If you have checked that there is no breakage
|
| +// you can use bit_cast 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.
|
| +template <class Dest, class Source>
|
| +inline Dest bit_cast(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];
|
| +
|
| + Dest dest;
|
| + memcpy(&dest, &source, sizeof(dest));
|
| + return dest;
|
| +}
|
| +
|
| +
|
| } } // namespace v8::internal
|
|
|
| #endif // V8_GLOBALS_H_
|
|
|