// Copyright 2012 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. (function(global, utils) { %CheckIsBootstrapping(); // ---------------------------------------------------------------------------- // Imports var GlobalNumber = global.Number; var GlobalObject = global.Object; var iteratorSymbol = utils.ImportNow("iterator_symbol"); var NaN = %GetRootNaN(); var ObjectToString = utils.ImportNow("object_to_string"); // ---------------------------------------------------------------------------- // Set up global object. var attributes = DONT_ENUM | DONT_DELETE | READ_ONLY; utils.InstallConstants(global, [ // ES6 18.1.1 "Infinity", INFINITY, // ES6 18.1.2 "NaN", NaN, // ES6 18.1.3 "undefined", UNDEFINED, ]); // ---------------------------------------------------------------------------- // Object // ES6 19.1.3.5 Object.prototype.toLocaleString([reserved1 [,reserved2]]) function ObjectToLocaleString() { CHECK_OBJECT_COERCIBLE(this, "Object.prototype.toLocaleString"); return this.toString(); } // ES6 19.1.3.7 Object.prototype.valueOf() function ObjectValueOf() { return TO_OBJECT(this); } // ES6 19.1.3.3 Object.prototype.isPrototypeOf(V) function ObjectIsPrototypeOf(V) { if (!IS_RECEIVER(V)) return false; var O = TO_OBJECT(this); return %HasInPrototypeChain(V, O); } // ES6 7.3.9 function GetMethod(obj, p) { var func = obj[p]; if (IS_NULL_OR_UNDEFINED(func)) return UNDEFINED; if (IS_CALLABLE(func)) return func; throw %make_type_error(kCalledNonCallable, typeof func); } // ES6 19.1.1.1 function ObjectConstructor(x) { if (GlobalObject != new.target && !IS_UNDEFINED(new.target)) { return this; } if (IS_NULL(x) || IS_UNDEFINED(x)) return {}; return TO_OBJECT(x); } // ---------------------------------------------------------------------------- // Object %SetNativeFlag(GlobalObject); %SetCode(GlobalObject, ObjectConstructor); %AddNamedProperty(GlobalObject.prototype, "constructor", GlobalObject, DONT_ENUM); // Set up non-enumerable functions on the Object.prototype object. utils.InstallFunctions(GlobalObject.prototype, DONT_ENUM, [ "toString", ObjectToString, "toLocaleString", ObjectToLocaleString, "valueOf", ObjectValueOf, "isPrototypeOf", ObjectIsPrototypeOf, // propertyIsEnumerable is added in bootstrapper.cc. // __defineGetter__ is added in bootstrapper.cc. // __lookupGetter__ is added in bootstrapper.cc. // __defineSetter__ is added in bootstrapper.cc. // __lookupSetter__ is added in bootstrapper.cc. ]); // ---------------------------------------------------------------------------- // Number utils.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", 9007199254740991, "MIN_SAFE_INTEGER", -9007199254740991, "EPSILON", 2.220446049250313e-16, ]); // ---------------------------------------------------------------------------- // Iterator related spec functions. // ES6 7.4.1 GetIterator(obj, method) function GetIterator(obj, method) { if (IS_UNDEFINED(method)) { method = obj[iteratorSymbol]; } if (!IS_CALLABLE(method)) { throw %make_type_error(kNotIterable, obj); } var iterator = %_Call(method, obj); if (!IS_RECEIVER(iterator)) { throw %make_type_error(kNotAnIterator, iterator); } return iterator; } // ---------------------------------------------------------------------------- // Exports utils.Export(function(to) { to.GetIterator = GetIterator; to.GetMethod = GetMethod; to.ObjectHasOwnProperty = GlobalObject.prototype.hasOwnProperty; }); %InstallToContext([ "object_value_of", ObjectValueOf, ]); })