12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- 'use strict';
- var global = require('./_global');
- var each = require('./_array-methods')(0);
- var redefine = require('./_redefine');
- var meta = require('./_meta');
- var assign = require('./_object-assign');
- var weak = require('./_collection-weak');
- var isObject = require('./_is-object');
- var validate = require('./_validate-collection');
- var NATIVE_WEAK_MAP = require('./_validate-collection');
- var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;
- var WEAK_MAP = 'WeakMap';
- var getWeak = meta.getWeak;
- var isExtensible = Object.isExtensible;
- var uncaughtFrozenStore = weak.ufstore;
- var InternalMap;
- var wrapper = function (get) {
- return function WeakMap() {
- return get(this, arguments.length > 0 ? arguments[0] : undefined);
- };
- };
- var methods = {
- // 23.3.3.3 WeakMap.prototype.get(key)
- get: function get(key) {
- if (isObject(key)) {
- var data = getWeak(key);
- if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);
- return data ? data[this._i] : undefined;
- }
- },
- // 23.3.3.5 WeakMap.prototype.set(key, value)
- set: function set(key, value) {
- return weak.def(validate(this, WEAK_MAP), key, value);
- }
- };
- // 23.3 WeakMap Objects
- var $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);
- // IE11 WeakMap frozen keys fix
- if (NATIVE_WEAK_MAP && IS_IE11) {
- InternalMap = weak.getConstructor(wrapper, WEAK_MAP);
- assign(InternalMap.prototype, methods);
- meta.NEED = true;
- each(['delete', 'has', 'get', 'set'], function (key) {
- var proto = $WeakMap.prototype;
- var method = proto[key];
- redefine(proto, key, function (a, b) {
- // store frozen objects on internal weakmap shim
- if (isObject(a) && !isExtensible(a)) {
- if (!this._f) this._f = new InternalMap();
- var result = this._f[key](a, b);
- return key == 'set' ? this : result;
- // store all the rest on native weakmap
- } return method.call(this, a, b);
- });
- });
- }
|