/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // ES6 draft rev36 2015-03-17 19.1.2.1 function ObjectStaticAssign(target, firstSource) { // Steps 1-2. var to = ToObject(target); // Step 3. if (arguments.length < 2) return to; // Steps 4-5. for (var i = 1; i < arguments.length; i++) { // Step 5.a. var nextSource = arguments[i]; if (nextSource === null || nextSource === undefined) continue; // Steps 5.b.i-ii. var from = ToObject(nextSource); // Steps 5.b.iii-iv. var keys = OwnPropertyKeys(from, JSITER_OWNONLY | JSITER_HIDDEN | JSITER_SYMBOLS); // Step 5.c. for (var nextIndex = 0, len = keys.length; nextIndex < len; nextIndex++) { var nextKey = keys[nextIndex]; // Steps 5.c.i-iii. We abbreviate this by calling propertyIsEnumerable // which is faster and returns false for not defined properties. if (callFunction(std_Object_propertyIsEnumerable, from, nextKey)) { // Steps 5.c.iii.1-4. to[nextKey] = from[nextKey]; } } } // Step 6. return to; } // ES stage 4 proposal function ObjectGetOwnPropertyDescriptors(O) { // Step 1. var obj = ToObject(O); // Step 2. var keys = OwnPropertyKeys(obj, JSITER_OWNONLY | JSITER_HIDDEN | JSITER_SYMBOLS); // Step 3. var descriptors = {}; // Step 4. for (var index = 0, len = keys.length; index < len; index++) { var key = keys[index]; // Steps 4.a-b. var desc = std_Object_getOwnPropertyDescriptor(obj, key); // Step 4.c. if (typeof desc !== "undefined") _DefineDataProperty(descriptors, key, desc); } // Step 5. return descriptors; } /* ES6 draft rev 32 (2015 Feb 2) 19.1.2.9. */ function ObjectGetPrototypeOf(obj) { return std_Reflect_getPrototypeOf(ToObject(obj)); } /* ES6 draft rev 32 (2015 Feb 2) 19.1.2.11. */ function ObjectIsExtensible(obj) { return IsObject(obj) && std_Reflect_isExtensible(obj); } /* ES2015 19.1.3.5 Object.prototype.toLocaleString */ function Object_toLocaleString() { // Step 1. var O = this; // Step 2. return callContentFunction(O.toString, O); } // ES 2017 draft bb96899bb0d9ef9be08164a26efae2ee5f25e875 19.1.3.7 function Object_valueOf() { // Step 1. return ToObject(this); } // ES7 draft (2016 March 8) B.2.2.3 function ObjectDefineSetter(name, setter) { // Step 1. var object = ToObject(this); // Step 2. if (!IsCallable(setter)) ThrowTypeError(JSMSG_BAD_GETTER_OR_SETTER, "setter"); // Step 3. var desc = { __proto__: null, enumerable: true, configurable: true, set: setter }; // Step 4. var key = ToPropertyKey(name); // Step 5. std_Object_defineProperty(object, key, desc); // Step 6. (implicit) } // ES7 draft (2016 March 8) B.2.2.2 function ObjectDefineGetter(name, getter) { // Step 1. var object = ToObject(this); // Step 2. if (!IsCallable(getter)) ThrowTypeError(JSMSG_BAD_GETTER_OR_SETTER, "getter"); // Step 3. var desc = { __proto__: null, enumerable: true, configurable: true, get: getter }; // Step 4. var key = ToPropertyKey(name); // Step 5. std_Object_defineProperty(object, key, desc); // Step 6. (implicit) } // ES7 draft (2016 March 8) B.2.2.5 function ObjectLookupSetter(name) { // Step 1. var object = ToObject(this); // Step 2. var key = ToPropertyKey(name) do { // Step 3.a. var desc = std_Object_getOwnPropertyDescriptor(object, key); // Step 3.b. if (desc) { // Step.b.i. if (callFunction(std_Object_hasOwnProperty, desc, "set")) return desc.set; // Step.b.ii. return undefined; } // Step 3.c. object = std_Reflect_getPrototypeOf(object); } while (object !== null); // Step 3.d. (implicit) } // ES7 draft (2016 March 8) B.2.2.4 function ObjectLookupGetter(name) { // Step 1. var object = ToObject(this); // Step 2. var key = ToPropertyKey(name) do { // Step 3.a. var desc = std_Object_getOwnPropertyDescriptor(object, key); // Step 3.b. if (desc) { // Step.b.i. if (callFunction(std_Object_hasOwnProperty, desc, "get")) return desc.get; // Step.b.ii. return undefined; } // Step 3.c. object = std_Reflect_getPrototypeOf(object); } while (object !== null); // Step 3.d. (implicit) } // Stage 4 draft 2020-09-06 https://tc39.github.io/proposal-object-from-entries/ // Object.fromEntries (iterable) function ObjectFromEntries(iter) { // We omit the usual step number comments here because they don't help. // This implementation inlines AddEntriesFromIterator and // CreateDataPropertyOnObject, so it looks more like the polyfill // than the step-by-step spec algorithm. const obj = {}; for (const pair of allowContentIter(iter)) { if (!IsObject(pair)) ThrowTypeError(JSMSG_INVALID_MAP_ITERABLE, "Object.fromEntries"); _DefineDataProperty(obj, pair[0], pair[1]); } return obj; } // Proposal https://github.com/tc39/proposal-accessible-object-hasownproperty // Object.hasOwn (Object, Property) function ObjectHasOwn(O, P) { // Step 1. var obj = ToObject(O); // Step 2-3. return callFunction(std_Object_hasOwnProperty, obj, P); }