123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- 'use strict';
- // https://github.com/tc39/proposal-explicit-resource-management
- var $ = require('../internals/export');
- var DESCRIPTORS = require('../internals/descriptors');
- var getBuiltIn = require('../internals/get-built-in');
- var aCallable = require('../internals/a-callable');
- var anInstance = require('../internals/an-instance');
- var defineBuiltIn = require('../internals/define-built-in');
- var defineBuiltIns = require('../internals/define-built-ins');
- var defineBuiltInAccessor = require('../internals/define-built-in-accessor');
- var wellKnownSymbol = require('../internals/well-known-symbol');
- var InternalStateModule = require('../internals/internal-state');
- var addDisposableResource = require('../internals/add-disposable-resource');
- var SuppressedError = getBuiltIn('SuppressedError');
- var $ReferenceError = ReferenceError;
- var DISPOSE = wellKnownSymbol('dispose');
- var TO_STRING_TAG = wellKnownSymbol('toStringTag');
- var DISPOSABLE_STACK = 'DisposableStack';
- var setInternalState = InternalStateModule.set;
- var getDisposableStackInternalState = InternalStateModule.getterFor(DISPOSABLE_STACK);
- var HINT = 'sync-dispose';
- var DISPOSED = 'disposed';
- var PENDING = 'pending';
- var getPendingDisposableStackInternalState = function (stack) {
- var internalState = getDisposableStackInternalState(stack);
- if (internalState.state === DISPOSED) throw new $ReferenceError(DISPOSABLE_STACK + ' already disposed');
- return internalState;
- };
- var $DisposableStack = function DisposableStack() {
- setInternalState(anInstance(this, DisposableStackPrototype), {
- type: DISPOSABLE_STACK,
- state: PENDING,
- stack: []
- });
- if (!DESCRIPTORS) this.disposed = false;
- };
- var DisposableStackPrototype = $DisposableStack.prototype;
- defineBuiltIns(DisposableStackPrototype, {
- dispose: function dispose() {
- var internalState = getDisposableStackInternalState(this);
- if (internalState.state === DISPOSED) return;
- internalState.state = DISPOSED;
- if (!DESCRIPTORS) this.disposed = true;
- var stack = internalState.stack;
- var i = stack.length;
- var thrown = false;
- var suppressed;
- while (i) {
- var disposeMethod = stack[--i];
- stack[i] = null;
- try {
- disposeMethod();
- } catch (errorResult) {
- if (thrown) {
- suppressed = new SuppressedError(errorResult, suppressed);
- } else {
- thrown = true;
- suppressed = errorResult;
- }
- }
- }
- internalState.stack = null;
- if (thrown) throw suppressed;
- },
- use: function use(value) {
- addDisposableResource(getPendingDisposableStackInternalState(this), value, HINT);
- return value;
- },
- adopt: function adopt(value, onDispose) {
- var internalState = getPendingDisposableStackInternalState(this);
- aCallable(onDispose);
- addDisposableResource(internalState, undefined, HINT, function () {
- onDispose(value);
- });
- return value;
- },
- defer: function defer(onDispose) {
- var internalState = getPendingDisposableStackInternalState(this);
- aCallable(onDispose);
- addDisposableResource(internalState, undefined, HINT, onDispose);
- },
- move: function move() {
- var internalState = getPendingDisposableStackInternalState(this);
- var newDisposableStack = new $DisposableStack();
- getDisposableStackInternalState(newDisposableStack).stack = internalState.stack;
- internalState.stack = [];
- internalState.state = DISPOSED;
- if (!DESCRIPTORS) this.disposed = true;
- return newDisposableStack;
- }
- });
- if (DESCRIPTORS) defineBuiltInAccessor(DisposableStackPrototype, 'disposed', {
- configurable: true,
- get: function disposed() {
- return getDisposableStackInternalState(this).state === DISPOSED;
- }
- });
- defineBuiltIn(DisposableStackPrototype, DISPOSE, DisposableStackPrototype.dispose, { name: 'dispose' });
- defineBuiltIn(DisposableStackPrototype, TO_STRING_TAG, DISPOSABLE_STACK, { nonWritable: true });
- $({ global: true, constructor: true }, {
- DisposableStack: $DisposableStack
- });
|