Last active
April 15, 2019 18:41
-
-
Save mhofman/c35078324ad088ac3dfeeefa70751b34 to your computer and use it in GitHub Desktop.
V8 while await loop scope optimization issue. See https://bugs.chromium.org/p/v8/issues/detail?id=9101
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function makeObserver(): [Promise<boolean>, FinalizationGroup<any>] { | |
let resolve: (collected: boolean) => void; | |
const collected = new Promise<boolean>(r => (resolve = r)); | |
const finalizationGroup = new FinalizationGroup<any>(items => { | |
// Let's be nice and cleanup | |
[...items]; | |
resolve(true); | |
}); | |
return [collected, finalizationGroup]; | |
} | |
async function gcOf_fail(target?: object): Promise<boolean> { | |
const [collected, finalizationGroup] = makeObserver(); | |
finalizationGroup.register(target || {}, 0); | |
target = undefined; | |
let result: boolean | undefined; | |
while (true) { | |
result = await Promise.race([ | |
collected, | |
new Promise<undefined>(resolve => setTimeout(resolve, 0)) | |
]); | |
if (result !== undefined) break; | |
gc(); | |
} | |
return result; | |
} | |
async function gcOf_success(target?: object): Promise<boolean> { | |
const [collected, finalizationGroup] = makeObserver(); | |
finalizationGroup.register(target || {}, 0); | |
target = undefined; | |
let result: boolean | undefined; | |
while ( | |
(result = await Promise.race([ | |
collected, | |
new Promise<undefined>(resolve => setTimeout(resolve, 0)) | |
])) === undefined | |
) { | |
gc(); | |
} | |
return result; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function makeObserver(): [{ collected: boolean }, FinalizationGroup<any>] { | |
let token = { collected: false }; | |
const finalizationGroup = new FinalizationGroup<any>(items => { | |
// Let's be nice and cleanup | |
[...items]; | |
token.collected = true; | |
}); | |
return [token, finalizationGroup]; | |
} | |
async function gcOf_fail(target?: object): Promise<boolean> { | |
const [token, finalizationGroup] = makeObserver(); | |
finalizationGroup.register(target || {}, 0); | |
target = undefined; | |
while (!token.collected) { | |
await new Promise<undefined>(resolve => setTimeout(resolve, 0)); | |
gc(); | |
} | |
return token.collected; | |
} | |
async function gcOf_success(target?: object): Promise<boolean> { | |
const [token, finalizationGroup] = makeObserver(); | |
finalizationGroup.register(target || {}, 0); | |
target = undefined; | |
while ((await new Promise(resolve => setTimeout(resolve, 0)), !token.collected)) { | |
gc(); | |
} | |
return token.collected; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment