| '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); |
| }); |
| }); |
| } |