| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 (-1e9 < string && string < -0.01))) { | 120 (-1e9 < string && string < -0.01))) { |
| 121 // Truncate number. | 121 // Truncate number. |
| 122 return string | 0; | 122 return string | 0; |
| 123 } | 123 } |
| 124 string = TO_STRING_INLINE(string); | 124 string = TO_STRING_INLINE(string); |
| 125 radix = radix | 0; | 125 radix = radix | 0; |
| 126 } else { | 126 } else { |
| 127 // The spec says ToString should be evaluated before ToInt32. | 127 // The spec says ToString should be evaluated before ToInt32. |
| 128 string = TO_STRING_INLINE(string); | 128 string = TO_STRING_INLINE(string); |
| 129 radix = TO_INT32(radix); | 129 radix = TO_INT32(radix); |
| 130 if (!(radix == 0 || (2 <= radix && radix <= 36))) | 130 if (!(radix == 0 || (2 <= radix && radix <= 36))) { |
| 131 return $NaN; | 131 return $NaN; |
| 132 } |
| 132 } | 133 } |
| 133 | 134 |
| 134 if (%_HasCachedArrayIndex(string) && | 135 if (%_HasCachedArrayIndex(string) && |
| 135 (radix == 0 || radix == 10)) { | 136 (radix == 0 || radix == 10)) { |
| 136 return %_GetCachedArrayIndex(string); | 137 return %_GetCachedArrayIndex(string); |
| 137 } | 138 } |
| 138 return %StringParseInt(string, radix); | 139 return %StringParseInt(string, radix); |
| 139 } | 140 } |
| 140 | 141 |
| 141 | 142 |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 } | 277 } |
| 277 | 278 |
| 278 | 279 |
| 279 // Extensions for providing property getters and setters. | 280 // Extensions for providing property getters and setters. |
| 280 function ObjectDefineGetter(name, fun) { | 281 function ObjectDefineGetter(name, fun) { |
| 281 var receiver = this; | 282 var receiver = this; |
| 282 if (receiver == null && !IS_UNDETECTABLE(receiver)) { | 283 if (receiver == null && !IS_UNDETECTABLE(receiver)) { |
| 283 receiver = %GlobalReceiver(global); | 284 receiver = %GlobalReceiver(global); |
| 284 } | 285 } |
| 285 if (!IS_SPEC_FUNCTION(fun)) { | 286 if (!IS_SPEC_FUNCTION(fun)) { |
| 286 throw new $TypeError('Object.prototype.__defineGetter__: Expecting function'
); | 287 throw new $TypeError( |
| 288 'Object.prototype.__defineGetter__: Expecting function'); |
| 287 } | 289 } |
| 288 var desc = new PropertyDescriptor(); | 290 var desc = new PropertyDescriptor(); |
| 289 desc.setGet(fun); | 291 desc.setGet(fun); |
| 290 desc.setEnumerable(true); | 292 desc.setEnumerable(true); |
| 291 desc.setConfigurable(true); | 293 desc.setConfigurable(true); |
| 292 DefineOwnProperty(ToObject(receiver), ToString(name), desc, false); | 294 DefineOwnProperty(ToObject(receiver), ToString(name), desc, false); |
| 293 } | 295 } |
| 294 | 296 |
| 295 | 297 |
| 296 function ObjectLookupGetter(name) { | 298 function ObjectLookupGetter(name) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 322 function ObjectLookupSetter(name) { | 324 function ObjectLookupSetter(name) { |
| 323 var receiver = this; | 325 var receiver = this; |
| 324 if (receiver == null && !IS_UNDETECTABLE(receiver)) { | 326 if (receiver == null && !IS_UNDETECTABLE(receiver)) { |
| 325 receiver = %GlobalReceiver(global); | 327 receiver = %GlobalReceiver(global); |
| 326 } | 328 } |
| 327 return %LookupAccessor(ToObject(receiver), ToString(name), SETTER); | 329 return %LookupAccessor(ToObject(receiver), ToString(name), SETTER); |
| 328 } | 330 } |
| 329 | 331 |
| 330 | 332 |
| 331 function ObjectKeys(obj) { | 333 function ObjectKeys(obj) { |
| 332 if (!IS_SPEC_OBJECT(obj)) | 334 if (!IS_SPEC_OBJECT(obj)) { |
| 333 throw MakeTypeError("obj_ctor_property_non_object", ["keys"]); | 335 throw MakeTypeError("obj_ctor_property_non_object", ["keys"]); |
| 336 } |
| 334 if (%IsJSProxy(obj)) { | 337 if (%IsJSProxy(obj)) { |
| 335 var handler = %GetHandler(obj); | 338 var handler = %GetHandler(obj); |
| 336 var names = CallTrap0(handler, "keys", DerivedKeysTrap); | 339 var names = CallTrap0(handler, "keys", DerivedKeysTrap); |
| 337 return ToStringArray(names); | 340 return ToStringArray(names); |
| 338 } | 341 } |
| 339 return %LocalKeys(obj); | 342 return %LocalKeys(obj); |
| 340 } | 343 } |
| 341 | 344 |
| 342 | 345 |
| 343 // ES5 8.10.1. | 346 // ES5 8.10.1. |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 | 457 |
| 455 if (IsInconsistentDescriptor(desc)) { | 458 if (IsInconsistentDescriptor(desc)) { |
| 456 throw MakeTypeError("value_and_accessor", [obj]); | 459 throw MakeTypeError("value_and_accessor", [obj]); |
| 457 } | 460 } |
| 458 return desc; | 461 return desc; |
| 459 } | 462 } |
| 460 | 463 |
| 461 | 464 |
| 462 // For Harmony proxies. | 465 // For Harmony proxies. |
| 463 function ToCompletePropertyDescriptor(obj) { | 466 function ToCompletePropertyDescriptor(obj) { |
| 464 var desc = ToPropertyDescriptor(obj) | 467 var desc = ToPropertyDescriptor(obj); |
| 465 if (IsGenericDescriptor(desc) || IsDataDescriptor(desc)) { | 468 if (IsGenericDescriptor(desc) || IsDataDescriptor(desc)) { |
| 466 if (!desc.hasValue()) desc.setValue(void 0); | 469 if (!desc.hasValue()) desc.setValue(void 0); |
| 467 if (!desc.hasWritable()) desc.setWritable(false); | 470 if (!desc.hasWritable()) desc.setWritable(false); |
| 468 } else { | 471 } else { |
| 469 // Is accessor descriptor. | 472 // Is accessor descriptor. |
| 470 if (!desc.hasGetter()) desc.setGet(void 0); | 473 if (!desc.hasGetter()) desc.setGet(void 0); |
| 471 if (!desc.hasSetter()) desc.setSet(void 0); | 474 if (!desc.hasSetter()) desc.setSet(void 0); |
| 472 } | 475 } |
| 473 if (!desc.hasEnumerable()) desc.setEnumerable(false); | 476 if (!desc.hasEnumerable()) desc.setEnumerable(false); |
| 474 if (!desc.hasConfigurable()) desc.setConfigurable(false); | 477 if (!desc.hasConfigurable()) desc.setConfigurable(false); |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 if (desc.hasSetter()) { | 841 if (desc.hasSetter()) { |
| 839 %DefineOrRedefineAccessorProperty(obj, p, SETTER, desc.getSet(), flag); | 842 %DefineOrRedefineAccessorProperty(obj, p, SETTER, desc.getSet(), flag); |
| 840 } | 843 } |
| 841 } | 844 } |
| 842 return true; | 845 return true; |
| 843 } | 846 } |
| 844 | 847 |
| 845 | 848 |
| 846 // ES5 section 15.2.3.2. | 849 // ES5 section 15.2.3.2. |
| 847 function ObjectGetPrototypeOf(obj) { | 850 function ObjectGetPrototypeOf(obj) { |
| 848 if (!IS_SPEC_OBJECT(obj)) | 851 if (!IS_SPEC_OBJECT(obj)) { |
| 849 throw MakeTypeError("obj_ctor_property_non_object", ["getPrototypeOf"]); | 852 throw MakeTypeError("obj_ctor_property_non_object", ["getPrototypeOf"]); |
| 853 } |
| 850 return %GetPrototype(obj); | 854 return %GetPrototype(obj); |
| 851 } | 855 } |
| 852 | 856 |
| 853 | 857 |
| 854 // ES5 section 15.2.3.3 | 858 // ES5 section 15.2.3.3 |
| 855 function ObjectGetOwnPropertyDescriptor(obj, p) { | 859 function ObjectGetOwnPropertyDescriptor(obj, p) { |
| 856 if (!IS_SPEC_OBJECT(obj)) | 860 if (!IS_SPEC_OBJECT(obj)) { |
| 857 throw MakeTypeError("obj_ctor_property_non_object", | 861 throw MakeTypeError("obj_ctor_property_non_object", |
| 858 ["getOwnPropertyDescriptor"]); | 862 ["getOwnPropertyDescriptor"]); |
| 863 } |
| 859 var desc = GetOwnProperty(obj, p); | 864 var desc = GetOwnProperty(obj, p); |
| 860 return FromPropertyDescriptor(desc); | 865 return FromPropertyDescriptor(desc); |
| 861 } | 866 } |
| 862 | 867 |
| 863 | 868 |
| 864 // For Harmony proxies | 869 // For Harmony proxies |
| 865 function ToStringArray(obj, trap) { | 870 function ToStringArray(obj, trap) { |
| 866 if (!IS_SPEC_OBJECT(obj)) { | 871 if (!IS_SPEC_OBJECT(obj)) { |
| 867 throw MakeTypeError("proxy_non_object_prop_names", [obj, trap]); | 872 throw MakeTypeError("proxy_non_object_prop_names", [obj, trap]); |
| 868 } | 873 } |
| 869 var n = ToUint32(obj.length); | 874 var n = ToUint32(obj.length); |
| 870 var array = new $Array(n); | 875 var array = new $Array(n); |
| 871 var names = {} // TODO(rossberg): use sets once they are ready. | 876 var names = {}; // TODO(rossberg): use sets once they are ready. |
| 872 for (var index = 0; index < n; index++) { | 877 for (var index = 0; index < n; index++) { |
| 873 var s = ToString(obj[index]); | 878 var s = ToString(obj[index]); |
| 874 if (s in names) { | 879 if (s in names) { |
| 875 throw MakeTypeError("proxy_repeated_prop_name", [obj, trap, s]) | 880 throw MakeTypeError("proxy_repeated_prop_name", [obj, trap, s]); |
| 876 } | 881 } |
| 877 array[index] = s; | 882 array[index] = s; |
| 878 names[s] = 0; | 883 names[s] = 0; |
| 879 } | 884 } |
| 880 return array; | 885 return array; |
| 881 } | 886 } |
| 882 | 887 |
| 883 | 888 |
| 884 // ES5 section 15.2.3.4. | 889 // ES5 section 15.2.3.4. |
| 885 function ObjectGetOwnPropertyNames(obj) { | 890 function ObjectGetOwnPropertyNames(obj) { |
| 886 if (!IS_SPEC_OBJECT(obj)) | 891 if (!IS_SPEC_OBJECT(obj)) { |
| 887 throw MakeTypeError("obj_ctor_property_non_object", ["getOwnPropertyNames"])
; | 892 throw MakeTypeError("obj_ctor_property_non_object", |
| 888 | 893 ["getOwnPropertyNames"]); |
| 894 } |
| 889 // Special handling for proxies. | 895 // Special handling for proxies. |
| 890 if (%IsJSProxy(obj)) { | 896 if (%IsJSProxy(obj)) { |
| 891 var handler = %GetHandler(obj); | 897 var handler = %GetHandler(obj); |
| 892 var names = CallTrap0(handler, "getOwnPropertyNames", void 0); | 898 var names = CallTrap0(handler, "getOwnPropertyNames", void 0); |
| 893 return ToStringArray(names, "getOwnPropertyNames"); | 899 return ToStringArray(names, "getOwnPropertyNames"); |
| 894 } | 900 } |
| 895 | 901 |
| 896 // Find all the indexed properties. | 902 // Find all the indexed properties. |
| 897 | 903 |
| 898 // Get the local element names. | 904 // Get the local element names. |
| 899 var propertyNames = %GetLocalElementNames(obj); | 905 var propertyNames = %GetLocalElementNames(obj); |
| 900 | 906 |
| 901 // Get names for indexed interceptor properties. | 907 // Get names for indexed interceptor properties. |
| 902 if (%GetInterceptorInfo(obj) & 1) { | 908 if (%GetInterceptorInfo(obj) & 1) { |
| 903 var indexedInterceptorNames = | 909 var indexedInterceptorNames = |
| 904 %GetIndexedInterceptorElementNames(obj); | 910 %GetIndexedInterceptorElementNames(obj); |
| 905 if (indexedInterceptorNames) | 911 if (indexedInterceptorNames) { |
| 906 propertyNames = propertyNames.concat(indexedInterceptorNames); | 912 propertyNames = propertyNames.concat(indexedInterceptorNames); |
| 913 } |
| 907 } | 914 } |
| 908 | 915 |
| 909 // Find all the named properties. | 916 // Find all the named properties. |
| 910 | 917 |
| 911 // Get the local property names. | 918 // Get the local property names. |
| 912 propertyNames = propertyNames.concat(%GetLocalPropertyNames(obj)); | 919 propertyNames = propertyNames.concat(%GetLocalPropertyNames(obj)); |
| 913 | 920 |
| 914 // Get names for named interceptor properties if any. | 921 // Get names for named interceptor properties if any. |
| 915 | 922 |
| 916 if (%GetInterceptorInfo(obj) & 2) { | 923 if (%GetInterceptorInfo(obj) & 2) { |
| 917 var namedInterceptorNames = | 924 var namedInterceptorNames = |
| 918 %GetNamedInterceptorPropertyNames(obj); | 925 %GetNamedInterceptorPropertyNames(obj); |
| 919 if (namedInterceptorNames) { | 926 if (namedInterceptorNames) { |
| 920 propertyNames = propertyNames.concat(namedInterceptorNames); | 927 propertyNames = propertyNames.concat(namedInterceptorNames); |
| 921 } | 928 } |
| 922 } | 929 } |
| 923 | 930 |
| 924 // Property names are expected to be unique strings. | 931 // Property names are expected to be unique strings. |
| 925 var propertySet = {}; | 932 var propertySet = {}; |
| 926 var j = 0; | 933 var j = 0; |
| 927 for (var i = 0; i < propertyNames.length; ++i) { | 934 for (var i = 0; i < propertyNames.length; ++i) { |
| 928 var name = ToString(propertyNames[i]); | 935 var name = ToString(propertyNames[i]); |
| 929 // We need to check for the exact property value since for intrinsic | 936 // We need to check for the exact property value since for intrinsic |
| 930 // properties like toString if(propertySet["toString"]) will always | 937 // properties like toString if(propertySet["toString"]) will always |
| 931 // succeed. | 938 // succeed. |
| 932 if (propertySet[name] === true) | 939 if (propertySet[name] === true) { |
| 933 continue; | 940 continue; |
| 941 } |
| 934 propertySet[name] = true; | 942 propertySet[name] = true; |
| 935 propertyNames[j++] = name; | 943 propertyNames[j++] = name; |
| 936 } | 944 } |
| 937 propertyNames.length = j; | 945 propertyNames.length = j; |
| 938 | 946 |
| 939 return propertyNames; | 947 return propertyNames; |
| 940 } | 948 } |
| 941 | 949 |
| 942 | 950 |
| 943 // ES5 section 15.2.3.5. | 951 // ES5 section 15.2.3.5. |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 999 if (%HasLocalProperty(properties, key)) { | 1007 if (%HasLocalProperty(properties, key)) { |
| 1000 names.push(key); | 1008 names.push(key); |
| 1001 } | 1009 } |
| 1002 } | 1010 } |
| 1003 return names; | 1011 return names; |
| 1004 } | 1012 } |
| 1005 | 1013 |
| 1006 | 1014 |
| 1007 // ES5 section 15.2.3.7. | 1015 // ES5 section 15.2.3.7. |
| 1008 function ObjectDefineProperties(obj, properties) { | 1016 function ObjectDefineProperties(obj, properties) { |
| 1009 if (!IS_SPEC_OBJECT(obj)) | 1017 if (!IS_SPEC_OBJECT(obj)) { |
| 1010 throw MakeTypeError("obj_ctor_property_non_object", ["defineProperties"]); | 1018 throw MakeTypeError("obj_ctor_property_non_object", ["defineProperties"]); |
| 1019 } |
| 1011 var props = ToObject(properties); | 1020 var props = ToObject(properties); |
| 1012 var names = GetOwnEnumerablePropertyNames(props); | 1021 var names = GetOwnEnumerablePropertyNames(props); |
| 1013 var descriptors = new InternalArray(); | 1022 var descriptors = new InternalArray(); |
| 1014 for (var i = 0; i < names.length; i++) { | 1023 for (var i = 0; i < names.length; i++) { |
| 1015 descriptors.push(ToPropertyDescriptor(props[names[i]])); | 1024 descriptors.push(ToPropertyDescriptor(props[names[i]])); |
| 1016 } | 1025 } |
| 1017 for (var i = 0; i < names.length; i++) { | 1026 for (var i = 0; i < names.length; i++) { |
| 1018 DefineOwnProperty(obj, names[i], descriptors[i], true); | 1027 DefineOwnProperty(obj, names[i], descriptors[i], true); |
| 1019 } | 1028 } |
| 1020 return obj; | 1029 return obj; |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1225 } | 1234 } |
| 1226 b = %_ValueOf(b); | 1235 b = %_ValueOf(b); |
| 1227 } | 1236 } |
| 1228 return b ? 'true' : 'false'; | 1237 return b ? 'true' : 'false'; |
| 1229 } | 1238 } |
| 1230 | 1239 |
| 1231 | 1240 |
| 1232 function BooleanValueOf() { | 1241 function BooleanValueOf() { |
| 1233 // NOTE: Both Boolean objects and values can enter here as | 1242 // NOTE: Both Boolean objects and values can enter here as |
| 1234 // 'this'. This is not as dictated by ECMA-262. | 1243 // 'this'. This is not as dictated by ECMA-262. |
| 1235 if (!IS_BOOLEAN(this) && !IS_BOOLEAN_WRAPPER(this)) | 1244 if (!IS_BOOLEAN(this) && !IS_BOOLEAN_WRAPPER(this)) { |
| 1236 throw new $TypeError('Boolean.prototype.valueOf is not generic'); | 1245 throw new $TypeError('Boolean.prototype.valueOf is not generic'); |
| 1246 } |
| 1237 return %_ValueOf(this); | 1247 return %_ValueOf(this); |
| 1238 } | 1248 } |
| 1239 | 1249 |
| 1240 | 1250 |
| 1241 // ---------------------------------------------------------------------------- | 1251 // ---------------------------------------------------------------------------- |
| 1242 | 1252 |
| 1243 | 1253 |
| 1244 function SetUpBoolean () { | 1254 function SetUpBoolean () { |
| 1245 %CheckIsBootstrapping(); | 1255 %CheckIsBootstrapping(); |
| 1246 InstallFunctions($Boolean.prototype, DONT_ENUM, $Array( | 1256 InstallFunctions($Boolean.prototype, DONT_ENUM, $Array( |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1266 }); | 1276 }); |
| 1267 | 1277 |
| 1268 %FunctionSetPrototype($Number, new $Number(0)); | 1278 %FunctionSetPrototype($Number, new $Number(0)); |
| 1269 | 1279 |
| 1270 // ECMA-262 section 15.7.4.2. | 1280 // ECMA-262 section 15.7.4.2. |
| 1271 function NumberToString(radix) { | 1281 function NumberToString(radix) { |
| 1272 // NOTE: Both Number objects and values can enter here as | 1282 // NOTE: Both Number objects and values can enter here as |
| 1273 // 'this'. This is not as dictated by ECMA-262. | 1283 // 'this'. This is not as dictated by ECMA-262. |
| 1274 var number = this; | 1284 var number = this; |
| 1275 if (!IS_NUMBER(this)) { | 1285 if (!IS_NUMBER(this)) { |
| 1276 if (!IS_NUMBER_WRAPPER(this)) | 1286 if (!IS_NUMBER_WRAPPER(this)) { |
| 1277 throw new $TypeError('Number.prototype.toString is not generic'); | 1287 throw new $TypeError('Number.prototype.toString is not generic'); |
| 1288 } |
| 1278 // Get the value of this number in case it's an object. | 1289 // Get the value of this number in case it's an object. |
| 1279 number = %_ValueOf(this); | 1290 number = %_ValueOf(this); |
| 1280 } | 1291 } |
| 1281 // Fast case: Convert number in radix 10. | 1292 // Fast case: Convert number in radix 10. |
| 1282 if (IS_UNDEFINED(radix) || radix === 10) { | 1293 if (IS_UNDEFINED(radix) || radix === 10) { |
| 1283 return %_NumberToString(number); | 1294 return %_NumberToString(number); |
| 1284 } | 1295 } |
| 1285 | 1296 |
| 1286 // Convert the radix to an integer and check the range. | 1297 // Convert the radix to an integer and check the range. |
| 1287 radix = TO_INTEGER(radix); | 1298 radix = TO_INTEGER(radix); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1300 ["Number.prototype.toLocaleString"]); | 1311 ["Number.prototype.toLocaleString"]); |
| 1301 } | 1312 } |
| 1302 return this.toString(); | 1313 return this.toString(); |
| 1303 } | 1314 } |
| 1304 | 1315 |
| 1305 | 1316 |
| 1306 // ECMA-262 section 15.7.4.4 | 1317 // ECMA-262 section 15.7.4.4 |
| 1307 function NumberValueOf() { | 1318 function NumberValueOf() { |
| 1308 // NOTE: Both Number objects and values can enter here as | 1319 // NOTE: Both Number objects and values can enter here as |
| 1309 // 'this'. This is not as dictated by ECMA-262. | 1320 // 'this'. This is not as dictated by ECMA-262. |
| 1310 if (!IS_NUMBER(this) && !IS_NUMBER_WRAPPER(this)) | 1321 if (!IS_NUMBER(this) && !IS_NUMBER_WRAPPER(this)) { |
| 1311 throw new $TypeError('Number.prototype.valueOf is not generic'); | 1322 throw new $TypeError('Number.prototype.valueOf is not generic'); |
| 1323 } |
| 1312 return %_ValueOf(this); | 1324 return %_ValueOf(this); |
| 1313 } | 1325 } |
| 1314 | 1326 |
| 1315 | 1327 |
| 1316 // ECMA-262 section 15.7.4.5 | 1328 // ECMA-262 section 15.7.4.5 |
| 1317 function NumberToFixed(fractionDigits) { | 1329 function NumberToFixed(fractionDigits) { |
| 1318 var f = TO_INTEGER(fractionDigits); | 1330 var f = TO_INTEGER(fractionDigits); |
| 1319 if (f < 0 || f > 20) { | 1331 if (f < 0 || f > 20) { |
| 1320 throw new $RangeError("toFixed() digits argument must be between 0 and 20"); | 1332 throw new $RangeError("toFixed() digits argument must be between 0 and 20"); |
| 1321 } | 1333 } |
| 1322 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 1334 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { |
| 1323 throw MakeTypeError("called_on_null_or_undefined", | 1335 throw MakeTypeError("called_on_null_or_undefined", |
| 1324 ["Number.prototype.toFixed"]); | 1336 ["Number.prototype.toFixed"]); |
| 1325 } | 1337 } |
| 1326 var x = ToNumber(this); | 1338 var x = ToNumber(this); |
| 1327 return %NumberToFixed(x, f); | 1339 return %NumberToFixed(x, f); |
| 1328 } | 1340 } |
| 1329 | 1341 |
| 1330 | 1342 |
| 1331 // ECMA-262 section 15.7.4.6 | 1343 // ECMA-262 section 15.7.4.6 |
| 1332 function NumberToExponential(fractionDigits) { | 1344 function NumberToExponential(fractionDigits) { |
| 1333 var f = -1; | 1345 var f = -1; |
| 1334 if (!IS_UNDEFINED(fractionDigits)) { | 1346 if (!IS_UNDEFINED(fractionDigits)) { |
| 1335 f = TO_INTEGER(fractionDigits); | 1347 f = TO_INTEGER(fractionDigits); |
| 1336 if (f < 0 || f > 20) { | 1348 if (f < 0 || f > 20) { |
| 1337 throw new $RangeError("toExponential() argument must be between 0 and 20")
; | 1349 throw new $RangeError( |
| 1350 "toExponential() argument must be between 0 and 20"); |
| 1338 } | 1351 } |
| 1339 } | 1352 } |
| 1340 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { | 1353 if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { |
| 1341 throw MakeTypeError("called_on_null_or_undefined", | 1354 throw MakeTypeError("called_on_null_or_undefined", |
| 1342 ["Number.prototype.toExponential"]); | 1355 ["Number.prototype.toExponential"]); |
| 1343 } | 1356 } |
| 1344 var x = ToNumber(this); | 1357 var x = ToNumber(this); |
| 1345 return %NumberToExponential(x, f); | 1358 return %NumberToExponential(x, f); |
| 1346 } | 1359 } |
| 1347 | 1360 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1371 %SetProperty($Number.prototype, "constructor", $Number, DONT_ENUM); | 1384 %SetProperty($Number.prototype, "constructor", $Number, DONT_ENUM); |
| 1372 | 1385 |
| 1373 %OptimizeObjectForAddingMultipleProperties($Number, 5); | 1386 %OptimizeObjectForAddingMultipleProperties($Number, 5); |
| 1374 // ECMA-262 section 15.7.3.1. | 1387 // ECMA-262 section 15.7.3.1. |
| 1375 %SetProperty($Number, | 1388 %SetProperty($Number, |
| 1376 "MAX_VALUE", | 1389 "MAX_VALUE", |
| 1377 1.7976931348623157e+308, | 1390 1.7976931348623157e+308, |
| 1378 DONT_ENUM | DONT_DELETE | READ_ONLY); | 1391 DONT_ENUM | DONT_DELETE | READ_ONLY); |
| 1379 | 1392 |
| 1380 // ECMA-262 section 15.7.3.2. | 1393 // ECMA-262 section 15.7.3.2. |
| 1381 %SetProperty($Number, "MIN_VALUE", 5e-324, DONT_ENUM | DONT_DELETE | READ_ONLY
); | 1394 %SetProperty($Number, "MIN_VALUE", 5e-324, |
| 1395 DONT_ENUM | DONT_DELETE | READ_ONLY); |
| 1382 | 1396 |
| 1383 // ECMA-262 section 15.7.3.3. | 1397 // ECMA-262 section 15.7.3.3. |
| 1384 %SetProperty($Number, "NaN", $NaN, DONT_ENUM | DONT_DELETE | READ_ONLY); | 1398 %SetProperty($Number, "NaN", $NaN, DONT_ENUM | DONT_DELETE | READ_ONLY); |
| 1385 | 1399 |
| 1386 // ECMA-262 section 15.7.3.4. | 1400 // ECMA-262 section 15.7.3.4. |
| 1387 %SetProperty($Number, | 1401 %SetProperty($Number, |
| 1388 "NEGATIVE_INFINITY", | 1402 "NEGATIVE_INFINITY", |
| 1389 -1/0, | 1403 -1/0, |
| 1390 DONT_ENUM | DONT_DELETE | READ_ONLY); | 1404 DONT_ENUM | DONT_DELETE | READ_ONLY); |
| 1391 | 1405 |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1489 if ((typeof old_length === "number") && | 1503 if ((typeof old_length === "number") && |
| 1490 ((old_length >>> 0) === old_length)) { | 1504 ((old_length >>> 0) === old_length)) { |
| 1491 var argc = %_ArgumentsLength(); | 1505 var argc = %_ArgumentsLength(); |
| 1492 if (argc > 0) argc--; // Don't count the thisArg as parameter. | 1506 if (argc > 0) argc--; // Don't count the thisArg as parameter. |
| 1493 new_length = old_length - argc; | 1507 new_length = old_length - argc; |
| 1494 if (new_length < 0) new_length = 0; | 1508 if (new_length < 0) new_length = 0; |
| 1495 } | 1509 } |
| 1496 } | 1510 } |
| 1497 // This runtime function finds any remaining arguments on the stack, | 1511 // This runtime function finds any remaining arguments on the stack, |
| 1498 // so we don't pass the arguments object. | 1512 // so we don't pass the arguments object. |
| 1499 var result = %FunctionBindArguments(boundFunction, this, this_arg, new_length)
; | 1513 var result = %FunctionBindArguments(boundFunction, this, |
| 1514 this_arg, new_length); |
| 1500 | 1515 |
| 1501 // We already have caller and arguments properties on functions, | 1516 // We already have caller and arguments properties on functions, |
| 1502 // which are non-configurable. It therefore makes no sence to | 1517 // which are non-configurable. It therefore makes no sence to |
| 1503 // try to redefine these as defined by the spec. The spec says | 1518 // try to redefine these as defined by the spec. The spec says |
| 1504 // that bind should make these throw a TypeError if get or set | 1519 // that bind should make these throw a TypeError if get or set |
| 1505 // is called and make them non-enumerable and non-configurable. | 1520 // is called and make them non-enumerable and non-configurable. |
| 1506 // To be consistent with our normal functions we leave this as it is. | 1521 // To be consistent with our normal functions we leave this as it is. |
| 1507 // TODO(lrn): Do set these to be thrower. | 1522 // TODO(lrn): Do set these to be thrower. |
| 1508 return result; | 1523 return result; |
| 1509 } | 1524 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1537 | 1552 |
| 1538 function SetUpFunction() { | 1553 function SetUpFunction() { |
| 1539 %CheckIsBootstrapping(); | 1554 %CheckIsBootstrapping(); |
| 1540 InstallFunctions($Function.prototype, DONT_ENUM, $Array( | 1555 InstallFunctions($Function.prototype, DONT_ENUM, $Array( |
| 1541 "bind", FunctionBind, | 1556 "bind", FunctionBind, |
| 1542 "toString", FunctionToString | 1557 "toString", FunctionToString |
| 1543 )); | 1558 )); |
| 1544 } | 1559 } |
| 1545 | 1560 |
| 1546 SetUpFunction(); | 1561 SetUpFunction(); |
| OLD | NEW |