prepack
Version:
Execute a JS bundle, serialize global state and side effects to a snapshot that can be quickly restored.
301 lines (195 loc) • 11 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.GetIterator = GetIterator;
exports.IteratorStep = IteratorStep;
exports.IteratorValue = IteratorValue;
exports.IteratorComplete = IteratorComplete;
exports.IteratorNext = IteratorNext;
exports.CreateListIterator = CreateListIterator;
exports.CreateMapIterator = CreateMapIterator;
exports.CreateSetIterator = CreateSetIterator;
exports.IteratorClose = IteratorClose;
exports.IterableToList = IterableToList;
var _completions = require("../completions.js");
var _index = require("../values/index.js");
var _index2 = require("./index.js");
var _invariant = _interopRequireDefault(require("../invariant.js"));
var _abstract = require("./abstract.js");
var _singletons = require("../singletons.js");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Copyright (c) 2017-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
/* strict-local */
// ECMA262 7.4.1
function GetIterator(realm, obj = realm.intrinsics.undefined, _method) {
let method = _method; // 1. If method was not passed, then
if (!method) {
// a. Let method be ? GetMethod(obj, @@iterator).
method = (0, _index2.GetMethod)(realm, obj, realm.intrinsics.SymbolIterator);
} // 2. Let iterator be ? Call(method, obj).
let iterator = (0, _index2.Call)(realm, method, obj); // 3. If Type(iterator) is not Object, throw a TypeError exception.
if (!(iterator instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 4. Return iterator.
return iterator;
} // ECMA262 7.4.5
function IteratorStep(realm, iterator) {
// 1. Let result be ? IteratorNext(iterator).
let result = IteratorNext(realm, iterator); // 2. Let done be ? IteratorComplete(result).
let done = IteratorComplete(realm, result); // 3. If done is true, return false.
if (done) return false; // 4. Return result.
return result;
} // ECMA262 7.4.4
function IteratorValue(realm, iterResult) {
// 1. Assert: Type(iterResult) is Object.
(0, _invariant.default)(iterResult instanceof _index.ObjectValue, "expected obj"); // 2. Return ? Get(iterResult, "value").
return (0, _index2.Get)(realm, iterResult, "value");
} // ECMA262 7.4.2
function IteratorComplete(realm, iterResult) {
// 1. Assert: Type(iterResult) is Object.
(0, _invariant.default)(iterResult instanceof _index.ObjectValue, "expected obj"); // 2. Return ToBoolean(? Get(iterResult, "done")).
return _singletons.To.ToBooleanPartial(realm, (0, _index2.Get)(realm, iterResult, "done"));
} // ECMA262 7.4.2
function IteratorNext(realm, iterator, value) {
// 1. If value was not passed, then
let result;
if (!value) {
// a. Let result be ? Invoke(iterator, "next", « »).
result = (0, _index2.Invoke)(realm, iterator, "next", []);
} else {
// 2. Else,
// a. Let result be ? Invoke(iterator, "next", « value »).
result = (0, _index2.Invoke)(realm, iterator, "next", [value]);
} // 3. If Type(result) is not Object, throw a TypeError exception.
if (!(result instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 4. Return result.
return result;
} // ECMA262 7.4.8
function CreateListIterator(realm, list) {
// 1. Let iterator be ObjectCreate(%IteratorPrototype%, « [[IteratorNext]], [[IteratedList]], [[ListIteratorNextIndex]] »).
let iterator = _singletons.Create.ObjectCreate(realm, realm.intrinsics.IteratorPrototype, {
$IteratorNext: undefined,
$IteratedList: undefined,
$ListIteratorNextIndex: undefined
}); // 2. Set iterator's [[IteratedList]] internal slot to list.
iterator.$IteratedList = list; // 3. Set iterator's [[ListIteratorNextIndex]] internal slot to 0.
iterator.$ListIteratorNextIndex = 0; // 4. Let next be a new built-in function object as defined in ListIterator next (7.4.8.1).
let next = ListIterator_next(realm); // 5. Set iterator's [[IteratorNext]] internal slot to next.
iterator.$IteratorNext = next; // 6. Perform CreateMethodProperty(iterator, "next", next).
_singletons.Create.CreateMethodProperty(realm, iterator, new _index.StringValue(realm, "next"), next); // 7. Return iterator.
return iterator;
} // ECMA262 7.4.8.1
function ListIterator_next(realm) {
let func = new _index.NativeFunctionValue(realm, undefined, "next", 0, context => {
(0, _invariant.default)(context instanceof _index.ObjectValue); // 1. Let O be the this value.
let O = context; // 2. Let f be the active function object.
let f = func; // 3. If O does not have a [[IteratorNext]] internal slot, throw a TypeError exception.
if (!O.$IteratorNext) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "O does not have an [[IteratorNext]] internal slot");
} // 4. Let next be the value of the [[IteratorNext]] internal slot of O.
let next = O.$IteratorNext; // 5. If SameValue(f, next) is false, throw a TypeError exception.
if (!(0, _abstract.SameValue)(realm, f, next)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 6. If O does not have an [[IteratedList]] internal slot, throw a TypeError exception.
if (!O.$IteratedList) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "O does not have an [[IteratedList]] internal slot");
} // 7. Let list be the value of the [[IteratedList]] internal slot of O.
let list = O.$IteratedList;
(0, _invariant.default)(typeof O.$ListIteratorNextIndex === "number"); // 8. Let index be the value of the [[ListIteratorNextIndex]] internal slot of O.
// Default to 0 for Flow.
let index = O.$ListIteratorNextIndex; // 9. Let len be the number of elements of list.
let len = list.length; // 10. If index ≥ len, then
if (index >= len) {
// a. Return CreateIterResultObject(undefined, true).
return _singletons.Create.CreateIterResultObject(realm, realm.intrinsics.undefined, true);
} // 11. Set the value of the [[ListIteratorNextIndex]] internal slot of O to index+1.
O.$ListIteratorNextIndex = index + 1; // 12. Return CreateIterResultObject(list[index], false).
return _singletons.Create.CreateIterResultObject(realm, list[index], false);
});
return func;
} // ECMA262 23.1.5.1
function CreateMapIterator(realm, map, kind) {
// 1. If Type(map) is not Object, throw a TypeError exception.
if (!(map instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 2. If map does not have a [[MapData]] internal slot, throw a TypeError exception.
if (!map.$MapData) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 3. Let iterator be ObjectCreate(%MapIteratorPrototype%, « [[Map]], [[MapNextIndex]], [[MapIterationKind]] »).
let iterator = _singletons.Create.ObjectCreate(realm, realm.intrinsics.MapIteratorPrototype, {
$Map: undefined,
$MapNextIndex: undefined,
$MapIterationKind: undefined
}); // 4. Set iterator's [[Map]] internal slot to map.
iterator.$Map = map; // 5. Set iterator's [[MapNextIndex]] internal slot to 0.
iterator.$MapNextIndex = new _index.NumberValue(realm, 0); // 6. Set iterator's [[MapIterationKind]] internal slot to kind.
iterator.$MapIterationKind = kind; // 7. Return iterator.
return iterator;
} // ECMA262 23.2.5.1
function CreateSetIterator(realm, set, kind) {
// 1. If Type(set) is not Object, throw a TypeError exception.
if (!(set instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 2. If set does not have a [[SetData]] internal slot, throw a TypeError exception.
if (!set.$SetData) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 3. Let iterator be ObjectCreate(%SetIteratorPrototype%, « [[IteratedSet]], [[SetNextIndex]], [[SetIterationKind]] »).
let iterator = _singletons.Create.ObjectCreate(realm, realm.intrinsics.SetIteratorPrototype, {
$IteratedSet: undefined,
$SetNextIndex: undefined,
$SetIterationKind: undefined
}); // 4. Set iterator's [[IteratedSet]] internal slot to set.
iterator.$IteratedSet = set; // 5. Set iterator's [[SetNextIndex]] internal slot to 0.
iterator.$SetNextIndex = 0; // 6. Set iterator's [[SetIterationKind]] internal slot to kind.
iterator.$SetIterationKind = kind; // 7. Return iterator.
return iterator;
} // ECMA262 7.4.6
function IteratorClose(realm, iterator, completion) {
// 1. Assert: Type(iterator) is Object.
(0, _invariant.default)(iterator instanceof _index.ObjectValue, "expected object"); // 2. Assert: completion is a Completion Record.
(0, _invariant.default)(completion instanceof _completions.Completion, "expected completion record"); // 3. Let return be ? GetMethod(iterator, "return").
let ret = (0, _index2.GetMethod)(realm, iterator, "return"); // 4. If return is undefined, return Completion(completion).
if (ret instanceof _index.UndefinedValue) return completion; // 5. Let innerResult be Call(return, iterator, « »).
let innerResult;
try {
innerResult = (0, _index2.Call)(realm, ret.throwIfNotConcrete(), iterator, []);
} catch (error) {
if (error instanceof _completions.AbruptCompletion) {
innerResult = error;
} else {
throw error;
}
} // 6. If completion.[[Type]] is throw, return Completion(completion).
if (completion instanceof _completions.ThrowCompletion) return completion; // 7. If innerResult.[[Type]] is throw, return Completion(innerResult).
if (innerResult instanceof _completions.ThrowCompletion) return innerResult; // 8. If Type(innerResult.[[Value]]) is not Object, throw a TypeError exception.
if (!(innerResult instanceof _index.ObjectValue)) {
return realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 9. Return Completion(completion).
return completion;
} // ECMA262 22.2.2.1.1
function IterableToList(realm, items, method) {
// 1. Let iterator be ? GetIterator(items, method).
let iterator = GetIterator(realm, items, method); // 2. Let values be a new empty List.
let values = []; // 3. Let next be true.
let next = true; // 4. Repeat, while next is not false
while (next !== false) {
// a. Let next be ? IteratorStep(iterator).
next = IteratorStep(realm, iterator); // b. If next is not false, then
if (next !== false) {
// i. Let nextValue be ? IteratorValue(next).
let nextValue = IteratorValue(realm, next); // ii. Append nextValue to the end of the List values.
values.push(nextValue);
}
} // 5. Return values.
return values;
}
//# sourceMappingURL=iterator.js.map