| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 (function(global, utils) { | 5 (function(global, utils) { |
| 6 | 6 |
| 7 %CheckIsBootstrapping(); | 7 %CheckIsBootstrapping(); |
| 8 | 8 |
| 9 // ---------------------------------------------------------------------------- | 9 // ---------------------------------------------------------------------------- |
| 10 // Imports | 10 // Imports |
| 11 | 11 |
| 12 var FLAG_harmony_tostring; | 12 var FLAG_harmony_tostring; |
| 13 var GlobalArray = global.Array; | 13 var GlobalArray = global.Array; |
| 14 var GlobalBoolean = global.Boolean; | 14 var GlobalBoolean = global.Boolean; |
| 15 var GlobalFunction = global.Function; | 15 var GlobalFunction = global.Function; |
| 16 var GlobalNumber = global.Number; | 16 var GlobalNumber = global.Number; |
| 17 var GlobalObject = global.Object; | 17 var GlobalObject = global.Object; |
| 18 var InternalArray = utils.InternalArray; | 18 var InternalArray = utils.InternalArray; |
| 19 var iteratorSymbol = utils.ImportNow("iterator_symbol"); | 19 var iteratorSymbol = utils.ImportNow("iterator_symbol"); |
| 20 var MathAbs; | 20 var MathAbs; |
| 21 var ProxyDelegateCallAndConstruct; | 21 var ProxyDelegateCallAndConstruct; |
| 22 var ProxyDerivedHasOwnTrap; | 22 var ProxyDerivedHasOwnTrap; |
| 23 var ProxyDerivedKeysTrap; | 23 var ProxyDerivedKeysTrap; |
| 24 var StringIndexOf; | 24 var StringIndexOf; |
| 25 var ToBoolean = utils.ImportNow("ToBoolean"); | 25 var ToBoolean = utils.ImportNow("ToBoolean"); |
| 26 var ToNumber = utils.ImportNow("ToNumber"); | 26 var ToNumber = utils.ImportNow("ToNumber"); |
| 27 var ToString; | |
| 28 var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); | 27 var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); |
| 29 | 28 |
| 30 utils.Import(function(from) { | 29 utils.Import(function(from) { |
| 31 MathAbs = from.MathAbs; | 30 MathAbs = from.MathAbs; |
| 32 StringIndexOf = from.StringIndexOf; | 31 StringIndexOf = from.StringIndexOf; |
| 33 ToString = from.ToString; | |
| 34 }); | 32 }); |
| 35 | 33 |
| 36 utils.ImportFromExperimental(function(from) { | 34 utils.ImportFromExperimental(function(from) { |
| 37 FLAG_harmony_tostring = from.FLAG_harmony_tostring; | 35 FLAG_harmony_tostring = from.FLAG_harmony_tostring; |
| 38 ProxyDelegateCallAndConstruct = from.ProxyDelegateCallAndConstruct; | 36 ProxyDelegateCallAndConstruct = from.ProxyDelegateCallAndConstruct; |
| 39 ProxyDerivedHasOwnTrap = from.ProxyDerivedHasOwnTrap; | 37 ProxyDerivedHasOwnTrap = from.ProxyDerivedHasOwnTrap; |
| 40 ProxyDerivedKeysTrap = from.ProxyDerivedKeysTrap; | 38 ProxyDerivedKeysTrap = from.ProxyDerivedKeysTrap; |
| 41 }); | 39 }); |
| 42 | 40 |
| 43 // ---------------------------------------------------------------------------- | 41 // ---------------------------------------------------------------------------- |
| (...skipping 21 matching lines...) Expand all Loading... |
| 65 // vs 800ns). The following optimization makes parseInt on a | 63 // vs 800ns). The following optimization makes parseInt on a |
| 66 // non-Smi number 9 times faster (230ns vs 2070ns). Together | 64 // non-Smi number 9 times faster (230ns vs 2070ns). Together |
| 67 // they make parseInt on a string 1.4% slower (274ns vs 270ns). | 65 // they make parseInt on a string 1.4% slower (274ns vs 270ns). |
| 68 if (%_IsSmi(string)) return string; | 66 if (%_IsSmi(string)) return string; |
| 69 if (IS_NUMBER(string) && | 67 if (IS_NUMBER(string) && |
| 70 ((0.01 < string && string < 1e9) || | 68 ((0.01 < string && string < 1e9) || |
| 71 (-1e9 < string && string < -0.01))) { | 69 (-1e9 < string && string < -0.01))) { |
| 72 // Truncate number. | 70 // Truncate number. |
| 73 return string | 0; | 71 return string | 0; |
| 74 } | 72 } |
| 75 string = TO_STRING_INLINE(string); | 73 string = TO_STRING(string); |
| 76 radix = radix | 0; | 74 radix = radix | 0; |
| 77 } else { | 75 } else { |
| 78 // The spec says ToString should be evaluated before ToInt32. | 76 // The spec says ToString should be evaluated before ToInt32. |
| 79 string = TO_STRING_INLINE(string); | 77 string = TO_STRING(string); |
| 80 radix = TO_INT32(radix); | 78 radix = TO_INT32(radix); |
| 81 if (!(radix == 0 || (2 <= radix && radix <= 36))) { | 79 if (!(radix == 0 || (2 <= radix && radix <= 36))) { |
| 82 return NAN; | 80 return NAN; |
| 83 } | 81 } |
| 84 } | 82 } |
| 85 | 83 |
| 86 if (%_HasCachedArrayIndex(string) && | 84 if (%_HasCachedArrayIndex(string) && |
| 87 (radix == 0 || radix == 10)) { | 85 (radix == 0 || radix == 10)) { |
| 88 return %_GetCachedArrayIndex(string); | 86 return %_GetCachedArrayIndex(string); |
| 89 } | 87 } |
| 90 return %StringParseInt(string, radix); | 88 return %StringParseInt(string, radix); |
| 91 } | 89 } |
| 92 | 90 |
| 93 | 91 |
| 94 // ECMA-262 - 15.1.2.3 | 92 // ECMA-262 - 15.1.2.3 |
| 95 function GlobalParseFloat(string) { | 93 function GlobalParseFloat(string) { |
| 96 string = TO_STRING_INLINE(string); | 94 string = TO_STRING(string); |
| 97 if (%_HasCachedArrayIndex(string)) return %_GetCachedArrayIndex(string); | 95 if (%_HasCachedArrayIndex(string)) return %_GetCachedArrayIndex(string); |
| 98 return %StringParseFloat(string); | 96 return %StringParseFloat(string); |
| 99 } | 97 } |
| 100 | 98 |
| 101 | 99 |
| 102 function GlobalEval(x) { | 100 function GlobalEval(x) { |
| 103 if (!IS_STRING(x)) return x; | 101 if (!IS_STRING(x)) return x; |
| 104 | 102 |
| 105 var global_proxy = %GlobalProxy(GlobalEval); | 103 var global_proxy = %GlobalProxy(GlobalEval); |
| 106 | 104 |
| (...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 return true; | 797 return true; |
| 800 } | 798 } |
| 801 | 799 |
| 802 | 800 |
| 803 // ES5 section 15.4.5.1. | 801 // ES5 section 15.4.5.1. |
| 804 function DefineArrayProperty(obj, p, desc, should_throw) { | 802 function DefineArrayProperty(obj, p, desc, should_throw) { |
| 805 // Step 3 - Special handling for array index. | 803 // Step 3 - Special handling for array index. |
| 806 if (!IS_SYMBOL(p)) { | 804 if (!IS_SYMBOL(p)) { |
| 807 var index = TO_UINT32(p); | 805 var index = TO_UINT32(p); |
| 808 var emit_splice = false; | 806 var emit_splice = false; |
| 809 if (ToString(index) == p && index != 4294967295) { | 807 if (TO_STRING(index) == p && index != 4294967295) { |
| 810 var length = obj.length; | 808 var length = obj.length; |
| 811 if (index >= length && %IsObserved(obj)) { | 809 if (index >= length && %IsObserved(obj)) { |
| 812 emit_splice = true; | 810 emit_splice = true; |
| 813 $observeBeginPerformSplice(obj); | 811 $observeBeginPerformSplice(obj); |
| 814 } | 812 } |
| 815 | 813 |
| 816 var length_desc = GetOwnPropertyJS(obj, "length"); | 814 var length_desc = GetOwnPropertyJS(obj, "length"); |
| 817 if ((index >= length && !length_desc.isWritable()) || | 815 if ((index >= length && !length_desc.isWritable()) || |
| 818 !DefineObjectProperty(obj, p, desc, true)) { | 816 !DefineObjectProperty(obj, p, desc, true)) { |
| 819 if (emit_splice) | 817 if (emit_splice) |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 967 var seenKeys = { __proto__: null }; | 965 var seenKeys = { __proto__: null }; |
| 968 var j = 0; | 966 var j = 0; |
| 969 for (var i = 0; i < propertyNames.length; ++i) { | 967 for (var i = 0; i < propertyNames.length; ++i) { |
| 970 var name = propertyNames[i]; | 968 var name = propertyNames[i]; |
| 971 if (IS_SYMBOL(name)) { | 969 if (IS_SYMBOL(name)) { |
| 972 if ((filter & PROPERTY_ATTRIBUTES_SYMBOLIC) || IS_PRIVATE(name)) { | 970 if ((filter & PROPERTY_ATTRIBUTES_SYMBOLIC) || IS_PRIVATE(name)) { |
| 973 continue; | 971 continue; |
| 974 } | 972 } |
| 975 } else { | 973 } else { |
| 976 if (filter & PROPERTY_ATTRIBUTES_STRING) continue; | 974 if (filter & PROPERTY_ATTRIBUTES_STRING) continue; |
| 977 name = ToString(name); | 975 name = TO_STRING(name); |
| 978 } | 976 } |
| 979 if (seenKeys[name]) continue; | 977 if (seenKeys[name]) continue; |
| 980 seenKeys[name] = true; | 978 seenKeys[name] = true; |
| 981 propertyNames[j++] = name; | 979 propertyNames[j++] = name; |
| 982 } | 980 } |
| 983 propertyNames.length = j; | 981 propertyNames.length = j; |
| 984 } | 982 } |
| 985 | 983 |
| 986 return propertyNames; | 984 return propertyNames; |
| 987 } | 985 } |
| (...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1531 function NumberToPrecisionJS(precision) { | 1529 function NumberToPrecisionJS(precision) { |
| 1532 var x = this; | 1530 var x = this; |
| 1533 if (!IS_NUMBER(this)) { | 1531 if (!IS_NUMBER(this)) { |
| 1534 if (!IS_NUMBER_WRAPPER(this)) { | 1532 if (!IS_NUMBER_WRAPPER(this)) { |
| 1535 throw MakeTypeError(kIncompatibleMethodReceiver, | 1533 throw MakeTypeError(kIncompatibleMethodReceiver, |
| 1536 "Number.prototype.toPrecision", this); | 1534 "Number.prototype.toPrecision", this); |
| 1537 } | 1535 } |
| 1538 // Get the value of this number in case it's an object. | 1536 // Get the value of this number in case it's an object. |
| 1539 x = %_ValueOf(this); | 1537 x = %_ValueOf(this); |
| 1540 } | 1538 } |
| 1541 if (IS_UNDEFINED(precision)) return ToString(%_ValueOf(this)); | 1539 if (IS_UNDEFINED(precision)) return TO_STRING(x); |
| 1542 var p = TO_INTEGER(precision); | 1540 var p = TO_INTEGER(precision); |
| 1543 | 1541 |
| 1544 if (NUMBER_IS_NAN(x)) return "NaN"; | 1542 if (NUMBER_IS_NAN(x)) return "NaN"; |
| 1545 if (x == INFINITY) return "Infinity"; | 1543 if (x == INFINITY) return "Infinity"; |
| 1546 if (x == -INFINITY) return "-Infinity"; | 1544 if (x == -INFINITY) return "-Infinity"; |
| 1547 | 1545 |
| 1548 if (p < 1 || p > 21) { | 1546 if (p < 1 || p > 21) { |
| 1549 throw MakeRangeError(kToPrecisionFormatRange); | 1547 throw MakeRangeError(kToPrecisionFormatRange); |
| 1550 } | 1548 } |
| 1551 return %NumberToPrecision(x, p); | 1549 return %NumberToPrecision(x, p); |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1751 // To be consistent with our normal functions we leave this as it is. | 1749 // To be consistent with our normal functions we leave this as it is. |
| 1752 // TODO(lrn): Do set these to be thrower. | 1750 // TODO(lrn): Do set these to be thrower. |
| 1753 return result; | 1751 return result; |
| 1754 } | 1752 } |
| 1755 | 1753 |
| 1756 | 1754 |
| 1757 function NewFunctionString(args, function_token) { | 1755 function NewFunctionString(args, function_token) { |
| 1758 var n = args.length; | 1756 var n = args.length; |
| 1759 var p = ''; | 1757 var p = ''; |
| 1760 if (n > 1) { | 1758 if (n > 1) { |
| 1761 p = ToString(args[0]); | 1759 p = TO_STRING(args[0]); |
| 1762 for (var i = 1; i < n - 1; i++) { | 1760 for (var i = 1; i < n - 1; i++) { |
| 1763 p += ',' + ToString(args[i]); | 1761 p += ',' + TO_STRING(args[i]); |
| 1764 } | 1762 } |
| 1765 // If the formal parameters string include ) - an illegal | 1763 // If the formal parameters string include ) - an illegal |
| 1766 // character - it may make the combined function expression | 1764 // character - it may make the combined function expression |
| 1767 // compile. We avoid this problem by checking for this early on. | 1765 // compile. We avoid this problem by checking for this early on. |
| 1768 if (%_CallFunction(p, ')', StringIndexOf) != -1) { | 1766 if (%_CallFunction(p, ')', StringIndexOf) != -1) { |
| 1769 throw MakeSyntaxError(kParenthesisInArgString); | 1767 throw MakeSyntaxError(kParenthesisInArgString); |
| 1770 } | 1768 } |
| 1771 // If the formal parameters include an unbalanced block comment, the | 1769 // If the formal parameters include an unbalanced block comment, the |
| 1772 // function must be rejected. Since JavaScript does not allow nested | 1770 // function must be rejected. Since JavaScript does not allow nested |
| 1773 // comments we can include a trailing block comment to catch this. | 1771 // comments we can include a trailing block comment to catch this. |
| 1774 p += '\n/' + '**/'; | 1772 p += '\n/' + '**/'; |
| 1775 } | 1773 } |
| 1776 var body = (n > 0) ? ToString(args[n - 1]) : ''; | 1774 var body = (n > 0) ? TO_STRING(args[n - 1]) : ''; |
| 1777 return '(' + function_token + '(' + p + ') {\n' + body + '\n})'; | 1775 return '(' + function_token + '(' + p + ') {\n' + body + '\n})'; |
| 1778 } | 1776 } |
| 1779 | 1777 |
| 1780 | 1778 |
| 1781 function FunctionConstructor(arg1) { // length == 1 | 1779 function FunctionConstructor(arg1) { // length == 1 |
| 1782 var source = NewFunctionString(arguments, 'function'); | 1780 var source = NewFunctionString(arguments, 'function'); |
| 1783 var global_proxy = %GlobalProxy(FunctionConstructor); | 1781 var global_proxy = %GlobalProxy(FunctionConstructor); |
| 1784 // Compile the string in the constructor and not a helper so that errors | 1782 // Compile the string in the constructor and not a helper so that errors |
| 1785 // appear to come from here. | 1783 // appear to come from here. |
| 1786 var f = %_CallFunction(global_proxy, %CompileString(source, true)); | 1784 var f = %_CallFunction(global_proxy, %CompileString(source, true)); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1845 %InstallToContext([ | 1843 %InstallToContext([ |
| 1846 "global_eval_fun", GlobalEval, | 1844 "global_eval_fun", GlobalEval, |
| 1847 "object_value_of", ObjectValueOf, | 1845 "object_value_of", ObjectValueOf, |
| 1848 "object_to_string", ObjectToString, | 1846 "object_to_string", ObjectToString, |
| 1849 "object_define_own_property", DefineOwnPropertyFromAPI, | 1847 "object_define_own_property", DefineOwnPropertyFromAPI, |
| 1850 "object_get_own_property_descriptor", ObjectGetOwnPropertyDescriptor, | 1848 "object_get_own_property_descriptor", ObjectGetOwnPropertyDescriptor, |
| 1851 "to_complete_property_descriptor", ToCompletePropertyDescriptor, | 1849 "to_complete_property_descriptor", ToCompletePropertyDescriptor, |
| 1852 ]); | 1850 ]); |
| 1853 | 1851 |
| 1854 }) | 1852 }) |
| OLD | NEW |