| Index: src/utils.h
|
| ===================================================================
|
| --- src/utils.h (revision 4110)
|
| +++ src/utils.h (working copy)
|
| @@ -29,6 +29,7 @@
|
| #define V8_UTILS_H_
|
|
|
| #include <stdlib.h>
|
| +#include <string.h>
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -396,7 +397,7 @@
|
| if (this == &rhs) return *this;
|
| Vector<T>::operator=(rhs);
|
| memcpy(buffer_, rhs.buffer_, sizeof(T) * kSize);
|
| - set_start(buffer_);
|
| + this->set_start(buffer_);
|
| return *this;
|
| }
|
|
|
| @@ -599,6 +600,43 @@
|
| // Calculate 10^exponent.
|
| int TenToThe(int exponent);
|
|
|
| +
|
| +// 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 of 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 BitCast away.
|
| +//
|
| +// There is an additional use for BitCast.
|
| +// 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 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.
|
| +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];
|
| +
|
| + Dest dest;
|
| + memcpy(&dest, &source, sizeof(dest));
|
| + return dest;
|
| +}
|
| +
|
| +
|
| } } // namespace v8::internal
|
|
|
| #endif // V8_UTILS_H_
|
|
|