From b0abe13ed2c7b468a333139301634f6f7c29828f Mon Sep 17 00:00:00 2001 From: "antonm@chromium.org" Date: Wed, 19 Jan 2011 11:16:23 +0000 Subject: [PATCH] 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 --- include/v8.h | 10 +++++----- src/api.cc | 4 ++-- test/cctest/test-api.cc | 4 ++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/include/v8.h b/include/v8.h index 7d18107..5e57bed 100644 --- a/include/v8.h +++ b/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 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(value); + const uintptr_t address = reinterpret_cast(value); return reinterpret_cast(address >> kPointerToSmiShift); } diff --git a/src/api.cc b/src/api.cc index 073306f..9303782 100644 --- a/src/api.cc +++ b/src/api.cc @@ -3267,14 +3267,14 @@ void v8::Object::SetInternalField(int index, v8::Handle value) { static bool CanBeEncodedAsSmi(void* ptr) { - const intptr_t address = reinterpret_cast(ptr); + const uintptr_t address = reinterpret_cast(ptr); return ((address & i::kEncodablePointerMask) == 0); } static i::Smi* EncodeAsSmi(void* ptr) { ASSERT(CanBeEncodedAsSmi(ptr)); - const intptr_t address = reinterpret_cast(ptr); + const uintptr_t address = reinterpret_cast(ptr); i::Smi* result = reinterpret_cast(address << i::kPointerToSmiShift); ASSERT(i::Internals::HasSmiTag(result)); ASSERT_EQ(result, i::Smi::FromInt(result->value())); diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc index 6a2f328..fc2c5e5 100644 --- a/test/cctest/test-api.cc +++ b/test/cctest/test-api.cc @@ -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(0x400000000); + TestExternalPointerWrapping(); + expected_ptr = reinterpret_cast(0xdeadbeefdeadbeef); TestExternalPointerWrapping(); -- 2.7.4