1 | 'use strict';
|
2 | var global = require('../internals/global');
|
3 | var redefineAll = require('../internals/redefine-all');
|
4 | var InternalMetadataModule = require('../internals/internal-metadata');
|
5 | var collection = require('../internals/collection');
|
6 | var collectionWeak = require('../internals/collection-weak');
|
7 | var isObject = require('../internals/is-object');
|
8 | var enforceIternalState = require('../internals/internal-state').enforce;
|
9 | var NATIVE_WEAK_MAP = require('../internals/native-weak-map');
|
10 |
|
11 | var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;
|
12 | var isExtensible = Object.isExtensible;
|
13 | var InternalWeakMap;
|
14 |
|
15 | var wrapper = function (get) {
|
16 | return function WeakMap() {
|
17 | return get(this, arguments.length ? arguments[0] : undefined);
|
18 | };
|
19 | };
|
20 |
|
21 | // `WeakMap` constructor
|
22 | // https://tc39.github.io/ecma262/#sec-weakmap-constructor
|
23 | var $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak, true, true);
|
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
|
28 | if (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 | }
|