Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index f852f4d7c8197df97e26d6f041056c8a5af408e5..5b5d79174bd9ff455726acbda631868de655e6fe 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -1716,7 +1716,22 @@ void HeapObject::IterateBody(InstanceType type, int object_size, |
bool HeapNumber::HeapNumberBooleanValue() { |
- return DoubleToBoolean(value()); |
+ // NaN, +0, and -0 should return the false object |
+#if __BYTE_ORDER == __LITTLE_ENDIAN |
+ union IeeeDoubleLittleEndianArchType u; |
+#elif __BYTE_ORDER == __BIG_ENDIAN |
+ union IeeeDoubleBigEndianArchType u; |
+#endif |
+ u.d = value(); |
+ if (u.bits.exp == 2047) { |
+ // Detect NaN for IEEE double precision floating point. |
+ if ((u.bits.man_low | u.bits.man_high) != 0) return false; |
+ } |
+ if (u.bits.exp == 0) { |
+ // Detect +0, and -0 for IEEE double precision floating point. |
+ if ((u.bits.man_low | u.bits.man_high) == 0) return false; |
+ } |
+ return true; |
} |
@@ -9337,7 +9352,29 @@ bool String::ComputeArrayIndex(uint32_t* index) { |
if (length == 0 || length > kMaxArrayIndexSize) return false; |
ConsStringIteratorOp op; |
StringCharacterStream stream(this, &op); |
- return StringToArrayIndex(&stream, index); |
+ uint16_t ch = stream.GetNext(); |
+ |
+ // If the string begins with a '0' character, it must only consist |
+ // of it to be a legal array index. |
+ if (ch == '0') { |
+ *index = 0; |
+ return length == 1; |
+ } |
+ |
+ // Convert string to uint32 array index; character by character. |
+ int d = ch - '0'; |
+ if (d < 0 || d > 9) return false; |
+ uint32_t result = d; |
+ while (stream.HasMore()) { |
+ d = stream.GetNext() - '0'; |
+ if (d < 0 || d > 9) return false; |
+ // Check that the new result is below the 32 bit limit. |
+ if (result > 429496729U - ((d > 5) ? 1 : 0)) return false; |
+ result = (result * 10) + d; |
+ } |
+ |
+ *index = result; |
+ return true; |
} |