From 4bf3ce8dcb4f2c6172c663cb1a636fedf6f6470c Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Tue, 18 Jul 2023 09:49:03 -0700 Subject: [PATCH] [patch] remove GetKeysIterator and its callable check See https://github.com/tc39/proposal-set-methods/pull/101 --- .eslintrc | 3 +-- aos/GetIteratorFromMethod.js | 25 +++++++++++++++++++++++++ aos/GetKeysIterator.js | 31 ------------------------------- implementation.js | 4 ++-- 4 files changed, 28 insertions(+), 35 deletions(-) create mode 100644 aos/GetIteratorFromMethod.js delete mode 100644 aos/GetKeysIterator.js diff --git a/.eslintrc b/.eslintrc index bc620e0..b1aab10 100644 --- a/.eslintrc +++ b/.eslintrc @@ -10,7 +10,7 @@ "RequireObjectCoercible", "GetIntrinsic", "GetSetRecord", - "GetKeysIterator", + "GetIteratorFromMethod", "IteratorStep", "IteratorValue", "SetDataHas", @@ -21,7 +21,6 @@ "Get", "ToNumber", "Type", - // GetKeysIterator "Type", "Call", "Get", diff --git a/aos/GetIteratorFromMethod.js b/aos/GetIteratorFromMethod.js new file mode 100644 index 0000000..f6337fb --- /dev/null +++ b/aos/GetIteratorFromMethod.js @@ -0,0 +1,25 @@ +'use strict'; + +var GetIntrinsic = require('get-intrinsic'); + +var $TypeError = GetIntrinsic('%TypeError%'); + +var Call = require('es-abstract/2023/Call'); +var Get = require('es-abstract/2023/Get'); +var Type = require('es-abstract/2023/Type'); + +// https://tc39.es/ecma262/#sec-getiteratorfrommethod + +module.exports = function GetIteratorFromMethod(obj, method) { + var iterator = Call(method, obj); // step 1 + + if (Type(iterator) !== 'Object') { + throw new $TypeError('iterator must return an object'); // step 2 + } + + var nextMethod = Get(iterator, 'next'); // step 3 + + var iteratorRecord = { '[[Iterator]]': iterator, '[[NextMethod]]': nextMethod, '[[Done]]': false }; // step 4 + + return iteratorRecord; // step 5 +}; diff --git a/aos/GetKeysIterator.js b/aos/GetKeysIterator.js deleted file mode 100644 index 8f146f1..0000000 --- a/aos/GetKeysIterator.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -var GetIntrinsic = require('get-intrinsic'); - -var $TypeError = GetIntrinsic('%TypeError%'); - -var Call = require('es-abstract/2022/Call'); -var Get = require('es-abstract/2022/Get'); -var IsCallable = require('es-abstract/2022/IsCallable'); -var Type = require('es-abstract/2022/Type'); - -// var assertRecord = require('es-abstract/helpers/assertRecord'); - -module.exports = function GetKeysIterator(setRec) { - // assertRecord(setRec, 'Set'); - if (Type(setRec) !== 'Object' || !('[[Set]]' in setRec) || !('[[Size]]' in setRec) || !('[[Has]]' in setRec) || !('[[Keys]]' in setRec)) { - throw new $TypeError('`setRec` must be a Set Record'); - } - - var keysIter = Call(setRec['[[Keys]]'], setRec['[[Set]]']); // step 1 - if (Type(keysIter) !== 'Object') { - throw new $TypeError('obj is not an Object'); // step 2 - } - - var nextMethod = Get(keysIter, 'next'); // step 3 - if (!IsCallable(nextMethod)) { - throw new $TypeError('`next` is not a function'); // step 4 - } - - return { '[[Iterator]]': keysIter, '[[NextMethod]]': nextMethod, '[[Done]]': false }; // step 5 -}; diff --git a/implementation.js b/implementation.js index 6b8163a..f43d192 100644 --- a/implementation.js +++ b/implementation.js @@ -6,7 +6,7 @@ var $TypeError = GetIntrinsic('%TypeError%'); var $Set = require('es-set/polyfill')(); -var GetKeysIterator = require('./aos/GetKeysIterator'); +var GetIteratorFromMethod = require('./aos/GetIteratorFromMethod'); var GetSetRecord = require('./aos/GetSetRecord'); var IteratorStep = require('es-abstract/2023/IteratorStep'); var IteratorValue = require('es-abstract/2023/IteratorValue'); @@ -28,7 +28,7 @@ module.exports = function union(other) { var otherRec = GetSetRecord(other); // step 3 - var keysIter = GetKeysIterator(otherRec); // step 4 + var keysIter = GetIteratorFromMethod(otherRec['[[Set]]'], otherRec['[[Keys]]']); // step 4 // 5. Let resultSetData be a copy of O.[[SetData]]; // step 5 var result = new $Set();