mirror of https://github.com/tc39/test262.git
Update tests now that FinalizationGroup.prototype.cleanupSome throws if cleanup is currently in progress. (#2434)
This behaviour was changed in: https://github.com/tc39/proposal-weakrefs/pull/158
This commit is contained in:
parent
09380a4ae4
commit
f7ad2953ed
55
test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-throws-in-callback.js
vendored
Normal file
55
test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-throws-in-callback.js
vendored
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-properties-of-the-finalization-group-constructor
|
||||||
|
description: >
|
||||||
|
The cleanupSome() method throws if cleanup is currently in progress.
|
||||||
|
info: |
|
||||||
|
FinalizationGroup.prototype.cleanupSome ( [ callback ] )
|
||||||
|
|
||||||
|
1. Let finalizationGroup be the this value.
|
||||||
|
...
|
||||||
|
4. If finalizationGroup.[[IsFinalizationGroupCleanupJobActive]] is true,
|
||||||
|
throw a TypeError exception.
|
||||||
|
|
||||||
|
features: [FinalizationGroup, host-gc-required]
|
||||||
|
includes: [async-gc.js]
|
||||||
|
flags: [async, non-deterministic]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var called = 0;
|
||||||
|
var endOfCall = 0;
|
||||||
|
var fg = new FinalizationGroup(function() {});
|
||||||
|
|
||||||
|
function callback(iterator) {
|
||||||
|
called += 1;
|
||||||
|
|
||||||
|
if (called === 1) {
|
||||||
|
// Atempt to re-enter the callback.
|
||||||
|
var nestedCallbackRan = false;
|
||||||
|
assert.throws(TypeError, () => {
|
||||||
|
fg.cleanupSome(() => { nestedCallbackRan = true });
|
||||||
|
});
|
||||||
|
assert.sameValue(nestedCallbackRan, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
endOfCall += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function emptyCells() {
|
||||||
|
var o1 = {};
|
||||||
|
fg.register(o1, 'holdings 1');
|
||||||
|
|
||||||
|
var prom = asyncGC(o1);
|
||||||
|
o1 = null;
|
||||||
|
|
||||||
|
return prom;
|
||||||
|
}
|
||||||
|
|
||||||
|
emptyCells().then(function() {
|
||||||
|
fg.cleanupSome(callback);
|
||||||
|
|
||||||
|
assert.sameValue(called, 1, 'callback was called');
|
||||||
|
assert.sameValue(endOfCall, 1, 'callback finished');
|
||||||
|
}).then($DONE, resolveAsyncGC);
|
|
@ -1,106 +0,0 @@
|
||||||
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
|
||||||
|
|
||||||
/*---
|
|
||||||
esid: sec-properties-of-the-finalization-group-constructor
|
|
||||||
description: >
|
|
||||||
The callback iterator is dynamic. Therefore, it can be emptied before iteration
|
|
||||||
info: |
|
|
||||||
FinalizationGroup.prototype.cleanupSome ( [ callback ] )
|
|
||||||
|
|
||||||
1. Let finalizationGroup be the this value.
|
|
||||||
...
|
|
||||||
5. Perform ! CleanupFinalizationGroup(finalizationGroup, callback).
|
|
||||||
...
|
|
||||||
|
|
||||||
CleanupFinalizationGroup ( finalizationGroup [ , callback ] )
|
|
||||||
|
|
||||||
...
|
|
||||||
3. Let iterator be ! CreateFinalizationGroupCleanupIterator(finalizationGroup).
|
|
||||||
...
|
|
||||||
6. Let result be Call(callback, undefined, « iterator »).
|
|
||||||
...
|
|
||||||
|
|
||||||
%FinalizationGroupCleanupIteratorPrototype%.next ( )
|
|
||||||
|
|
||||||
8. If finalizationGroup.[[Cells]] contains a Record cell such that cell.[[Target]] is empty,
|
|
||||||
a. Choose any such cell.
|
|
||||||
b. Remove cell from finalizationGroup.[[Cells]].
|
|
||||||
c. Return CreateIterResultObject(cell.[[Holdings]], false).
|
|
||||||
9. Otherwise, return CreateIterResultObject(undefined, true).
|
|
||||||
features: [FinalizationGroup, host-gc-required, Symbol]
|
|
||||||
includes: [async-gc.js]
|
|
||||||
flags: [async, non-deterministic]
|
|
||||||
---*/
|
|
||||||
|
|
||||||
var called = 0;
|
|
||||||
var endOfCall = 0;
|
|
||||||
var first, second, third;
|
|
||||||
var firstIter, secondIter, thirdIter;
|
|
||||||
var fg = new FinalizationGroup(function() {});
|
|
||||||
|
|
||||||
function callback(iterator) {
|
|
||||||
called += 1;
|
|
||||||
|
|
||||||
if (called === 1) {
|
|
||||||
|
|
||||||
// Inception!
|
|
||||||
fg.cleanupSome(callback);
|
|
||||||
|
|
||||||
first = iterator.next();
|
|
||||||
firstIter = iterator;
|
|
||||||
} else if (called === 2) {
|
|
||||||
|
|
||||||
// Double Inception!
|
|
||||||
fg.cleanupSome(callback);
|
|
||||||
|
|
||||||
second = iterator.next();
|
|
||||||
secondIter = iterator;
|
|
||||||
} else if (called === 3) {
|
|
||||||
|
|
||||||
// Triple Inception!
|
|
||||||
// But this time we won't try to consume iterator anymore, leave it alone there.
|
|
||||||
fg.cleanupSome(callback);
|
|
||||||
|
|
||||||
third = iterator.next();
|
|
||||||
thirdIter = iterator;
|
|
||||||
}
|
|
||||||
|
|
||||||
endOfCall += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
function emptyCells() {
|
|
||||||
var o1 = {};
|
|
||||||
var o2 = {};
|
|
||||||
fg.register(o1, 'holdings 1');
|
|
||||||
fg.register(o2, 'holdings 2');
|
|
||||||
|
|
||||||
var prom = asyncGC(o1, o2);
|
|
||||||
o1 = null;
|
|
||||||
o2 = null;
|
|
||||||
|
|
||||||
return prom;
|
|
||||||
}
|
|
||||||
|
|
||||||
emptyCells().then(function() {
|
|
||||||
fg.cleanupSome(callback);
|
|
||||||
|
|
||||||
// Make sure everything is set
|
|
||||||
assert.sameValue(called, 4, 'cleanup successfully');
|
|
||||||
assert.sameValue(endOfCall, 4, 'cleanup ended successfully');
|
|
||||||
|
|
||||||
assert.notSameValue(firstIter, secondIter, 'callback is not called with the same iterator #1');
|
|
||||||
assert.notSameValue(firstIter, thirdIter, 'callback is not called with the same iterator #2');
|
|
||||||
assert.notSameValue(secondIter, thirdIter, 'callback is not called with the same iterator #3');
|
|
||||||
|
|
||||||
assert.sameValue(first.value, undefined, 'iterator is already consumed');
|
|
||||||
assert.sameValue(first.done, true, 'first callback will find no empty Targets');
|
|
||||||
assert.sameValue(second.done, false, 'second callback will find an empty Target');
|
|
||||||
assert.sameValue(third.done, false, 'third callback will find an empty Target');
|
|
||||||
|
|
||||||
// 8.a. Choose any such cell.
|
|
||||||
var holdings = [second.value, third.value];
|
|
||||||
|
|
||||||
assert(holdings.includes('holdings 1'), 'iterators consume emptied cells #1');
|
|
||||||
assert(holdings.includes('holdings 2'), 'iterators consume emptied cells #2');
|
|
||||||
}).then($DONE, resolveAsyncGC);
|
|
Loading…
Reference in New Issue