summaryrefslogtreecommitdiffstats
path: root/js/src/builtin/Object.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/builtin/Object.js')
-rw-r--r--js/src/builtin/Object.js198
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)
+}