Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1027)

Side by Side Diff: src/objects.cc

Issue 1234073003: V8: Add utility functions to check SameValue and SameValueZero. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Adam's comments. Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/utils.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 <iomanip> 5 #include <iomanip>
6 #include <sstream> 6 #include <sstream>
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after
676 return JSReceiver::GetOrCreateIdentityHash(Handle<JSReceiver>::cast(object)); 676 return JSReceiver::GetOrCreateIdentityHash(Handle<JSReceiver>::cast(object));
677 } 677 }
678 678
679 679
680 bool Object::SameValue(Object* other) { 680 bool Object::SameValue(Object* other) {
681 if (other == this) return true; 681 if (other == this) return true;
682 682
683 // The object is either a number, a name, an odd-ball, 683 // The object is either a number, a name, an odd-ball,
684 // a real JS object, or a Harmony proxy. 684 // a real JS object, or a Harmony proxy.
685 if (IsNumber() && other->IsNumber()) { 685 if (IsNumber() && other->IsNumber()) {
686 double this_value = Number(); 686 return v8::internal::SameValue(Number(), other->Number());
687 double other_value = other->Number();
688 bool equal = this_value == other_value;
689 // SameValue(NaN, NaN) is true.
690 if (!equal) return std::isnan(this_value) && std::isnan(other_value);
691 // SameValue(0.0, -0.0) is false.
692 return (this_value != 0) || ((1 / this_value) == (1 / other_value));
693 } 687 }
694 if (IsString() && other->IsString()) { 688 if (IsString() && other->IsString()) {
695 return String::cast(this)->Equals(String::cast(other)); 689 return String::cast(this)->Equals(String::cast(other));
696 } 690 }
697 return false; 691 return false;
698 } 692 }
699 693
700 694
701 bool Object::SameValueZero(Object* other) { 695 bool Object::SameValueZero(Object* other) {
702 if (other == this) return true; 696 if (other == this) return true;
703 697
704 // The object is either a number, a name, an odd-ball, 698 // The object is either a number, a name, an odd-ball,
705 // a real JS object, or a Harmony proxy. 699 // a real JS object, or a Harmony proxy.
706 if (IsNumber() && other->IsNumber()) { 700 if (IsNumber() && other->IsNumber()) {
707 double this_value = Number(); 701 return v8::internal::SameValueZero(Number(), other->Number());
708 double other_value = other->Number();
709 // +0 == -0 is true
710 return this_value == other_value
711 || (std::isnan(this_value) && std::isnan(other_value));
712 } 702 }
713 if (IsString() && other->IsString()) { 703 if (IsString() && other->IsString()) {
714 return String::cast(this)->Equals(String::cast(other)); 704 return String::cast(this)->Equals(String::cast(other));
715 } 705 }
716 return false; 706 return false;
717 } 707 }
718 708
719 709
720 void Object::ShortPrint(FILE* out) { 710 void Object::ShortPrint(FILE* out) {
721 OFStream os(out); 711 OFStream os(out);
(...skipping 15398 matching lines...) Expand 10 before | Expand all | Expand 10 after
16120 Handle<Object> new_value) { 16110 Handle<Object> new_value) {
16121 if (cell->value() != *new_value) { 16111 if (cell->value() != *new_value) {
16122 cell->set_value(*new_value); 16112 cell->set_value(*new_value);
16123 Isolate* isolate = cell->GetIsolate(); 16113 Isolate* isolate = cell->GetIsolate();
16124 cell->dependent_code()->DeoptimizeDependentCodeGroup( 16114 cell->dependent_code()->DeoptimizeDependentCodeGroup(
16125 isolate, DependentCode::kPropertyCellChangedGroup); 16115 isolate, DependentCode::kPropertyCellChangedGroup);
16126 } 16116 }
16127 } 16117 }
16128 } // namespace internal 16118 } // namespace internal
16129 } // namespace v8 16119 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698