| Index: src/objects-inl.h
|
| diff --git a/src/objects-inl.h b/src/objects-inl.h
|
| index c48876bfb0e0f1e226a03f0c6965a00c72e8c552..40cb1fdeda173008888fa2a09e5bc725ea24f331 100644
|
| --- a/src/objects-inl.h
|
| +++ b/src/objects-inl.h
|
| @@ -1030,10 +1030,7 @@ int Smi::value() {
|
|
|
| Smi* Smi::FromInt(int value) {
|
| ASSERT(Smi::IsValid(value));
|
| - int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
|
| - intptr_t tagged_value =
|
| - (static_cast<intptr_t>(value) << smi_shift_bits) | kSmiTag;
|
| - return reinterpret_cast<Smi*>(tagged_value);
|
| + return reinterpret_cast<Smi*>(Internals::IntToSmi(value));
|
| }
|
|
|
|
|
| @@ -1111,28 +1108,8 @@ Failure* Failure::Construct(Type type, intptr_t value) {
|
|
|
|
|
| bool Smi::IsValid(intptr_t value) {
|
| -#ifdef DEBUG
|
| - bool in_range = (value >= kMinValue) && (value <= kMaxValue);
|
| -#endif
|
| -
|
| -#ifdef V8_TARGET_ARCH_X64
|
| - // To be representable as a long smi, the value must be a 32-bit integer.
|
| - bool result = (value == static_cast<int32_t>(value));
|
| -#else
|
| - // To be representable as an tagged small integer, the two
|
| - // most-significant bits of 'value' must be either 00 or 11 due to
|
| - // sign-extension. To check this we add 01 to the two
|
| - // most-significant bits, and check if the most-significant bit is 0
|
| - //
|
| - // CAUTION: The original code below:
|
| - // bool result = ((value + 0x40000000) & 0x80000000) == 0;
|
| - // may lead to incorrect results according to the C language spec, and
|
| - // in fact doesn't work correctly with gcc4.1.1 in some cases: The
|
| - // compiler may produce undefined results in case of signed integer
|
| - // overflow. The computation must be done w/ unsigned ints.
|
| - bool result = (static_cast<uintptr_t>(value + 0x40000000U) < 0x80000000U);
|
| -#endif
|
| - ASSERT(result == in_range);
|
| + bool result = Internals::IsValidSmi(value);
|
| + ASSERT_EQ(result, value >= kMinValue && value <= kMaxValue);
|
| return result;
|
| }
|
|
|
|
|