diff --git a/src/objects-inl.h b/src/objects-inl.h index 662ad923ba..cb7b7c881d 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -778,7 +778,7 @@ int Failure::requested() const { kFailureTypeTagSize + kSpaceTagSize - kObjectAlignmentBits; STATIC_ASSERT(kShiftBits >= 0); ASSERT(type() == RETRY_AFTER_GC); - return value() >> kShiftBits; + return static_cast(value() >> kShiftBits); } @@ -804,29 +804,31 @@ Failure* Failure::OutOfMemoryException() { } -int Failure::value() const { - return static_cast(reinterpret_cast(this) >> kFailureTagSize); +intptr_t Failure::value() const { + return reinterpret_cast(this) >> kFailureTagSize; } Failure* Failure::RetryAfterGC(int requested_bytes) { // Assert that the space encoding fits in the three bytes allotted for it. ASSERT((LAST_SPACE & ~kSpaceTagMask) == 0); - int requested = requested_bytes >> kObjectAlignmentBits; + intptr_t requested = requested_bytes >> kObjectAlignmentBits; + int tag_bits = kSpaceTagSize + kFailureTypeTagSize; + if (((requested << tag_bits) >> tag_bits) != requested) { + // No room for entire requested size in the bits. Round down to + // maximally representable size. + requested = static_cast( + (~static_cast(0)) >> (tag_bits + 1)); + } int value = (requested << kSpaceTagSize) | NEW_SPACE; - ASSERT(value >> kSpaceTagSize == requested); - ASSERT(Smi::IsValid(value)); - ASSERT(value == ((value << kFailureTypeTagSize) >> kFailureTypeTagSize)); - ASSERT(Smi::IsValid(value << kFailureTypeTagSize)); return Construct(RETRY_AFTER_GC, value); } -Failure* Failure::Construct(Type type, int value) { - int info = (value << kFailureTypeTagSize) | type; +Failure* Failure::Construct(Type type, intptr_t value) { + intptr_t info = (static_cast(value) << kFailureTypeTagSize) | type; ASSERT(((info << kFailureTagSize) >> kFailureTagSize) == info); - return reinterpret_cast( - (static_cast(info) << kFailureTagSize) | kFailureTag); + return reinterpret_cast((info << kFailureTagSize) | kFailureTag); } diff --git a/src/objects.cc b/src/objects.cc index 26bf35b0f2..30a384da32 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -618,12 +618,12 @@ void Smi::SmiPrint(StringStream* accumulator) { void Failure::FailurePrint(StringStream* accumulator) { - accumulator->Add("Failure(%d)", value()); + accumulator->Add("Failure(%p)", reinterpret_cast(value())); } void Failure::FailurePrint() { - PrintF("Failure(%d)", value()); + PrintF("Failure(%p)", reinterpret_cast(value())); } diff --git a/src/objects.h b/src/objects.h index fe8363a876..deb0971b7c 100644 --- a/src/objects.h +++ b/src/objects.h @@ -948,10 +948,10 @@ class Smi: public Object { // // Failures are a single word, encoded as follows: // +-------------------------+---+--+--+ -// |rrrrrrrrrrrrrrrrrrrrrrrrr|sss|tt|11| +// |...rrrrrrrrrrrrrrrrrrrrrr|sss|tt|11| // +-------------------------+---+--+--+ -// 3 7 6 4 32 10 -// 1 +// 7 6 4 32 10 +// // // The low two bits, 0-1, are the failure tag, 11. The next two bits, // 2-3, are a failure type tag 'tt' with possible values: @@ -1013,8 +1013,8 @@ class Failure: public Object { #endif private: - inline int value() const; - static inline Failure* Construct(Type type, int value = 0); + inline intptr_t value() const; + static inline Failure* Construct(Type type, intptr_t value = 0); DISALLOW_IMPLICIT_CONSTRUCTORS(Failure); };