2 var redefineAll = require('./_redefine-all')
3 , getWeak = require('./_meta').getWeak
4 , anObject = require('./_an-object')
5 , isObject = require('./_is-object')
6 , anInstance = require('./_an-instance')
7 , forOf = require('./_for-of')
8 , createArrayMethod = require('./_array-methods')
9 , $has = require('./_has')
10 , arrayFind = createArrayMethod(5)
11 , arrayFindIndex = createArrayMethod(6)
14 // fallback for uncaught frozen keys
15 var uncaughtFrozenStore = function(that){
16 return that._l || (that._l = new UncaughtFrozenStore);
18 var UncaughtFrozenStore = function(){
21 var findUncaughtFrozen = function(store, key){
22 return arrayFind(store.a, function(it){
26 UncaughtFrozenStore.prototype = {
28 var entry = findUncaughtFrozen(this, key);
29 if(entry)return entry[1];
32 return !!findUncaughtFrozen(this, key);
34 set: function(key, value){
35 var entry = findUncaughtFrozen(this, key);
36 if(entry)entry[1] = value;
37 else this.a.push([key, value]);
39 'delete': function(key){
40 var index = arrayFindIndex(this.a, function(it){
43 if(~index)this.a.splice(index, 1);
49 getConstructor: function(wrapper, NAME, IS_MAP, ADDER){
50 var C = wrapper(function(that, iterable){
51 anInstance(that, C, NAME, '_i');
52 that._i = id++; // collection id
53 that._l = undefined; // leak store for uncaught frozen objects
54 if(iterable != undefined)forOf(iterable, IS_MAP, that[ADDER], that);
56 redefineAll(C.prototype, {
57 // 23.3.3.2 WeakMap.prototype.delete(key)
58 // 23.4.3.3 WeakSet.prototype.delete(value)
59 'delete': function(key){
60 if(!isObject(key))return false;
61 var data = getWeak(key);
62 if(data === true)return uncaughtFrozenStore(this)['delete'](key);
63 return data && $has(data, this._i) && delete data[this._i];
65 // 23.3.3.4 WeakMap.prototype.has(key)
66 // 23.4.3.4 WeakSet.prototype.has(value)
67 has: function has(key){
68 if(!isObject(key))return false;
69 var data = getWeak(key);
70 if(data === true)return uncaughtFrozenStore(this).has(key);
71 return data && $has(data, this._i);
76 def: function(that, key, value){
77 var data = getWeak(anObject(key), true);
78 if(data === true)uncaughtFrozenStore(that).set(key, value);
79 else data[that._i] = value;
82 ufstore: uncaughtFrozenStore