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.
		
		
		
		
		
			
		
			
				
					86 lines
				
				2.7 KiB
			
		
		
			
		
	
	
					86 lines
				
				2.7 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | var redefineAll = require('./_redefine-all'); | ||
|  | var getWeak = require('./_meta').getWeak; | ||
|  | var anObject = require('./_an-object'); | ||
|  | var isObject = require('./_is-object'); | ||
|  | var anInstance = require('./_an-instance'); | ||
|  | var forOf = require('./_for-of'); | ||
|  | var createArrayMethod = require('./_array-methods'); | ||
|  | var $has = require('./_has'); | ||
|  | var validate = require('./_validate-collection'); | ||
|  | var arrayFind = createArrayMethod(5); | ||
|  | var arrayFindIndex = createArrayMethod(6); | ||
|  | var id = 0; | ||
|  | 
 | ||
|  | // fallback for uncaught frozen keys
 | ||
|  | var uncaughtFrozenStore = function (that) { | ||
|  |   return that._l || (that._l = new UncaughtFrozenStore()); | ||
|  | }; | ||
|  | var UncaughtFrozenStore = function () { | ||
|  |   this.a = []; | ||
|  | }; | ||
|  | var findUncaughtFrozen = function (store, key) { | ||
|  |   return arrayFind(store.a, function (it) { | ||
|  |     return it[0] === key; | ||
|  |   }); | ||
|  | }; | ||
|  | UncaughtFrozenStore.prototype = { | ||
|  |   get: function (key) { | ||
|  |     var entry = findUncaughtFrozen(this, key); | ||
|  |     if (entry) return entry[1]; | ||
|  |   }, | ||
|  |   has: function (key) { | ||
|  |     return !!findUncaughtFrozen(this, key); | ||
|  |   }, | ||
|  |   set: function (key, value) { | ||
|  |     var entry = findUncaughtFrozen(this, key); | ||
|  |     if (entry) entry[1] = value; | ||
|  |     else this.a.push([key, value]); | ||
|  |   }, | ||
|  |   'delete': function (key) { | ||
|  |     var index = arrayFindIndex(this.a, function (it) { | ||
|  |       return it[0] === key; | ||
|  |     }); | ||
|  |     if (~index) this.a.splice(index, 1); | ||
|  |     return !!~index; | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | module.exports = { | ||
|  |   getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { | ||
|  |     var C = wrapper(function (that, iterable) { | ||
|  |       anInstance(that, C, NAME, '_i'); | ||
|  |       that._t = NAME;      // collection type
 | ||
|  |       that._i = id++;      // collection id
 | ||
|  |       that._l = undefined; // leak store for uncaught frozen objects
 | ||
|  |       if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); | ||
|  |     }); | ||
|  |     redefineAll(C.prototype, { | ||
|  |       // 23.3.3.2 WeakMap.prototype.delete(key)
 | ||
|  |       // 23.4.3.3 WeakSet.prototype.delete(value)
 | ||
|  |       'delete': function (key) { | ||
|  |         if (!isObject(key)) return false; | ||
|  |         var data = getWeak(key); | ||
|  |         if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key); | ||
|  |         return data && $has(data, this._i) && delete data[this._i]; | ||
|  |       }, | ||
|  |       // 23.3.3.4 WeakMap.prototype.has(key)
 | ||
|  |       // 23.4.3.4 WeakSet.prototype.has(value)
 | ||
|  |       has: function has(key) { | ||
|  |         if (!isObject(key)) return false; | ||
|  |         var data = getWeak(key); | ||
|  |         if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key); | ||
|  |         return data && $has(data, this._i); | ||
|  |       } | ||
|  |     }); | ||
|  |     return C; | ||
|  |   }, | ||
|  |   def: function (that, key, value) { | ||
|  |     var data = getWeak(anObject(key), true); | ||
|  |     if (data === true) uncaughtFrozenStore(that).set(key, value); | ||
|  |     else data[that._i] = value; | ||
|  |     return that; | ||
|  |   }, | ||
|  |   ufstore: uncaughtFrozenStore | ||
|  | }; |