| OLD | NEW |
| 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 24 matching lines...) Expand all Loading... |
| 35 var isConcatSpreadableSymbol = | 35 var isConcatSpreadableSymbol = |
| 36 utils.ImportNow("is_concat_spreadable_symbol"); | 36 utils.ImportNow("is_concat_spreadable_symbol"); |
| 37 | 37 |
| 38 // ---------------------------------------------------------------------------- | 38 // ---------------------------------------------------------------------------- |
| 39 | 39 |
| 40 /* ----------------------------------- | 40 /* ----------------------------------- |
| 41 - - - C o m p a r i s o n - - - | 41 - - - C o m p a r i s o n - - - |
| 42 ----------------------------------- | 42 ----------------------------------- |
| 43 */ | 43 */ |
| 44 | 44 |
| 45 // ECMA-262 Section 11.9.3. | |
| 46 function EQUALS(y) { | |
| 47 if (IS_STRING(this) && IS_STRING(y)) return %StringEquals(this, y); | |
| 48 var x = this; | |
| 49 | |
| 50 while (true) { | |
| 51 if (IS_NUMBER(x)) { | |
| 52 while (true) { | |
| 53 if (IS_NUMBER(y)) return %NumberEquals(x, y); | |
| 54 if (IS_NULL_OR_UNDEFINED(y)) return 1; // not equal | |
| 55 if (!IS_SPEC_OBJECT(y)) { | |
| 56 if (IS_SYMBOL(y) || IS_SIMD_VALUE(y)) return 1; // not equal | |
| 57 // String or boolean. | |
| 58 return %NumberEquals(x, %to_number_fun(y)); | |
| 59 } | |
| 60 y = %to_primitive(y, NO_HINT); | |
| 61 } | |
| 62 } else if (IS_STRING(x)) { | |
| 63 while (true) { | |
| 64 if (IS_STRING(y)) return %StringEquals(x, y); | |
| 65 if (IS_NUMBER(y)) return %NumberEquals(%to_number_fun(x), y); | |
| 66 if (IS_BOOLEAN(y)) { | |
| 67 return %NumberEquals(%to_number_fun(x), %to_number_fun(y)); | |
| 68 } | |
| 69 if (IS_NULL_OR_UNDEFINED(y)) return 1; // not equal | |
| 70 if (IS_SYMBOL(y) || IS_SIMD_VALUE(y)) return 1; // not equal | |
| 71 y = %to_primitive(y, NO_HINT); | |
| 72 } | |
| 73 } else if (IS_SYMBOL(x)) { | |
| 74 if (IS_SYMBOL(y)) return %_ObjectEquals(x, y) ? 0 : 1; | |
| 75 return 1; // not equal | |
| 76 } else if (IS_BOOLEAN(x)) { | |
| 77 if (IS_BOOLEAN(y)) return %_ObjectEquals(x, y) ? 0 : 1; | |
| 78 if (IS_NULL_OR_UNDEFINED(y)) return 1; | |
| 79 if (IS_NUMBER(y)) return %NumberEquals(%to_number_fun(x), y); | |
| 80 if (IS_STRING(y)) { | |
| 81 return %NumberEquals(%to_number_fun(x), %to_number_fun(y)); | |
| 82 } | |
| 83 if (IS_SYMBOL(y) || IS_SIMD_VALUE(y)) return 1; // not equal | |
| 84 // y is object. | |
| 85 x = %to_number_fun(x); | |
| 86 y = %to_primitive(y, NO_HINT); | |
| 87 } else if (IS_NULL_OR_UNDEFINED(x)) { | |
| 88 return IS_NULL_OR_UNDEFINED(y) ? 0 : 1; | |
| 89 } else if (IS_SIMD_VALUE(x)) { | |
| 90 if (!IS_SIMD_VALUE(y)) return 1; // not equal | |
| 91 return %SimdEquals(x, y); | |
| 92 } else { | |
| 93 // x is an object. | |
| 94 if (IS_SPEC_OBJECT(y)) return %_ObjectEquals(x, y) ? 0 : 1; | |
| 95 if (IS_NULL_OR_UNDEFINED(y)) return 1; // not equal | |
| 96 if (IS_BOOLEAN(y)) { | |
| 97 y = %to_number_fun(y); | |
| 98 } else if (IS_SYMBOL(y) || IS_SIMD_VALUE(y)) { | |
| 99 return 1; // not equal | |
| 100 } | |
| 101 x = %to_primitive(x, NO_HINT); | |
| 102 } | |
| 103 } | |
| 104 } | |
| 105 | |
| 106 | |
| 107 // ECMA-262, section 11.8.5, page 53. The 'ncr' parameter is used as | 45 // ECMA-262, section 11.8.5, page 53. The 'ncr' parameter is used as |
| 108 // the result when either (or both) the operands are NaN. | 46 // the result when either (or both) the operands are NaN. |
| 109 function COMPARE(x, ncr) { | 47 function COMPARE(x, ncr) { |
| 110 var left; | 48 var left; |
| 111 var right; | 49 var right; |
| 112 // Fast cases for string, numbers and undefined compares. | 50 // Fast cases for string, numbers and undefined compares. |
| 113 if (IS_STRING(this)) { | 51 if (IS_STRING(this)) { |
| 114 if (IS_STRING(x)) return %_StringCompare(this, x); | 52 if (IS_STRING(x)) return %_StringCompare(this, x); |
| 115 if (IS_UNDEFINED(x)) return ncr; | 53 if (IS_UNDEFINED(x)) return ncr; |
| 116 left = this; | 54 left = this; |
| (...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 $toNumber = ToNumber; | 429 $toNumber = ToNumber; |
| 492 $toPositiveInteger = ToPositiveInteger; | 430 $toPositiveInteger = ToPositiveInteger; |
| 493 $toPrimitive = ToPrimitive; | 431 $toPrimitive = ToPrimitive; |
| 494 $toString = ToString; | 432 $toString = ToString; |
| 495 | 433 |
| 496 %InstallToContext([ | 434 %InstallToContext([ |
| 497 "apply_prepare_builtin", APPLY_PREPARE, | 435 "apply_prepare_builtin", APPLY_PREPARE, |
| 498 "compare_builtin", COMPARE, | 436 "compare_builtin", COMPARE, |
| 499 "compare_strong_builtin", COMPARE_STRONG, | 437 "compare_strong_builtin", COMPARE_STRONG, |
| 500 "concat_iterable_to_array_builtin", CONCAT_ITERABLE_TO_ARRAY, | 438 "concat_iterable_to_array_builtin", CONCAT_ITERABLE_TO_ARRAY, |
| 501 "equals_builtin", EQUALS, | |
| 502 "reflect_apply_prepare_builtin", REFLECT_APPLY_PREPARE, | 439 "reflect_apply_prepare_builtin", REFLECT_APPLY_PREPARE, |
| 503 "reflect_construct_prepare_builtin", REFLECT_CONSTRUCT_PREPARE, | 440 "reflect_construct_prepare_builtin", REFLECT_CONSTRUCT_PREPARE, |
| 504 ]); | 441 ]); |
| 505 | 442 |
| 506 %InstallToContext([ | 443 %InstallToContext([ |
| 507 "concat_iterable_to_array", ConcatIterableToArray, | 444 "concat_iterable_to_array", ConcatIterableToArray, |
| 508 "non_number_to_number", NonNumberToNumber, | 445 "non_number_to_number", NonNumberToNumber, |
| 509 "non_string_to_string", NonStringToString, | 446 "non_string_to_string", NonStringToString, |
| 510 "to_integer_fun", ToInteger, | 447 "to_integer_fun", ToInteger, |
| 511 "to_length_fun", ToLength, | 448 "to_length_fun", ToLength, |
| 512 "to_number_fun", ToNumber, | 449 "to_number_fun", ToNumber, |
| 513 "to_primitive", ToPrimitive, | 450 "to_primitive", ToPrimitive, |
| 514 "to_string_fun", ToString, | 451 "to_string_fun", ToString, |
| 515 ]); | 452 ]); |
| 516 | 453 |
| 517 utils.Export(function(to) { | 454 utils.Export(function(to) { |
| 518 to.ToBoolean = ToBoolean; | 455 to.ToBoolean = ToBoolean; |
| 519 to.ToLength = ToLength; | 456 to.ToLength = ToLength; |
| 520 to.ToNumber = ToNumber; | 457 to.ToNumber = ToNumber; |
| 521 to.ToPrimitive = ToPrimitive; | 458 to.ToPrimitive = ToPrimitive; |
| 522 to.ToString = ToString; | 459 to.ToString = ToString; |
| 523 }); | 460 }); |
| 524 | 461 |
| 525 }) | 462 }) |
| OLD | NEW |