UNPKG

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