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