| | |
| | | '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; |
| | | // eslint-disable-next-line es/no-object-isextensible -- safe |
| | | var isExtensible = Object.isExtensible; |
| | | var InternalWeakMap; |
| | | |
| | | var wrapper = function (init) { |
| | | return function WeakMap() { |
| | | return init(this, arguments.length ? arguments[0] : undefined); |
| | | }; |
| | | }; |
| | | |
| | | // `WeakMap` constructor |
| | | // https://tc39.es/ecma262/#sec-weakmap-constructor |
| | | var $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak); |
| | | |
| | | // 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.enable(); |
| | | 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; |
| | | } |
| | | }); |
| | | } |
| | | // TODO: Remove this module from `core-js@4` since it's replaced to module below |
| | | require('../modules/es.weak-map.constructor'); |