2 var uncurryThis = require('../internals/function-uncurry-this');
3 var redefineAll = require('../internals/redefine-all');
4 var getWeakData = require('../internals/internal-metadata').getWeakData;
5 var anObject = require('../internals/an-object');
6 var isObject = require('../internals/is-object');
7 var anInstance = require('../internals/an-instance');
8 var iterate = require('../internals/iterate');
9 var ArrayIterationModule = require('../internals/array-iteration');
10 var hasOwn = require('../internals/has-own-property');
11 var InternalStateModule = require('../internals/internal-state');
13 var setInternalState = InternalStateModule.set;
14 var internalStateGetterFor = InternalStateModule.getterFor;
15 var find = ArrayIterationModule.find;
16 var findIndex = ArrayIterationModule.findIndex;
17 var splice = uncurryThis([].splice);
20 // fallback for uncaught frozen keys
21 var uncaughtFrozenStore = function (store) {
22 return store.frozen || (store.frozen = new UncaughtFrozenStore());
25 var UncaughtFrozenStore = function () {
29 var findUncaughtFrozen = function (store, key) {
30 return find(store.entries, function (it) {
35 UncaughtFrozenStore.prototype = {
37 var entry = findUncaughtFrozen(this, key);
38 if (entry) return entry[1];
41 return !!findUncaughtFrozen(this, key);
43 set: function (key, value) {
44 var entry = findUncaughtFrozen(this, key);
45 if (entry) entry[1] = value;
46 else this.entries.push([key, value]);
48 'delete': function (key) {
49 var index = findIndex(this.entries, function (it) {
52 if (~index) splice(this.entries, index, 1);
58 getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {
59 var Constructor = wrapper(function (that, iterable) {
60 anInstance(that, Prototype);
61 setInternalState(that, {
62 type: CONSTRUCTOR_NAME,
66 if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
69 var Prototype = Constructor.prototype;
71 var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);
73 var define = function (that, key, value) {
74 var state = getInternalState(that);
75 var data = getWeakData(anObject(key), true);
76 if (data === true) uncaughtFrozenStore(state).set(key, value);
77 else data[state.id] = value;
81 redefineAll(Prototype, {
82 // `{ WeakMap, WeakSet }.prototype.delete(key)` methods
83 // https://tc39.es/ecma262/#sec-weakmap.prototype.delete
84 // https://tc39.es/ecma262/#sec-weakset.prototype.delete
85 'delete': function (key) {
86 var state = getInternalState(this);
87 if (!isObject(key)) return false;
88 var data = getWeakData(key);
89 if (data === true) return uncaughtFrozenStore(state)['delete'](key);
90 return data && hasOwn(data, state.id) && delete data[state.id];
92 // `{ WeakMap, WeakSet }.prototype.has(key)` methods
93 // https://tc39.es/ecma262/#sec-weakmap.prototype.has
94 // https://tc39.es/ecma262/#sec-weakset.prototype.has
95 has: function has(key) {
96 var state = getInternalState(this);
97 if (!isObject(key)) return false;
98 var data = getWeakData(key);
99 if (data === true) return uncaughtFrozenStore(state).has(key);
100 return data && hasOwn(data, state.id);
104 redefineAll(Prototype, IS_MAP ? {
105 // `WeakMap.prototype.get(key)` method
106 // https://tc39.es/ecma262/#sec-weakmap.prototype.get
107 get: function get(key) {
108 var state = getInternalState(this);
110 var data = getWeakData(key);
111 if (data === true) return uncaughtFrozenStore(state).get(key);
112 return data ? data[state.id] : undefined;
115 // `WeakMap.prototype.set(key, value)` method
116 // https://tc39.es/ecma262/#sec-weakmap.prototype.set
117 set: function set(key, value) {
118 return define(this, key, value);
121 // `WeakSet.prototype.add(value)` method
122 // https://tc39.es/ecma262/#sec-weakset.prototype.add
123 add: function add(value) {
124 return define(this, value, true);