You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
2.0 KiB
56 lines
2.0 KiB
'use strict'; |
|
|
|
var $TypeError = require('es-errors/type'); |
|
|
|
var CompletionRecord = require('es-abstract/2025/CompletionRecord'); |
|
var CreateIteratorResultObject = require('es-abstract/2025/CreateIteratorResultObject'); |
|
var GeneratorValidate = require('es-abstract/2025/GeneratorValidate'); |
|
|
|
var SLOT = require('internal-slot'); |
|
|
|
// https://tc39.es/ecma262/#sec-generatorresumeabrupt |
|
|
|
module.exports = function GeneratorResumeAbrupt(generator, abruptCompletion, generatorBrand) { |
|
if ( |
|
!(abruptCompletion instanceof CompletionRecord) |
|
|| (abruptCompletion.type() !== 'return' && abruptCompletion.type() !== 'throw') |
|
) { |
|
throw new $TypeError('Assertion failed: abruptCompletion must be a `return` or `throw` Completion Record'); |
|
} |
|
|
|
var state = GeneratorValidate(generator, generatorBrand); // step 1 |
|
|
|
if (state === 'SUSPENDED-START') { // step 2 |
|
SLOT.set(generator, '[[GeneratorState]]', 'COMPLETED'); // step 2.a |
|
SLOT.set(generator, '[[GeneratorContext]]', null); // step 2.b |
|
state = 'COMPLETED'; // step 2.c |
|
} |
|
|
|
var value = abruptCompletion.value(); |
|
|
|
if (state === 'COMPLETED') { // step 3 |
|
if (abruptCompletion.type() === 'return') { // step 3.a |
|
return CreateIteratorResultObject(value, true); // step 3.a.i |
|
} |
|
return abruptCompletion['?'](); // step 3.b - throw |
|
} |
|
|
|
if (state !== 'SUSPENDED-YIELD') { |
|
throw new $TypeError('Assertion failed: generator state is unexpected: ' + state); // step 4 |
|
} |
|
|
|
var genContext = SLOT.get(generator, '[[GeneratorContext]]'); // step 5 |
|
|
|
SLOT.set(generator, '[[GeneratorState]]', 'EXECUTING'); // step 8 |
|
|
|
if (abruptCompletion.type() === 'return') { |
|
// due to representing `GeneratorContext` as a function, we can't safely re-invoke it, so we can't support sending it a return completion |
|
SLOT.get(generator, '[[CloseIfAbrupt]]')(abruptCompletion); |
|
SLOT.set(generator, '[[GeneratorState]]', 'COMPLETED'); // step 10 |
|
return CreateIteratorResultObject(value, true); |
|
} |
|
|
|
var result = genContext(value); // steps 6-7, 9-11 |
|
|
|
return result; // step 12 |
|
};
|
|
|