2 var global = require('../internals/global');
3 var uncurryThis = require('../internals/function-uncurry-this');
4 var redefineAll = require('../internals/redefine-all');
5 var InternalMetadataModule = require('../internals/internal-metadata');
6 var collection = require('../internals/collection');
7 var collectionWeak = require('../internals/collection-weak');
8 var isObject = require('../internals/is-object');
9 var isExtensible = require('../internals/object-is-extensible');
10 var enforceIternalState = require('../internals/internal-state').enforce;
11 var NATIVE_WEAK_MAP = require('../internals/native-weak-map');
13 var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;
16 var wrapper = function (init) {
17 return function WeakMap() {
18 return init(this, arguments.length ? arguments[0] : undefined);
22 // `WeakMap` constructor
23 // https://tc39.es/ecma262/#sec-weakmap-constructor
24 var $WeakMap = collection('WeakMap', wrapper, collectionWeak);
26 // IE11 WeakMap frozen keys fix
27 // We can't use feature detection because it crash some old IE builds
28 // https://github.com/zloirock/core-js/issues/485
29 if (NATIVE_WEAK_MAP && IS_IE11) {
30 InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);
31 InternalMetadataModule.enable();
32 var WeakMapPrototype = $WeakMap.prototype;
33 var nativeDelete = uncurryThis(WeakMapPrototype['delete']);
34 var nativeHas = uncurryThis(WeakMapPrototype.has);
35 var nativeGet = uncurryThis(WeakMapPrototype.get);
36 var nativeSet = uncurryThis(WeakMapPrototype.set);
37 redefineAll(WeakMapPrototype, {
38 'delete': function (key) {
39 if (isObject(key) && !isExtensible(key)) {
40 var state = enforceIternalState(this);
41 if (!state.frozen) state.frozen = new InternalWeakMap();
42 return nativeDelete(this, key) || state.frozen['delete'](key);
43 } return nativeDelete(this, key);
45 has: function has(key) {
46 if (isObject(key) && !isExtensible(key)) {
47 var state = enforceIternalState(this);
48 if (!state.frozen) state.frozen = new InternalWeakMap();
49 return nativeHas(this, key) || state.frozen.has(key);
50 } return nativeHas(this, key);
52 get: function get(key) {
53 if (isObject(key) && !isExtensible(key)) {
54 var state = enforceIternalState(this);
55 if (!state.frozen) state.frozen = new InternalWeakMap();
56 return nativeHas(this, key) ? nativeGet(this, key) : state.frozen.get(key);
57 } return nativeGet(this, key);
59 set: function set(key, value) {
60 if (isObject(key) && !isExtensible(key)) {
61 var state = enforceIternalState(this);
62 if (!state.frozen) state.frozen = new InternalWeakMap();
63 nativeHas(this, key) ? nativeSet(this, key, value) : state.frozen.set(key, value);
64 } else nativeSet(this, key, value);