| '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 | 
| }); |