| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/objects.h" | 5 #include "src/objects.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <iomanip> | 8 #include <iomanip> |
| 9 #include <sstream> | 9 #include <sstream> |
| 10 | 10 |
| (...skipping 1478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1489 // SameValue(NaN, NaN) is true. | 1489 // SameValue(NaN, NaN) is true. |
| 1490 if (this_value != other_value) { | 1490 if (this_value != other_value) { |
| 1491 return std::isnan(this_value) && std::isnan(other_value); | 1491 return std::isnan(this_value) && std::isnan(other_value); |
| 1492 } | 1492 } |
| 1493 // SameValue(0.0, -0.0) is false. | 1493 // SameValue(0.0, -0.0) is false. |
| 1494 return (std::signbit(this_value) == std::signbit(other_value)); | 1494 return (std::signbit(this_value) == std::signbit(other_value)); |
| 1495 } | 1495 } |
| 1496 if (IsString() && other->IsString()) { | 1496 if (IsString() && other->IsString()) { |
| 1497 return String::cast(this)->Equals(String::cast(other)); | 1497 return String::cast(this)->Equals(String::cast(other)); |
| 1498 } | 1498 } |
| 1499 if (IsSimd128Value() && other->IsSimd128Value()) { | 1499 if (IsFloat32x4() && other->IsFloat32x4()) { |
| 1500 if (IsFloat32x4() && other->IsFloat32x4()) { | 1500 Float32x4* a = Float32x4::cast(this); |
| 1501 Float32x4* a = Float32x4::cast(this); | 1501 Float32x4* b = Float32x4::cast(other); |
| 1502 Float32x4* b = Float32x4::cast(other); | 1502 for (int i = 0; i < 4; i++) { |
| 1503 for (int i = 0; i < 4; i++) { | 1503 float x = a->get_lane(i); |
| 1504 float x = a->get_lane(i); | 1504 float y = b->get_lane(i); |
| 1505 float y = b->get_lane(i); | 1505 // Implements the ES5 SameValue operation for floating point types. |
| 1506 // Implements the ES5 SameValue operation for floating point types. | 1506 // http://www.ecma-international.org/ecma-262/6.0/#sec-samevalue |
| 1507 // http://www.ecma-international.org/ecma-262/6.0/#sec-samevalue | 1507 if (x != y && !(std::isnan(x) && std::isnan(y))) return false; |
| 1508 if (x != y && !(std::isnan(x) && std::isnan(y))) return false; | 1508 if (std::signbit(x) != std::signbit(y)) return false; |
| 1509 if (std::signbit(x) != std::signbit(y)) return false; | |
| 1510 } | |
| 1511 return true; | |
| 1512 } else { | |
| 1513 Simd128Value* a = Simd128Value::cast(this); | |
| 1514 Simd128Value* b = Simd128Value::cast(other); | |
| 1515 return a->map()->instance_type() == b->map()->instance_type() && | |
| 1516 a->BitwiseEquals(b); | |
| 1517 } | 1509 } |
| 1510 return true; |
| 1511 } else if (IsSimd128Value() && other->IsSimd128Value()) { |
| 1512 Simd128Value* a = Simd128Value::cast(this); |
| 1513 Simd128Value* b = Simd128Value::cast(other); |
| 1514 return a->map() == b->map() && a->BitwiseEquals(b); |
| 1518 } | 1515 } |
| 1519 return false; | 1516 return false; |
| 1520 } | 1517 } |
| 1521 | 1518 |
| 1522 | 1519 |
| 1523 bool Object::SameValueZero(Object* other) { | 1520 bool Object::SameValueZero(Object* other) { |
| 1524 if (other == this) return true; | 1521 if (other == this) return true; |
| 1525 | 1522 |
| 1526 // The object is either a number, a name, an odd-ball, | 1523 // The object is either a number, a name, an odd-ball, |
| 1527 // a real JS object, or a Harmony proxy. | 1524 // a real JS object, or a Harmony proxy. |
| 1528 if (IsNumber() && other->IsNumber()) { | 1525 if (IsNumber() && other->IsNumber()) { |
| 1529 double this_value = Number(); | 1526 double this_value = Number(); |
| 1530 double other_value = other->Number(); | 1527 double other_value = other->Number(); |
| 1531 // +0 == -0 is true | 1528 // +0 == -0 is true |
| 1532 return this_value == other_value || | 1529 return this_value == other_value || |
| 1533 (std::isnan(this_value) && std::isnan(other_value)); | 1530 (std::isnan(this_value) && std::isnan(other_value)); |
| 1534 } | 1531 } |
| 1535 if (IsString() && other->IsString()) { | 1532 if (IsString() && other->IsString()) { |
| 1536 return String::cast(this)->Equals(String::cast(other)); | 1533 return String::cast(this)->Equals(String::cast(other)); |
| 1537 } | 1534 } |
| 1538 if (IsSimd128Value() && other->IsSimd128Value()) { | 1535 if (IsFloat32x4() && other->IsFloat32x4()) { |
| 1539 if (IsFloat32x4() && other->IsFloat32x4()) { | 1536 Float32x4* a = Float32x4::cast(this); |
| 1540 Float32x4* a = Float32x4::cast(this); | 1537 Float32x4* b = Float32x4::cast(other); |
| 1541 Float32x4* b = Float32x4::cast(other); | 1538 for (int i = 0; i < 4; i++) { |
| 1542 for (int i = 0; i < 4; i++) { | 1539 float x = a->get_lane(i); |
| 1543 float x = a->get_lane(i); | 1540 float y = b->get_lane(i); |
| 1544 float y = b->get_lane(i); | 1541 // Implements the ES6 SameValueZero operation for floating point types. |
| 1545 // Implements the ES6 SameValueZero operation for floating point types. | 1542 // http://www.ecma-international.org/ecma-262/6.0/#sec-samevaluezero |
| 1546 // http://www.ecma-international.org/ecma-262/6.0/#sec-samevaluezero | 1543 if (x != y && !(std::isnan(x) && std::isnan(y))) return false; |
| 1547 if (x != y && !(std::isnan(x) && std::isnan(y))) return false; | 1544 // SameValueZero doesn't distinguish between 0 and -0. |
| 1548 // SameValueZero doesn't distinguish between 0 and -0. | |
| 1549 } | |
| 1550 return true; | |
| 1551 } else { | |
| 1552 Simd128Value* a = Simd128Value::cast(this); | |
| 1553 Simd128Value* b = Simd128Value::cast(other); | |
| 1554 return a->map()->instance_type() == b->map()->instance_type() && | |
| 1555 a->BitwiseEquals(b); | |
| 1556 } | 1545 } |
| 1546 return true; |
| 1547 } else if (IsSimd128Value() && other->IsSimd128Value()) { |
| 1548 Simd128Value* a = Simd128Value::cast(this); |
| 1549 Simd128Value* b = Simd128Value::cast(other); |
| 1550 return a->map() == b->map() && a->BitwiseEquals(b); |
| 1557 } | 1551 } |
| 1558 return false; | 1552 return false; |
| 1559 } | 1553 } |
| 1560 | 1554 |
| 1561 | 1555 |
| 1562 MaybeHandle<Object> Object::ArraySpeciesConstructor( | 1556 MaybeHandle<Object> Object::ArraySpeciesConstructor( |
| 1563 Isolate* isolate, Handle<Object> original_array) { | 1557 Isolate* isolate, Handle<Object> original_array) { |
| 1564 Handle<Context> native_context = isolate->native_context(); | 1558 Handle<Context> native_context = isolate->native_context(); |
| 1565 if (!FLAG_harmony_species) { | 1559 if (!FLAG_harmony_species) { |
| 1566 return Handle<Object>(native_context->array_function(), isolate); | 1560 return Handle<Object>(native_context->array_function(), isolate); |
| (...skipping 18355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19922 if (cell->value() != *new_value) { | 19916 if (cell->value() != *new_value) { |
| 19923 cell->set_value(*new_value); | 19917 cell->set_value(*new_value); |
| 19924 Isolate* isolate = cell->GetIsolate(); | 19918 Isolate* isolate = cell->GetIsolate(); |
| 19925 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 19919 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 19926 isolate, DependentCode::kPropertyCellChangedGroup); | 19920 isolate, DependentCode::kPropertyCellChangedGroup); |
| 19927 } | 19921 } |
| 19928 } | 19922 } |
| 19929 | 19923 |
| 19930 } // namespace internal | 19924 } // namespace internal |
| 19931 } // namespace v8 | 19925 } // namespace v8 |
| OLD | NEW |