Add Promise/*/resolve-not-callable-close.js

This commit is contained in:
Marja Hölttä 2020-04-28 10:27:53 +02:00 committed by Rick Waldron
parent 6a18c27ca1
commit 58dba42939
4 changed files with 182 additions and 0 deletions

View File

@ -0,0 +1,47 @@
// Copyright (C) 2020 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: >
Explicit iterator closing if Promise.resolve is not callable
esid: sec-promise.all
info: |
5. Let result be PerformPromiseAll(iteratorRecord, C, promiseCapability).
6. If result is an abrupt completion,
a. If iteratorRecord.[[Done]] is false, let result be
IteratorClose(iterator, result).
b. IfAbruptRejectPromise(result, promiseCapability).
[...]
Runtime Semantics: PerformPromiseAll
[...]
5. Let promiseResolve be ? Get(constructor, "resolve").
6. If ! IsCallable(promiseResolve) is false, throw a TypeError exception.
[...]
flags: [async]
features: [Symbol.iterator, computed-property-names]
---*/
let returnCount = 0;
const iter = { 
[Symbol.iterator]: function() {
return {
return: function() {
returnCount += 1;
}
};
}
}
Promise.resolve = "certainly not callable";
Promise.all(iter).then(() => {
$DONE('The promise should be rejected, but was resolved');
}, (reason) => {
assert(reason instanceof TypeError);
}).then($DONE, $DONE);
assert.sameValue(returnCount, 1);

View File

@ -0,0 +1,44 @@
// Copyright (C) 2020 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: >
Explicit iterator closing if Promise.resolve is not callable
esid: sec-promise.allsettled
info: |
5. Let result be PerformPromiseAllSettled(iteratorRecord, C, promiseCapability).
6. If result is an abrupt completion, then
a. If iteratorRecord.[[Done]] is false, set result to IteratorClose(iteratorRecord, result).
b. IfAbruptRejectPromise(result, promiseCapability).
Runtime Semantics: PerformPromiseAllSettled
[...]
5. Let promiseResolve be ? Get(constructor, "resolve").
6. If IsCallable(promiseResolve) is false, throw a TypeError exception.
[...]
flags: [async]
features: [Promise.allSettled, Symbol.iterator, computed-property-names]
---*/
let returnCount = 0;
const iter = { 
[Symbol.iterator]: function() {
return {
return: function() {
returnCount += 1;
}
};
}
}
Promise.resolve = "certainly not callable";
Promise.allSettled(iter).then(() => {
$DONE('The promise should be rejected, but was resolved');
}, (reason) => {
assert(reason instanceof TypeError);
}).then($DONE, $DONE);
assert.sameValue(returnCount, 1);

View File

@ -0,0 +1,44 @@
// Copyright (C) 2019 Leo Balter, 2020 Rick Waldron. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: >
Explicit iterator closing if Promise.resolve is not callable
esid: sec-promise.any
info: |
5. Let result be PerformPromiseAny(iteratorRecord, C, promiseCapability).
6. If result is an abrupt completion, then
a. If iteratorRecord.[[Done]] is false, set result to IteratorClose(iteratorRecord, result).
b. IfAbruptRejectPromise(result, promiseCapability).
Runtime Semantics: PerformPromiseAny
[...]
5. Let promiseResolve be ? Get(constructor, "resolve").
6. If ! IsCallable(promiseResolve) is false, throw a TypeError exception.
[...]
flags: [async]
features: [Promise.any, Symbol.iterator, computed-property-names]
---*/
let returnCount = 0;
const iter = { 
[Symbol.iterator]: function() {
return {
return: function() {
returnCount += 1;
}
};
}
}
Promise.resolve = "certainly not callable";
Promise.any(iter).then(() => {
$DONE('The promise should be rejected, but was resolved');
}, (reason) => {
assert(reason instanceof TypeError);
}).then($DONE, $DONE);
assert.sameValue(returnCount, 1);

View File

@ -0,0 +1,47 @@
// Copyright (C) 2020 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: >
Explicit iterator closing if Promise.resolve is not callable
esid: sec-promise.race
info: |
[...]
5. Let result be PerformPromiseRace(iteratorRecord, promiseCapability, C).
6. If result is an abrupt completion, then
a. If iteratorRecord.[[Done]] is false, let result be
IteratorClose(iterator,result).
b. IfAbruptRejectPromise(result, promiseCapability).
Runtime Semantics: PerformPromiseRace
[...]
3. Let promiseResolve be ? Get(constructor, "resolve").
4. If ! IsCallable(promiseResolve) is false, throw a TypeError exception.
[...]
flags: [async]
features: [Symbol.iterator, computed-property-names]
---*/
let returnCount = 0;
const iter = { 
[Symbol.iterator]: function() {
return {
return: function() {
returnCount += 1;
}
};
}
}
Promise.resolve = "certainly not callable";
Promise.race(iter).then(() => {
$DONE('The promise should be rejected, but was resolved');
}, (reason) => {
assert(reason instanceof TypeError);
}).then($DONE, $DONE);
assert.sameValue(returnCount, 1);