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

Side by Side Diff: src/runtime.js

Issue 1298603002: [runtime] Unify and fix the strict equality comparison. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 4 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
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 // This files contains runtime support implemented in JavaScript. 5 // This files contains runtime support implemented in JavaScript.
6 6
7 // CAUTION: Some of the functions specified in this file are called 7 // CAUTION: Some of the functions specified in this file are called
8 // directly from compiled code. These are the functions with names in 8 // directly from compiled code. These are the functions with names in
9 // ALL CAPS. The compiled code passes the first argument in 'this'. 9 // ALL CAPS. The compiled code passes the first argument in 'this'.
10 10
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 if (IS_NULL_OR_UNDEFINED(y)) return 1; 120 if (IS_NULL_OR_UNDEFINED(y)) return 1;
121 if (IS_NUMBER(y)) return %NumberEquals(%$toNumber(x), y); 121 if (IS_NUMBER(y)) return %NumberEquals(%$toNumber(x), y);
122 if (IS_STRING(y)) return %NumberEquals(%$toNumber(x), %$toNumber(y)); 122 if (IS_STRING(y)) return %NumberEquals(%$toNumber(x), %$toNumber(y));
123 if (IS_SYMBOL(y) || IS_SIMD_VALUE(y)) return 1; // not equal 123 if (IS_SYMBOL(y) || IS_SIMD_VALUE(y)) return 1; // not equal
124 // y is object. 124 // y is object.
125 x = %$toNumber(x); 125 x = %$toNumber(x);
126 y = %$toPrimitive(y, NO_HINT); 126 y = %$toPrimitive(y, NO_HINT);
127 } else if (IS_NULL_OR_UNDEFINED(x)) { 127 } else if (IS_NULL_OR_UNDEFINED(x)) {
128 return IS_NULL_OR_UNDEFINED(y) ? 0 : 1; 128 return IS_NULL_OR_UNDEFINED(y) ? 0 : 1;
129 } else if (IS_SIMD_VALUE(x)) { 129 } else if (IS_SIMD_VALUE(x)) {
130 if (!IS_SIMD_VALUE(y)) return 1; // not equal
130 return %SimdEquals(x, y); 131 return %SimdEquals(x, y);
131 } else { 132 } else {
132 // x is an object. 133 // x is an object.
133 if (IS_SPEC_OBJECT(y)) return %_ObjectEquals(x, y) ? 0 : 1; 134 if (IS_SPEC_OBJECT(y)) return %_ObjectEquals(x, y) ? 0 : 1;
134 if (IS_NULL_OR_UNDEFINED(y)) return 1; // not equal 135 if (IS_NULL_OR_UNDEFINED(y)) return 1; // not equal
135 if (IS_BOOLEAN(y)) { 136 if (IS_BOOLEAN(y)) {
136 y = %$toNumber(y); 137 y = %$toNumber(y);
137 } else if (IS_SYMBOL(y) || IS_SIMD_VALUE(y)) { 138 } else if (IS_SYMBOL(y) || IS_SIMD_VALUE(y)) {
138 return 1; // not equal 139 return 1; // not equal
139 } 140 }
140 x = %$toPrimitive(x, NO_HINT); 141 x = %$toPrimitive(x, NO_HINT);
141 } 142 }
142 } 143 }
143 } 144 }
144 145
145 // ECMA-262, section 11.9.4, page 56.
146 STRICT_EQUALS = function STRICT_EQUALS(x) {
147 if (IS_STRING(this)) {
148 if (!IS_STRING(x)) return 1; // not equal
149 return %StringEquals(this, x);
150 }
151
152 if (IS_NUMBER(this)) {
153 if (!IS_NUMBER(x)) return 1; // not equal
154 return %NumberEquals(this, x);
155 }
156
157 if (IS_SIMD_VALUE(this)) return %SimdEquals(this, x);
158
159 // If anything else gets here, we just do simple identity check.
160 // Objects (including functions), null, undefined and booleans were
161 // checked in the CompareStub, so there should be nothing left.
162 return %_ObjectEquals(this, x) ? 0 : 1;
163 }
164
165 146
166 // ECMA-262, section 11.8.5, page 53. The 'ncr' parameter is used as 147 // ECMA-262, section 11.8.5, page 53. The 'ncr' parameter is used as
167 // the result when either (or both) the operands are NaN. 148 // the result when either (or both) the operands are NaN.
168 COMPARE = function COMPARE(x, ncr) { 149 COMPARE = function COMPARE(x, ncr) {
169 var left; 150 var left;
170 var right; 151 var right;
171 // Fast cases for string, numbers and undefined compares. 152 // Fast cases for string, numbers and undefined compares.
172 if (IS_STRING(this)) { 153 if (IS_STRING(this)) {
173 if (IS_STRING(x)) return %_StringCompare(this, x); 154 if (IS_STRING(x)) return %_StringCompare(this, x);
174 if (IS_UNDEFINED(x)) return ncr; 155 if (IS_UNDEFINED(x)) return ncr;
(...skipping 753 matching lines...) Expand 10 before | Expand all | Expand 10 after
928 $toBoolean = ToBoolean; 909 $toBoolean = ToBoolean;
929 $toInteger = ToInteger; 910 $toInteger = ToInteger;
930 $toLength = ToLength; 911 $toLength = ToLength;
931 $toName = ToName; 912 $toName = ToName;
932 $toNumber = ToNumber; 913 $toNumber = ToNumber;
933 $toPositiveInteger = ToPositiveInteger; 914 $toPositiveInteger = ToPositiveInteger;
934 $toPrimitive = ToPrimitive; 915 $toPrimitive = ToPrimitive;
935 $toString = ToString; 916 $toString = ToString;
936 917
937 }) 918 })
OLDNEW
« src/api.cc ('K') | « src/ppc/code-stubs-ppc.cc ('k') | src/runtime/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698