You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.8 KiB
68 lines
2.8 KiB
'use strict'; |
|
var global = require('../internals/global'); |
|
var uncurryThis = require('../internals/function-uncurry-this'); |
|
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 isExtensible = require('../internals/object-is-extensible'); |
|
var enforceInternalState = require('../internals/internal-state').enforce; |
|
var NATIVE_WEAK_MAP = require('../internals/native-weak-map'); |
|
|
|
var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global; |
|
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 = 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 = uncurryThis(WeakMapPrototype['delete']); |
|
var nativeHas = uncurryThis(WeakMapPrototype.has); |
|
var nativeGet = uncurryThis(WeakMapPrototype.get); |
|
var nativeSet = uncurryThis(WeakMapPrototype.set); |
|
redefineAll(WeakMapPrototype, { |
|
'delete': function (key) { |
|
if (isObject(key) && !isExtensible(key)) { |
|
var state = enforceInternalState(this); |
|
if (!state.frozen) state.frozen = new InternalWeakMap(); |
|
return nativeDelete(this, key) || state.frozen['delete'](key); |
|
} return nativeDelete(this, key); |
|
}, |
|
has: function has(key) { |
|
if (isObject(key) && !isExtensible(key)) { |
|
var state = enforceInternalState(this); |
|
if (!state.frozen) state.frozen = new InternalWeakMap(); |
|
return nativeHas(this, key) || state.frozen.has(key); |
|
} return nativeHas(this, key); |
|
}, |
|
get: function get(key) { |
|
if (isObject(key) && !isExtensible(key)) { |
|
var state = enforceInternalState(this); |
|
if (!state.frozen) state.frozen = new InternalWeakMap(); |
|
return nativeHas(this, key) ? nativeGet(this, key) : state.frozen.get(key); |
|
} return nativeGet(this, key); |
|
}, |
|
set: function set(key, value) { |
|
if (isObject(key) && !isExtensible(key)) { |
|
var state = enforceInternalState(this); |
|
if (!state.frozen) state.frozen = new InternalWeakMap(); |
|
nativeHas(this, key) ? nativeSet(this, key, value) : state.frozen.set(key, value); |
|
} else nativeSet(this, key, value); |
|
return this; |
|
} |
|
}); |
|
}
|
|
|