Chromium Code Reviews| Index: src/v8natives.js |
| diff --git a/src/v8natives.js b/src/v8natives.js |
| index 1e42ac5d1eb2e100444303cc78e19bfe9e243525..25147ac4aabdde82aeba01242db6c4e55961d5e9 100644 |
| --- a/src/v8natives.js |
| +++ b/src/v8natives.js |
| @@ -2,16 +2,44 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| -// This file relies on the fact that the following declarations have been made |
| -// in runtime.js: |
| -// var $Object = global.Object; |
| -// var $Boolean = global.Boolean; |
| -// var $Number = global.Number; |
| -// var $Function = global.Function; |
| -// var $Array = global.Array; |
| - |
| -var $isNaN = GlobalIsNaN; |
| -var $isFinite = GlobalIsFinite; |
| +var $isNaN; |
| +var $isFinite; |
| +var $setFunctionName; |
|
Jakob Kummerow
2015/04/30 13:40:58
nit: I think this list is long enough that alpha-s
|
| +var $installFunctions; |
| +var $overrideFunction; |
| +var $installGetter; |
| +var $installConstants; |
| +var $setUpLockedPrototype; |
| +var $objectToString; |
| +var $objectHasOwnProperty; |
| +var $objectLookupGetter; |
| +var $objectLookupSetter; |
| +var $toNameArray; |
| +var $objectGetOwnPropertyKeys; |
| +var $objectDefineProperty; |
| +var $objectDefineProperties; |
| +var $objectFreeze; |
| +var $objectIsSealed; |
| +var $objectIsFrozen; |
| +var $numberIsNaN; |
| +var $functionSourceString; |
| +var $newFunctionString; |
| +var $getIterator; |
| +var $globalEval; |
| +var $toCompletePropertyDescriptor; |
| +var $getMethod; |
| +var $objectGetOwnPropertyDescriptor; |
| +var $delete; |
| + |
| +(function() { |
| + |
| +%CheckIsBootstrapping(); |
| + |
| +var GlobalArray = global.Array; |
| +var GlobalBoolean = global.Boolean; |
| +var GlobalFunction = global.Function; |
| +var GlobalNumber = global.Number; |
| +var GlobalObject = global.Object; |
| // ---------------------------------------------------------------------------- |
| @@ -195,44 +223,31 @@ function GlobalEval(x) { |
| // ---------------------------------------------------------------------------- |
| // Set up global object. |
| -function SetUpGlobal() { |
| - %CheckIsBootstrapping(); |
| - |
| - var attributes = DONT_ENUM | DONT_DELETE | READ_ONLY; |
| +var attributes = DONT_ENUM | DONT_DELETE | READ_ONLY; |
| +InstallConstants(global, [ |
| // ECMA 262 - 15.1.1.1. |
| - %AddNamedProperty(global, "NaN", NAN, attributes); |
| - |
| + "NaN", NAN, |
| // ECMA-262 - 15.1.1.2. |
| - %AddNamedProperty(global, "Infinity", INFINITY, attributes); |
| - |
| - // ECMA-262 - 15.1.1.3. |
| - %AddNamedProperty(global, "undefined", UNDEFINED, attributes); |
| - |
| - // Set up non-enumerable function on the global object. |
| - InstallFunctions(global, DONT_ENUM, [ |
| - "isNaN", GlobalIsNaN, |
| - "isFinite", GlobalIsFinite, |
| - "parseInt", GlobalParseInt, |
| - "parseFloat", GlobalParseFloat, |
| - "eval", GlobalEval |
| - ]); |
| -} |
| + "Infinity", INFINITY, |
| + // ECMA-262 - 15.1.1.2. |
| + "undefined", UNDEFINED, |
| +]); |
| -SetUpGlobal(); |
| +// Set up non-enumerable function on the global object. |
| +InstallFunctions(global, DONT_ENUM, [ |
| + "isNaN", GlobalIsNaN, |
| + "isFinite", GlobalIsFinite, |
| + "parseInt", GlobalParseInt, |
| + "parseFloat", GlobalParseFloat, |
| + "eval", GlobalEval |
| +]); |
| // ---------------------------------------------------------------------------- |
| // Object |
| // ECMA-262 - 15.2.4.2 |
| -function NoSideEffectsObjectToString() { |
| - if (IS_UNDEFINED(this) && !IS_UNDETECTABLE(this)) return "[object Undefined]"; |
| - if (IS_NULL(this)) return "[object Null]"; |
| - return "[object " + %_ClassOf(TO_OBJECT_INLINE(this)) + "]"; |
| -} |
| - |
| - |
| function ObjectToString() { |
| if (IS_UNDEFINED(this) && !IS_UNDETECTABLE(this)) return "[object Undefined]"; |
| if (IS_NULL(this)) return "[object Null]"; |
| @@ -242,7 +257,7 @@ function ObjectToString() { |
| // TODO(caitp): cannot wait to get rid of this flag :> |
| if (harmony_tostring) { |
| - var tag = O[symbolToStringTag]; |
| + tag = O[symbolToStringTag]; |
| if (!IS_STRING(tag)) { |
| tag = builtinTag; |
| } |
| @@ -411,7 +426,7 @@ function FromPropertyDescriptor(desc) { |
| // Harmony Proxies |
| function FromGenericPropertyDescriptor(desc) { |
| if (IS_UNDEFINED(desc)) return desc; |
| - var obj = new $Object(); |
| + var obj = new GlobalObject(); |
| if (desc.hasValue()) { |
| %AddNamedProperty(obj, "value", desc.getValue(), NONE); |
| @@ -1040,7 +1055,7 @@ function ToNameArray(obj, trap, includeSymbols) { |
| throw MakeTypeError(kProxyNonObjectPropNames, trap, obj); |
| } |
| var n = ToUint32(obj.length); |
| - var array = new $Array(n); |
| + var array = new GlobalArray(n); |
| var realLength = 0; |
| var names = { __proto__: null }; // TODO(rossberg): use sets once ready. |
| for (var index = 0; index < n; index++) { |
| @@ -1249,8 +1264,8 @@ function ProxyFix(obj) { |
| %SetCode(obj, code); |
| // TODO(rossberg): What about length and other properties? Not specified. |
| // We just put in some half-reasonable defaults for now. |
| - var prototype = new $Object(); |
| - $Object.defineProperty(prototype, "constructor", |
| + var prototype = new GlobalObject(); |
| + ObjectDefineProperty(prototype, "constructor", |
| {value: obj, writable: true, enumerable: false, configurable: true}); |
| // TODO(v8:1530): defineProperty does not handle prototype and length. |
| %FunctionSetPrototype(obj, prototype); |
| @@ -1415,54 +1430,49 @@ function ObjectConstructor(x) { |
| // ---------------------------------------------------------------------------- |
| // Object |
| -function SetUpObject() { |
| - %CheckIsBootstrapping(); |
| - |
| - %SetNativeFlag($Object); |
| - %SetCode($Object, ObjectConstructor); |
| - |
| - %AddNamedProperty($Object.prototype, "constructor", $Object, DONT_ENUM); |
| - |
| - // Set up non-enumerable functions on the Object.prototype object. |
| - InstallFunctions($Object.prototype, DONT_ENUM, [ |
| - "toString", ObjectToString, |
| - "toLocaleString", ObjectToLocaleString, |
| - "valueOf", ObjectValueOf, |
| - "hasOwnProperty", ObjectHasOwnProperty, |
| - "isPrototypeOf", ObjectIsPrototypeOf, |
| - "propertyIsEnumerable", ObjectPropertyIsEnumerable, |
| - "__defineGetter__", ObjectDefineGetter, |
| - "__lookupGetter__", ObjectLookupGetter, |
| - "__defineSetter__", ObjectDefineSetter, |
| - "__lookupSetter__", ObjectLookupSetter |
| - ]); |
| - InstallGetterSetter($Object.prototype, "__proto__", |
| - ObjectGetProto, ObjectSetProto); |
| - |
| - // Set up non-enumerable functions in the Object object. |
| - InstallFunctions($Object, DONT_ENUM, [ |
| - "keys", ObjectKeys, |
| - "create", ObjectCreate, |
| - "defineProperty", ObjectDefineProperty, |
| - "defineProperties", ObjectDefineProperties, |
| - "freeze", ObjectFreezeJS, |
| - "getPrototypeOf", ObjectGetPrototypeOf, |
| - "setPrototypeOf", ObjectSetPrototypeOf, |
| - "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor, |
| - "getOwnPropertyNames", ObjectGetOwnPropertyNames, |
| - // getOwnPropertySymbols is added in symbol.js. |
| - "is", ObjectIs, |
| - "isExtensible", ObjectIsExtensible, |
| - "isFrozen", ObjectIsFrozen, |
| - "isSealed", ObjectIsSealed, |
| - "preventExtensions", ObjectPreventExtension, |
| - "seal", ObjectSealJS |
| - // deliverChangeRecords, getNotifier, observe and unobserve are added |
| - // in object-observe.js. |
| - ]); |
| -} |
| - |
| -SetUpObject(); |
| +%SetNativeFlag(GlobalObject); |
| +%SetCode(GlobalObject, ObjectConstructor); |
| + |
| +%AddNamedProperty(GlobalObject.prototype, "constructor", GlobalObject, |
| + DONT_ENUM); |
| + |
| +// Set up non-enumerable functions on the Object.prototype object. |
| +InstallFunctions(GlobalObject.prototype, DONT_ENUM, [ |
| + "toString", ObjectToString, |
| + "toLocaleString", ObjectToLocaleString, |
| + "valueOf", ObjectValueOf, |
| + "hasOwnProperty", ObjectHasOwnProperty, |
| + "isPrototypeOf", ObjectIsPrototypeOf, |
| + "propertyIsEnumerable", ObjectPropertyIsEnumerable, |
| + "__defineGetter__", ObjectDefineGetter, |
| + "__lookupGetter__", ObjectLookupGetter, |
| + "__defineSetter__", ObjectDefineSetter, |
| + "__lookupSetter__", ObjectLookupSetter |
| +]); |
| +InstallGetterSetter(GlobalObject.prototype, "__proto__", ObjectGetProto, |
| + ObjectSetProto); |
| + |
| +// Set up non-enumerable functions in the Object object. |
| +InstallFunctions(GlobalObject, DONT_ENUM, [ |
| + "keys", ObjectKeys, |
| + "create", ObjectCreate, |
| + "defineProperty", ObjectDefineProperty, |
| + "defineProperties", ObjectDefineProperties, |
| + "freeze", ObjectFreezeJS, |
| + "getPrototypeOf", ObjectGetPrototypeOf, |
| + "setPrototypeOf", ObjectSetPrototypeOf, |
| + "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor, |
| + "getOwnPropertyNames", ObjectGetOwnPropertyNames, |
| + // getOwnPropertySymbols is added in symbol.js. |
| + "is", ObjectIs, |
| + "isExtensible", ObjectIsExtensible, |
| + "isFrozen", ObjectIsFrozen, |
| + "isSealed", ObjectIsSealed, |
| + "preventExtensions", ObjectPreventExtension, |
| + "seal", ObjectSealJS |
| + // deliverChangeRecords, getNotifier, observe and unobserve are added |
| + // in object-observe.js. |
| +]); |
| // ---------------------------------------------------------------------------- |
| @@ -1503,20 +1513,15 @@ function BooleanValueOf() { |
| // ---------------------------------------------------------------------------- |
| -function SetUpBoolean () { |
| - %CheckIsBootstrapping(); |
| - |
| - %SetCode($Boolean, BooleanConstructor); |
| - %FunctionSetPrototype($Boolean, new $Boolean(false)); |
| - %AddNamedProperty($Boolean.prototype, "constructor", $Boolean, DONT_ENUM); |
| +%SetCode(GlobalBoolean, BooleanConstructor); |
| +%FunctionSetPrototype(GlobalBoolean, new GlobalBoolean(false)); |
| +%AddNamedProperty(GlobalBoolean.prototype, "constructor", GlobalBoolean, |
| + DONT_ENUM); |
| - InstallFunctions($Boolean.prototype, DONT_ENUM, [ |
| - "toString", BooleanToString, |
| - "valueOf", BooleanValueOf |
| - ]); |
| -} |
| - |
| -SetUpBoolean(); |
| +InstallFunctions(GlobalBoolean.prototype, DONT_ENUM, [ |
| + "toString", BooleanToString, |
| + "valueOf", BooleanValueOf |
| +]); |
| // ---------------------------------------------------------------------------- |
| @@ -1672,7 +1677,9 @@ function NumberIsNaN(number) { |
| function NumberIsSafeInteger(number) { |
| if (NumberIsFinite(number)) { |
| var integral = TO_INTEGER(number); |
| - if (integral == number) return $abs(integral) <= $Number.MAX_SAFE_INTEGER; |
| + if (integral == number) { |
| + return $abs(integral) <= GlobalNumber.MAX_SAFE_INTEGER; |
| + } |
| } |
| return false; |
| } |
| @@ -1680,59 +1687,54 @@ function NumberIsSafeInteger(number) { |
| // ---------------------------------------------------------------------------- |
| -function SetUpNumber() { |
| - %CheckIsBootstrapping(); |
| +%SetCode(GlobalNumber, NumberConstructor); |
| +%FunctionSetPrototype(GlobalNumber, new GlobalNumber(0)); |
| + |
| +%OptimizeObjectForAddingMultipleProperties(GlobalNumber.prototype, 8); |
| +// Set up the constructor property on the Number prototype object. |
| +%AddNamedProperty(GlobalNumber.prototype, "constructor", GlobalNumber, |
| + DONT_ENUM); |
| + |
| +InstallConstants(GlobalNumber, [ |
| + // ECMA-262 section 15.7.3.1. |
| + "MAX_VALUE", 1.7976931348623157e+308, |
| + // ECMA-262 section 15.7.3.2. |
| + "MIN_VALUE", 5e-324, |
| + // ECMA-262 section 15.7.3.3. |
| + "NaN", NAN, |
| + // ECMA-262 section 15.7.3.4. |
| + "NEGATIVE_INFINITY", -INFINITY, |
| + // ECMA-262 section 15.7.3.5. |
| + "POSITIVE_INFINITY", INFINITY, |
| + |
| + // --- Harmony constants (no spec refs until settled.) |
| + |
| + "MAX_SAFE_INTEGER", %_MathPow(2, 53) - 1, |
| + "MIN_SAFE_INTEGER", -%_MathPow(2, 53) + 1, |
| + "EPSILON", %_MathPow(2, -52) |
| +]); |
| - %SetCode($Number, NumberConstructor); |
| - %FunctionSetPrototype($Number, new $Number(0)); |
| - |
| - %OptimizeObjectForAddingMultipleProperties($Number.prototype, 8); |
| - // Set up the constructor property on the Number prototype object. |
| - %AddNamedProperty($Number.prototype, "constructor", $Number, DONT_ENUM); |
| - |
| - InstallConstants($Number, [ |
| - // ECMA-262 section 15.7.3.1. |
| - "MAX_VALUE", 1.7976931348623157e+308, |
| - // ECMA-262 section 15.7.3.2. |
| - "MIN_VALUE", 5e-324, |
| - // ECMA-262 section 15.7.3.3. |
| - "NaN", NAN, |
| - // ECMA-262 section 15.7.3.4. |
| - "NEGATIVE_INFINITY", -INFINITY, |
| - // ECMA-262 section 15.7.3.5. |
| - "POSITIVE_INFINITY", INFINITY, |
| - |
| - // --- Harmony constants (no spec refs until settled.) |
| - |
| - "MAX_SAFE_INTEGER", %_MathPow(2, 53) - 1, |
| - "MIN_SAFE_INTEGER", -%_MathPow(2, 53) + 1, |
| - "EPSILON", %_MathPow(2, -52) |
| - ]); |
| - |
| - // Set up non-enumerable functions on the Number prototype object. |
| - InstallFunctions($Number.prototype, DONT_ENUM, [ |
| - "toString", NumberToStringJS, |
| - "toLocaleString", NumberToLocaleString, |
| - "valueOf", NumberValueOf, |
| - "toFixed", NumberToFixedJS, |
| - "toExponential", NumberToExponentialJS, |
| - "toPrecision", NumberToPrecisionJS |
| - ]); |
| - |
| - // Harmony Number constructor additions |
| - InstallFunctions($Number, DONT_ENUM, [ |
| - "isFinite", NumberIsFinite, |
| - "isInteger", NumberIsInteger, |
| - "isNaN", NumberIsNaN, |
| - "isSafeInteger", NumberIsSafeInteger, |
| - "parseInt", GlobalParseInt, |
| - "parseFloat", GlobalParseFloat |
| - ]); |
| - |
| - %SetInlineBuiltinFlag(NumberIsNaN); |
| -} |
| - |
| -SetUpNumber(); |
| +// Set up non-enumerable functions on the Number prototype object. |
| +InstallFunctions(GlobalNumber.prototype, DONT_ENUM, [ |
| + "toString", NumberToStringJS, |
| + "toLocaleString", NumberToLocaleString, |
| + "valueOf", NumberValueOf, |
| + "toFixed", NumberToFixedJS, |
| + "toExponential", NumberToExponentialJS, |
| + "toPrecision", NumberToPrecisionJS |
| +]); |
| + |
| +// Harmony Number constructor additions |
| +InstallFunctions(GlobalNumber, DONT_ENUM, [ |
| + "isFinite", NumberIsFinite, |
| + "isInteger", NumberIsInteger, |
| + "isNaN", NumberIsNaN, |
| + "isSafeInteger", NumberIsSafeInteger, |
| + "parseInt", GlobalParseInt, |
| + "parseFloat", GlobalParseFloat |
| +]); |
| + |
| +%SetInlineBuiltinFlag(NumberIsNaN); |
| // ---------------------------------------------------------------------------- |
| @@ -1842,13 +1844,13 @@ function FunctionBind(this_arg) { // Length is 1. |
| } |
| -function NewFunctionString(arguments, function_token) { |
| - var n = arguments.length; |
| +function NewFunctionString(args, function_token) { |
| + var n = args.length; |
| var p = ''; |
| if (n > 1) { |
| - p = ToString(arguments[0]); |
| + p = ToString(args[0]); |
| for (var i = 1; i < n - 1; i++) { |
| - p += ',' + ToString(arguments[i]); |
| + p += ',' + ToString(args[i]); |
| } |
| // If the formal parameters string include ) - an illegal |
| // character - it may make the combined function expression |
| @@ -1861,7 +1863,7 @@ function NewFunctionString(arguments, function_token) { |
| // comments we can include a trailing block comment to catch this. |
| p += '\n/' + '**/'; |
| } |
| - var body = (n > 0) ? ToString(arguments[n - 1]) : ''; |
| + var body = (n > 0) ? ToString(args[n - 1]) : ''; |
| return '(' + function_token + '(' + p + ') {\n' + body + '\n})'; |
| } |
| @@ -1879,20 +1881,14 @@ function FunctionConstructor(arg1) { // length == 1 |
| // ---------------------------------------------------------------------------- |
| -function SetUpFunction() { |
| - %CheckIsBootstrapping(); |
| - |
| - %SetCode($Function, FunctionConstructor); |
| - %AddNamedProperty($Function.prototype, "constructor", $Function, DONT_ENUM); |
| - |
| - InstallFunctions($Function.prototype, DONT_ENUM, [ |
| - "bind", FunctionBind, |
| - "toString", FunctionToString |
| - ]); |
| -} |
| - |
| -SetUpFunction(); |
| +%SetCode(GlobalFunction, FunctionConstructor); |
| +%AddNamedProperty(GlobalFunction.prototype, "constructor", GlobalFunction, |
| + DONT_ENUM); |
| +InstallFunctions(GlobalFunction.prototype, DONT_ENUM, [ |
| + "bind", FunctionBind, |
| + "toString", FunctionToString |
| +]); |
| // ---------------------------------------------------------------------------- |
| // Iterator related spec functions. |
| @@ -1912,3 +1908,37 @@ function GetIterator(obj, method) { |
| } |
| return iterator; |
| } |
| + |
| +//---------------------------------------------------------------------------- |
| + |
| +$isNaN = GlobalIsNaN; |
| +$isFinite = GlobalIsFinite; |
| + |
|
Jakob Kummerow
2015/04/30 13:40:58
nit: don't need this empty line; and alpha-sort th
|
| +$setFunctionName = SetFunctionName; |
| +$installFunctions = InstallFunctions; |
| +$overrideFunction = OverrideFunction; |
| +$installGetter = InstallGetter; |
| +$installConstants = InstallConstants; |
| +$setUpLockedPrototype = SetUpLockedPrototype; |
| +$objectToString = ObjectToString; |
| +$objectHasOwnProperty = ObjectHasOwnProperty; |
| +$objectLookupGetter = ObjectLookupGetter; |
| +$objectLookupSetter = ObjectLookupSetter; |
| +$toNameArray = ToNameArray; |
| +$objectGetOwnPropertyKeys = ObjectGetOwnPropertyKeys; |
| +$objectDefineProperty = ObjectDefineProperty; |
| +$objectDefineProperties = ObjectDefineProperties; |
| +$objectFreeze = ObjectFreezeJS; |
| +$objectIsSealed = ObjectIsSealed; |
| +$objectIsFrozen = ObjectIsFrozen; |
| +$numberIsNaN = NumberIsNaN; |
| +$functionSourceString = FunctionSourceString; |
| +$newFunctionString = NewFunctionString; |
| +$getIterator = GetIterator; |
| +$globalEval = GlobalEval; |
| +$toCompletePropertyDescriptor = ToCompletePropertyDescriptor; |
| +$getMethod = GetMethod; |
| +$objectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor; |
| +$delete = Delete; |
| + |
| +})(); |