From 27798588959a9e824a9d8a0bc1397d80c17b81bc Mon Sep 17 00:00:00 2001 From: Fedor Date: Fri, 2 Oct 2020 10:34:21 +0300 Subject: [PATCH] Implement object.fromEntries(). --- js/src/builtin/Object.cpp | 1 + js/src/builtin/Object.js | 18 ++++++++++++++++++ js/xpconnect/tests/chrome/test_xrayToJS.xul | 4 ++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/js/src/builtin/Object.cpp b/js/src/builtin/Object.cpp index bfcc8d20e..d3001b69e 100644 --- a/js/src/builtin/Object.cpp +++ b/js/src/builtin/Object.cpp @@ -1239,6 +1239,7 @@ static const JSFunctionSpec object_static_methods[] = { JS_FN("isFrozen", obj_isFrozen, 1, 0), JS_FN("seal", obj_seal, 1, 0), JS_FN("isSealed", obj_isSealed, 1, 0), + JS_SELF_HOSTED_FN("fromEntries", "ObjectFromEntries", 1, 0), JS_FS_END }; diff --git a/js/src/builtin/Object.js b/js/src/builtin/Object.js index 9ed1be0e1..c4739037e 100644 --- a/js/src/builtin/Object.js +++ b/js/src/builtin/Object.js @@ -202,3 +202,21 @@ function ObjectLookupGetter(name) { // 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; +} diff --git a/js/xpconnect/tests/chrome/test_xrayToJS.xul b/js/xpconnect/tests/chrome/test_xrayToJS.xul index 38f3f447d..d1cc3e26c 100644 --- a/js/xpconnect/tests/chrome/test_xrayToJS.xul +++ b/js/xpconnect/tests/chrome/test_xrayToJS.xul @@ -190,9 +190,9 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=933681 constructorProps(["setPrototypeOf", "getOwnPropertyDescriptor", "getOwnPropertyDescriptors", "keys", "is", "defineProperty", "defineProperties", "create", "getOwnPropertyNames", "getOwnPropertySymbols", - "preventExtensions", "freeze", "isFrozen", "seal", + "preventExtensions", "freeze", "fromEntries", "isFrozen", "seal", "isSealed", "assign", "getPrototypeOf", "values", - "entries", "isExtensible"]) + "entries", "isExtensible"]); gPrototypeProperties['Array'] = ["length", "toSource", "toString", "toLocaleString", "join", "reverse", "sort", "push", "pop", "shift", "unshift", "splice", "concat", "slice", "lastIndexOf", "indexOf",