fix arguments length in %AsyncFromSyncIterator% methods callbacks

This commit is contained in:
Denis Pushkarev
2026-02-16 18:28:16 +02:00
parent ce4fc47ab1
commit 73d331a96d
3 changed files with 53 additions and 6 deletions
@@ -41,27 +41,30 @@ var AsyncFromSyncIterator = function AsyncIterator(iteratorRecord) {
AsyncFromSyncIterator.prototype = defineBuiltIns(create(AsyncIteratorPrototype), {
next: function next() {
var state = getInternalState(this);
var value = arguments.length > 0 ? arguments[0] : undefined;
var hasValue = arguments.length > 0;
var value = hasValue ? arguments[0] : undefined;
return new Promise(function (resolve, reject) {
var result = anObject(call(state.next, state.iterator, value));
var result = anObject(hasValue ? call(state.next, state.iterator, value) : call(state.next, state.iterator));
asyncFromSyncIteratorContinuation(result, resolve, reject, state.iterator, true);
});
},
'return': function () {
var state = getInternalState(this);
var iterator = state.iterator;
var value = arguments.length > 0 ? arguments[0] : undefined;
var hasValue = arguments.length > 0;
var value = hasValue ? arguments[0] : undefined;
return new Promise(function (resolve, reject) {
var $return = getMethod(iterator, 'return');
if ($return === undefined) return resolve(createIterResultObject(value, true));
var result = anObject(call($return, iterator, value));
var result = anObject(hasValue ? call($return, iterator, value) : call($return, iterator));
asyncFromSyncIteratorContinuation(result, resolve, reject, iterator);
});
},
'throw': function () {
var state = getInternalState(this);
var iterator = state.iterator;
var value = arguments.length > 0 ? arguments[0] : undefined;
var hasValue = arguments.length > 0;
var value = hasValue ? arguments[0] : undefined;
return new Promise(function (resolve, reject) {
var $throw = getMethod(iterator, 'throw');
if ($throw === undefined) {
@@ -72,7 +75,7 @@ AsyncFromSyncIterator.prototype = defineBuiltIns(create(AsyncIteratorPrototype),
}
return reject(new TypeError('The iterator does not provide a throw method'));
}
var result = anObject(call($throw, iterator, value));
var result = anObject(hasValue ? call($throw, iterator, value) : call($throw, iterator));
asyncFromSyncIteratorContinuation(result, resolve, reject, iterator, true);
});
}
@@ -32,6 +32,28 @@ QUnit.test('AsyncIterator#take', assert => {
});
});
QUnit.test('AsyncIterator#take, return() does not pass extra argument', assert => {
assert.expect(2);
const async = assert.async();
let returnArgs;
const iter = {
i: 0,
next() { return { value: ++this.i, done: false }; },
return(...args) { returnArgs = args; return { value: undefined, done: true }; },
[Symbol.iterator]() { return this; },
};
AsyncIterator.from(iter).take(1).toArray().then(() => {
assert.same(returnArgs.length, 0, 'return() called with no arguments');
assert.true(true, 'take completes successfully');
async();
}).catch(() => {
assert.avoid();
async();
});
});
QUnit.test('AsyncIterator#take, return() result validated as object', assert => {
assert.expect(1);
const async = assert.async();
@@ -33,6 +33,28 @@ QUnit.test('AsyncIterator#take', assert => {
});
});
QUnit.test('AsyncIterator#take, return() does not pass extra argument', assert => {
assert.expect(2);
const async = assert.async();
let returnArgs;
const iter = {
i: 0,
next() { return { value: ++this.i, done: false }; },
return(...args) { returnArgs = args; return { value: undefined, done: true }; },
[Symbol.iterator]() { return this; },
};
AsyncIterator.from(iter).take(1).toArray().then(() => {
assert.same(returnArgs.length, 0, 'return() called with no arguments');
assert.true(true, 'take completes successfully');
async();
}).catch(() => {
assert.avoid();
async();
});
});
QUnit.test('AsyncIterator#take, return() result validated as object', assert => {
assert.expect(1);
const async = assert.async();