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.
		
		
		
		
		
			
		
			
				
					61 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					61 lines
				
				2.0 KiB
			| 
											3 years ago
										 | '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); | ||
|  |     }); | ||
|  |   }); | ||
|  | } |