| 'use strict'; |
| var global = require('../internals/global'); |
| var redefineAll = require('../internals/redefine-all'); |
| var InternalMetadataModule = require('../internals/internal-metadata'); |
| var collection = require('../internals/collection'); |
| var collectionWeak = require('../internals/collection-weak'); |
| var isObject = require('../internals/is-object'); |
| var enforceIternalState = require('../internals/internal-state').enforce; |
| var NATIVE_WEAK_MAP = require('../internals/native-weak-map'); |
| |
| var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global; |
| var isExtensible = Object.isExtensible; |
| var InternalWeakMap; |
| |
| var wrapper = function (get) { |
| return function WeakMap() { |
| return get(this, arguments.length ? arguments[0] : undefined); |
| }; |
| }; |
| |
| // `WeakMap` constructor |
| // https://tc39.github.io/ecma262/#sec-weakmap-constructor |
| var $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak, true, true); |
| |
| // IE11 WeakMap frozen keys fix |
| // We can't use feature detection because it crash some old IE builds |
| // https://github.com/zloirock/core-js/issues/485 |
| if (NATIVE_WEAK_MAP && IS_IE11) { |
| InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true); |
| InternalMetadataModule.REQUIRED = true; |
| var WeakMapPrototype = $WeakMap.prototype; |
| var nativeDelete = WeakMapPrototype['delete']; |
| var nativeHas = WeakMapPrototype.has; |
| var nativeGet = WeakMapPrototype.get; |
| var nativeSet = WeakMapPrototype.set; |
| redefineAll(WeakMapPrototype, { |
| 'delete': function (key) { |
| if (isObject(key) && !isExtensible(key)) { |
| var state = enforceIternalState(this); |
| if (!state.frozen) state.frozen = new InternalWeakMap(); |
| return nativeDelete.call(this, key) || state.frozen['delete'](key); |
| } return nativeDelete.call(this, key); |
| }, |
| has: function has(key) { |
| if (isObject(key) && !isExtensible(key)) { |
| var state = enforceIternalState(this); |
| if (!state.frozen) state.frozen = new InternalWeakMap(); |
| return nativeHas.call(this, key) || state.frozen.has(key); |
| } return nativeHas.call(this, key); |
| }, |
| get: function get(key) { |
| if (isObject(key) && !isExtensible(key)) { |
| var state = enforceIternalState(this); |
| if (!state.frozen) state.frozen = new InternalWeakMap(); |
| return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key); |
| } return nativeGet.call(this, key); |
| }, |
| set: function set(key, value) { |
| if (isObject(key) && !isExtensible(key)) { |
| var state = enforceIternalState(this); |
| if (!state.frozen) state.frozen = new InternalWeakMap(); |
| nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value); |
| } else nativeSet.call(this, key, value); |
| return this; |
| } |
| }); |
| } |