-
-
Notifications
You must be signed in to change notification settings - Fork 31.7k
module: refactor to use iterable-weak-map #35915
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
414ea74
3ca2431
9d5d45d
e156fa1
5a80dfd
46e0bba
6434455
0b30bc2
e994511
f1d088a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
'use strict'; | ||
|
||
const { | ||
makeSafe, | ||
Object, | ||
SafeSet, | ||
SafeWeakMap, | ||
SymbolIterator, | ||
} = primordials; | ||
|
||
// TODO(aduh95): Add FinalizationRegistry to primordials | ||
const SafeFinalizationRegistry = makeSafe( | ||
globalThis.FinalizationRegistry, | ||
class SafeFinalizationRegistry extends globalThis.FinalizationRegistry {} | ||
); | ||
|
||
// TODO(aduh95): Add WeakRef to primordials | ||
const SafeWeakRef = makeSafe( | ||
globalThis.WeakRef, | ||
class SafeWeakRef extends globalThis.WeakRef {} | ||
); | ||
|
||
// This class is modified from the example code in the WeakRefs specification: | ||
// https://github.com/tc39/proposal-weakrefs | ||
// Licensed under ECMA's MIT-style license, see: | ||
// https://github.com/tc39/ecma262/blob/master/LICENSE.md | ||
class IterableWeakMap { | ||
#weakMap = new SafeWeakMap(); | ||
#refSet = new SafeSet(); | ||
#finalizationGroup = new SafeFinalizationRegistry(cleanup); | ||
|
||
set(key, value) { | ||
const entry = this.#weakMap.get(key); | ||
if (entry) { | ||
// If there's already an entry for the object represented by "key", | ||
// the value can be updated without creating a new WeakRef: | ||
this.#weakMap.set(key, { value, ref: entry.ref }); | ||
} else { | ||
const ref = new SafeWeakRef(key); | ||
this.#weakMap.set(key, { value, ref }); | ||
this.#refSet.add(ref); | ||
this.#finalizationGroup.register(key, { | ||
set: this.#refSet, | ||
ref | ||
}, ref); | ||
} | ||
} | ||
|
||
get(key) { | ||
return this.#weakMap.get(key)?.value; | ||
} | ||
|
||
has(key) { | ||
return this.#weakMap.has(key); | ||
} | ||
|
||
delete(key) { | ||
const entry = this.#weakMap.get(key); | ||
if (!entry) { | ||
return false; | ||
} | ||
this.#weakMap.delete(key); | ||
this.#refSet.delete(entry.ref); | ||
this.#finalizationGroup.unregister(entry.ref); | ||
return true; | ||
} | ||
|
||
*[SymbolIterator]() { | ||
for (const ref of this.#refSet) { | ||
const key = ref.deref(); | ||
if (!key) continue; | ||
const { value } = this.#weakMap.get(key); | ||
yield value; | ||
} | ||
} | ||
} | ||
|
||
function cleanup({ set, ref }) { | ||
set.delete(ref); | ||
} | ||
|
||
Object.freeze(IterableWeakMap.prototype); | ||
|
||
module.exports = { | ||
IterableWeakMap, | ||
}; |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
enum ATrue { | ||
IsTrue = 1, | ||
IsFalse = 0 | ||
} | ||
|
||
if (false) { | ||
console.info('unreachable') | ||
} else if (true) { | ||
throw Error('throw early') | ||
} else { | ||
console.info('unreachable') | ||
} |
Uh oh!
There was an error while loading. Please reload this page.