source: frontend/node_modules/es-abstract/2025/CreateIteratorFromClosure.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 13 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 2.0 KB
RevLine 
[9af201e]1'use strict';
2
3var $TypeError = require('es-errors/type');
4
5var GeneratorStart = require('./GeneratorStart');
6var IsArray = require('./IsArray');
7var IsCallable = require('./IsCallable');
8var OrdinaryObjectCreate = require('./OrdinaryObjectCreate');
9
10var every = require('../helpers/every');
11
12var SLOT = require('internal-slot');
13var safeConcat = require('safe-array-concat');
14var isObject = require('es-object-atoms/isObject');
15
16var isString = function isString(slot) {
17 return typeof slot === 'string';
18};
19
20// https://262.ecma-international.org/16.0/#sec-createiteratorfromclosure
21
22module.exports = function CreateIteratorFromClosure(closure, generatorBrand, generatorPrototype) {
23 if (!IsCallable(closure)) {
24 throw new $TypeError('`closure` must be a function');
25 }
26 if (typeof generatorBrand !== 'string') {
27 throw new $TypeError('`generatorBrand` must be a string');
28 }
29 if (!isObject(generatorPrototype)) {
30 throw new $TypeError('`generatorPrototype` must be an object');
31 }
32 var extraSlots = arguments.length > 3 ? arguments[3] : []; // step 2
33 if (arguments.length > 3) {
34 if (!IsArray(extraSlots) || !every(extraSlots, isString)) {
35 throw new $TypeError('`extraSlots` must be a List of String internal slot names');
36 }
37 }
38 var internalSlotsList = safeConcat(extraSlots, ['[[GeneratorContext]]', '[[GeneratorBrand]]', '[[GeneratorState]]']); // step 3
39 var generator = OrdinaryObjectCreate(generatorPrototype, internalSlotsList); // steps 4, 6
40 SLOT.set(generator, '[[GeneratorBrand]]', generatorBrand); // step 5
41 SLOT.set(generator, '[[GeneratorState]]', 'SUSPENDED-START'); // step 6
42
43 SLOT.assert(closure, '[[Sentinel]]'); // our userland slot
44 SLOT.set(generator, '[[Sentinel]]', SLOT.get(closure, '[[Sentinel]]')); // our userland slot
45 SLOT.assert(closure, '[[CloseIfAbrupt]]'); // our second userland slot
46 SLOT.set(generator, '[[CloseIfAbrupt]]', SLOT.get(closure, '[[CloseIfAbrupt]]')); // our second userland slot
47
48 GeneratorStart(generator, closure); // step 14
49
50 return generator; // step 16
51};
Note: See TracBrowser for help on using the repository browser.