Using unsigned shifts and masks when dealing with 64-bit addresses.
BUG=v8:1037 Review URL: http://codereview.chromium.org/6242005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6388 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
890a0f6b52
commit
b0abe13ed2
10
include/v8.h
10
include/v8.h
@ -3367,7 +3367,7 @@ template <> struct SmiTagging<4> {
|
||||
|
||||
// For 32-bit systems any 2 bytes aligned pointer can be encoded as smi
|
||||
// with a plain reinterpret_cast.
|
||||
static const intptr_t kEncodablePointerMask = 0x1;
|
||||
static const uintptr_t kEncodablePointerMask = 0x1;
|
||||
static const int kPointerToSmiShift = 0;
|
||||
};
|
||||
|
||||
@ -3387,8 +3387,8 @@ template <> struct SmiTagging<8> {
|
||||
// It might be not enough to cover stack allocated objects on some platforms.
|
||||
static const int kPointerAlignment = 3;
|
||||
|
||||
static const intptr_t kEncodablePointerMask =
|
||||
~(intptr_t(0xffffffff) << kPointerAlignment);
|
||||
static const uintptr_t kEncodablePointerMask =
|
||||
~(uintptr_t(0xffffffff) << kPointerAlignment);
|
||||
|
||||
static const int kPointerToSmiShift =
|
||||
kSmiTagSize + kSmiShiftSize - kPointerAlignment;
|
||||
@ -3397,7 +3397,7 @@ template <> struct SmiTagging<8> {
|
||||
typedef SmiTagging<kApiPointerSize> PlatformSmiTagging;
|
||||
const int kSmiShiftSize = PlatformSmiTagging::kSmiShiftSize;
|
||||
const int kSmiValueSize = PlatformSmiTagging::kSmiValueSize;
|
||||
const intptr_t kEncodablePointerMask =
|
||||
const uintptr_t kEncodablePointerMask =
|
||||
PlatformSmiTagging::kEncodablePointerMask;
|
||||
const int kPointerToSmiShift = PlatformSmiTagging::kPointerToSmiShift;
|
||||
|
||||
@ -3457,7 +3457,7 @@ class Internals {
|
||||
}
|
||||
|
||||
static inline void* GetExternalPointerFromSmi(internal::Object* value) {
|
||||
const intptr_t address = reinterpret_cast<intptr_t>(value);
|
||||
const uintptr_t address = reinterpret_cast<uintptr_t>(value);
|
||||
return reinterpret_cast<void*>(address >> kPointerToSmiShift);
|
||||
}
|
||||
|
||||
|
@ -3267,14 +3267,14 @@ void v8::Object::SetInternalField(int index, v8::Handle<Value> value) {
|
||||
|
||||
|
||||
static bool CanBeEncodedAsSmi(void* ptr) {
|
||||
const intptr_t address = reinterpret_cast<intptr_t>(ptr);
|
||||
const uintptr_t address = reinterpret_cast<uintptr_t>(ptr);
|
||||
return ((address & i::kEncodablePointerMask) == 0);
|
||||
}
|
||||
|
||||
|
||||
static i::Smi* EncodeAsSmi(void* ptr) {
|
||||
ASSERT(CanBeEncodedAsSmi(ptr));
|
||||
const intptr_t address = reinterpret_cast<intptr_t>(ptr);
|
||||
const uintptr_t address = reinterpret_cast<uintptr_t>(ptr);
|
||||
i::Smi* result = reinterpret_cast<i::Smi*>(address << i::kPointerToSmiShift);
|
||||
ASSERT(i::Internals::HasSmiTag(result));
|
||||
ASSERT_EQ(result, i::Smi::FromInt(result->value()));
|
||||
|
@ -874,6 +874,10 @@ THREADED_TEST(ExternalWrap) {
|
||||
TestExternalPointerWrapping();
|
||||
|
||||
#if defined(V8_HOST_ARCH_X64)
|
||||
// Check a value with a leading 1 bit in x64 Smi encoding.
|
||||
expected_ptr = reinterpret_cast<void*>(0x400000000);
|
||||
TestExternalPointerWrapping();
|
||||
|
||||
expected_ptr = reinterpret_cast<void*>(0xdeadbeefdeadbeef);
|
||||
TestExternalPointerWrapping();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user