Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index 43db240fd9c3d71538411c63fd468d741aaea534..45dc456d5e09d1143bd52dcce130f3e343b3ec6e 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -1323,6 +1323,12 @@ Maybe<bool> JSProxy::HasElementWithHandler(Handle<JSProxy> proxy, |
#define WRITE_INT32_FIELD(p, offset, value) \ |
(*reinterpret_cast<int32_t*>(FIELD_ADDR(p, offset)) = value) |
+#define READ_UINT64_FIELD(p, offset) \ |
+ (*reinterpret_cast<const uint64_t*>(FIELD_ADDR_CONST(p, offset))) |
+ |
+#define WRITE_UINT64_FIELD(p, offset, value) \ |
+ (*reinterpret_cast<uint64_t*>(FIELD_ADDR(p, offset)) = value) |
+ |
#define READ_INT64_FIELD(p, offset) \ |
(*reinterpret_cast<const int64_t*>(FIELD_ADDR_CONST(p, offset))) |
@@ -2288,37 +2294,21 @@ void FixedArray::set(int index, Object* value) { |
} |
-inline bool FixedDoubleArray::is_the_hole_nan(double value) { |
- return bit_cast<uint64_t, double>(value) == kHoleNanInt64; |
-} |
- |
- |
-inline double FixedDoubleArray::hole_nan_as_double() { |
- return bit_cast<double, uint64_t>(kHoleNanInt64); |
-} |
- |
- |
-inline double FixedDoubleArray::canonical_not_the_hole_nan_as_double() { |
- DCHECK(bit_cast<uint64_t>(base::OS::nan_value()) != kHoleNanInt64); |
- DCHECK((bit_cast<uint64_t>(base::OS::nan_value()) >> 32) != kHoleNanUpper32); |
- return base::OS::nan_value(); |
-} |
- |
- |
double FixedDoubleArray::get_scalar(int index) { |
DCHECK(map() != GetHeap()->fixed_cow_array_map() && |
map() != GetHeap()->fixed_array_map()); |
DCHECK(index >= 0 && index < this->length()); |
- double result = READ_DOUBLE_FIELD(this, kHeaderSize + index * kDoubleSize); |
- DCHECK(!is_the_hole_nan(result)); |
- return result; |
+ DCHECK(!is_the_hole(index)); |
+ return READ_DOUBLE_FIELD(this, kHeaderSize + index * kDoubleSize); |
} |
-int64_t FixedDoubleArray::get_representation(int index) { |
+ |
+uint64_t FixedDoubleArray::get_representation(int index) { |
DCHECK(map() != GetHeap()->fixed_cow_array_map() && |
map() != GetHeap()->fixed_array_map()); |
DCHECK(index >= 0 && index < this->length()); |
- return READ_INT64_FIELD(this, kHeaderSize + index * kDoubleSize); |
+ int offset = kHeaderSize + index * kDoubleSize; |
+ return READ_UINT64_FIELD(this, offset); |
} |
@@ -2336,8 +2326,12 @@ void FixedDoubleArray::set(int index, double value) { |
DCHECK(map() != GetHeap()->fixed_cow_array_map() && |
map() != GetHeap()->fixed_array_map()); |
int offset = kHeaderSize + index * kDoubleSize; |
- if (std::isnan(value)) value = canonical_not_the_hole_nan_as_double(); |
- WRITE_DOUBLE_FIELD(this, offset, value); |
+ if (std::isnan(value)) { |
+ WRITE_UINT64_FIELD(this, offset, V8_UINT64_C(0xFFFFFFFFFFFFFFFF)); |
+ } else { |
+ WRITE_DOUBLE_FIELD(this, offset, value); |
+ } |
+ DCHECK(!is_the_hole(index)); |
} |
@@ -2345,13 +2339,12 @@ void FixedDoubleArray::set_the_hole(int index) { |
DCHECK(map() != GetHeap()->fixed_cow_array_map() && |
map() != GetHeap()->fixed_array_map()); |
int offset = kHeaderSize + index * kDoubleSize; |
- WRITE_DOUBLE_FIELD(this, offset, hole_nan_as_double()); |
+ WRITE_UINT64_FIELD(this, offset, kHoleNanInt64); |
} |
bool FixedDoubleArray::is_the_hole(int index) { |
- int offset = kHeaderSize + index * kDoubleSize; |
- return is_the_hole_nan(READ_DOUBLE_FIELD(this, offset)); |
+ return get_representation(index) == kHoleNanInt64; |
} |