Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| skip-if: !getBuildConfiguration("explicit-resource-management"); --enable-explicit-resource-management
load(libdir + "asserts.js");
{
const disposed = [];
const stack = new DisposableStack();
stack.use({
[Symbol.dispose]() {
disposed.push(1);
},
});
stack.adopt(2, (v) => disposed.push(v));
stack.defer(() => disposed.push(3));
assertEq(stack.disposed, false);
const newStack = stack.move();
assertEq(stack.disposed, true);
assertThrowsInstanceOf(() => stack.use({
[Symbol.dispose]() {
disposed.push(4);
},
}), ReferenceError);
assertEq(newStack.disposed, false);
stack.dispose();
assertArrayEq(disposed, []);
assertEq(newStack.disposed, false);
newStack.dispose();
assertArrayEq(disposed, [3, 2, 1]);
assertEq(newStack.disposed, true);
}
{
const disposed = [];
function createScopeSharedResources() {
const stack = new DisposableStack();
stack.use({
[Symbol.dispose]() {
disposed.push(1);
},
});
stack.adopt(2, (v) => disposed.push(v));
stack.defer(() => disposed.push(3));
return () => {
using stk = stack.move();
assertEq(stack.disposed, true);
assertEq(stk.disposed, false);
stk.adopt(4, (v) => disposed.push(v));
}
}
const disposeScopeSharedResources = createScopeSharedResources();
assertArrayEq(disposed, []);
disposeScopeSharedResources();
assertArrayEq(disposed, [4, 3, 2, 1]);
}
{
const stk = new DisposableStack();
stk.defer(() => {});
const newStack = stk.move();
assertEq(newStack === stk, false);
}
{
const disposed = [];
assertThrowsInstanceOf(() => {
const stk = new DisposableStack();
stk.defer(() => disposed.push(1));
stk.dispose();
const newStack = stk.move();
}, ReferenceError);
}