diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /js/src/builtin/WeakSet.js | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip |
Add m-esr52 at 52.6.0
Diffstat (limited to 'js/src/builtin/WeakSet.js')
-rw-r--r-- | js/src/builtin/WeakSet.js | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/js/src/builtin/WeakSet.js b/js/src/builtin/WeakSet.js new file mode 100644 index 000000000..eb7c2378f --- /dev/null +++ b/js/src/builtin/WeakSet.js @@ -0,0 +1,108 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// ES2017 draft rev 0e10c9f29fca1385980c08a7d5e7bb3eb775e2e4 +// 23.4.1.1 WeakSet, steps 6-8 +function WeakSetConstructorInit(iterable) { + var set = this; + + // Step 6.a. + var adder = set.add; + + // Step 6.b. + if (!IsCallable(adder)) + ThrowTypeError(JSMSG_NOT_FUNCTION, typeof adder); + + // Step 6.c. + var iterFn = iterable[std_iterator]; + if (!IsCallable(iterFn)) + ThrowTypeError(JSMSG_NOT_ITERABLE, DecompileArg(0, iterable)); + + var iter = callContentFunction(iterFn, iterable); + if (!IsObject(iter)) + ThrowTypeError(JSMSG_NOT_NONNULL_OBJECT, typeof iter); + + // Step 7 (not applicable). + + // Step 8. + while (true) { + // Step 8.a. + var next = callContentFunction(iter.next, iter); + if (!IsObject(next)) + ThrowTypeError(JSMSG_NOT_NONNULL_OBJECT, typeof next); + + // Step 8.b. + if (next.done) + return; + + // Step 8.c. + var nextValue = next.value; + + // Steps 8.d-e. + callContentFunction(adder, set, nextValue); + } +} + +// 23.4.3.1 +function WeakSet_add(value) { + // Steps 1-3. + var S = this; + if (!IsObject(S) || !IsWeakSet(S)) + return callFunction(CallWeakSetMethodIfWrapped, this, value, "WeakSet_add"); + + // Step 4.,6. + let entries = UnsafeGetReservedSlot(this, WEAKSET_MAP_SLOT); + if (!entries) + ThrowTypeError(JSMSG_INCOMPATIBLE_PROTO, "WeakSet", "add", typeof S); + + // Step 5. + if (!IsObject(value)) + ThrowTypeError(JSMSG_NOT_NONNULL_OBJECT, DecompileArg(0, value)); + + // Steps 7-8. + callFunction(std_WeakMap_set, entries, value, true); + + // Step 8. + return S; +} + +// 23.4.3.3 +function WeakSet_delete(value) { + // Steps 1-3. + var S = this; + if (!IsObject(S) || !IsWeakSet(S)) + return callFunction(CallWeakSetMethodIfWrapped, this, value, "WeakSet_delete"); + + // Step 4.,6. + let entries = UnsafeGetReservedSlot(this, WEAKSET_MAP_SLOT); + if (!entries) + ThrowTypeError(JSMSG_INCOMPATIBLE_PROTO, "WeakSet", "delete", typeof S); + + // Step 5. + if (!IsObject(value)) + return false; + + // Steps 7-8. + return callFunction(std_WeakMap_delete, entries, value); +} + +// 23.4.3.4 +function WeakSet_has(value) { + // Steps 1-3. + var S = this; + if (!IsObject(S) || !IsWeakSet(S)) + return callFunction(CallWeakSetMethodIfWrapped, this, value, "WeakSet_has"); + + // Step 4-5. + let entries = UnsafeGetReservedSlot(this, WEAKSET_MAP_SLOT); + if (!entries) + ThrowTypeError(JSMSG_INCOMPATIBLE_PROTO, "WeakSet", "has", typeof S); + + // Step 6. + if (!IsObject(value)) + return false; + + // Steps 7-8. + return callFunction(std_WeakMap_has, entries, value); +} |