diff options
Diffstat (limited to 'js/src/builtin/Object.js')
-rw-r--r-- | js/src/builtin/Object.js | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/js/src/builtin/Object.js b/js/src/builtin/Object.js new file mode 100644 index 000000000..a7440aec7 --- /dev/null +++ b/js/src/builtin/Object.js @@ -0,0 +1,198 @@ +/* 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); +} + +// 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) +} |