| Index: src/objects-inl.h
|
| diff --git a/src/objects-inl.h b/src/objects-inl.h
|
| index 662ad923baab283f55579ebe5c80f502bfda986e..cb7b7c881d0c5853138e2e48ad5abe0886816de2 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<int>(value() >> kShiftBits);
|
| }
|
|
|
|
|
| @@ -804,29 +804,31 @@ Failure* Failure::OutOfMemoryException() {
|
| }
|
|
|
|
|
| -int Failure::value() const {
|
| - return static_cast<int>(reinterpret_cast<intptr_t>(this) >> kFailureTagSize);
|
| +intptr_t Failure::value() const {
|
| + return reinterpret_cast<intptr_t>(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<intptr_t>(
|
| + (~static_cast<uintptr_t>(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<intptr_t>(value) << kFailureTypeTagSize) | type;
|
| ASSERT(((info << kFailureTagSize) >> kFailureTagSize) == info);
|
| - return reinterpret_cast<Failure*>(
|
| - (static_cast<intptr_t>(info) << kFailureTagSize) | kFailureTag);
|
| + return reinterpret_cast<Failure*>((info << kFailureTagSize) | kFailureTag);
|
| }
|
|
|
|
|
|
|