Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 064f2d4d90abd572fe29f12254d95b58e8b43a65
https://github.com/WebKit/WebKit/commit/064f2d4d90abd572fe29f12254d95b58e8b43a65
Author: Sosuke Suzuki <[email protected]>
Date: 2026-03-18 (Wed, 18 Mar 2026)
Changed paths:
A JSTests/stress/async-disposable-stack-adopt-awaits-result.js
A JSTests/stress/async-disposable-stack-use-null-await.js
A
JSTests/stress/asynciterator-prototype-symbol-async-dispose-return-argument.js
A JSTests/stress/asynciterator-prototype-symbol-async-dispose-return-null.js
A JSTests/stress/iterator-prototype-symbol-dispose-return-null.js
M Source/JavaScriptCore/builtins/AsyncDisposableStackPrototype.js
M Source/JavaScriptCore/builtins/AsyncIteratorPrototype.js
M Source/JavaScriptCore/builtins/DisposableStackPrototype.js
M Source/JavaScriptCore/builtins/JSIteratorPrototype.js
Log Message:
-----------
[JSC] Fix spec conformance bugs in Explicit Resource Management builtins
https://bugs.webkit.org/show_bug.cgi?id=310091
Reviewed by Yusuke Suzuki.
Fixes in the runtime builtins (syntax implementation is unaffected):
1. AsyncDisposableStack.prototype.adopt: the closure discarded the
onDisposeAsync return value, so disposeAsync never awaited it.
2. %IteratorPrototype%[@@dispose] / %AsyncIteratorPrototype%[@@asyncDispose]:
GetMethod treats null as undefined; `return: null` should be a no-op.
3. %AsyncIteratorPrototype%[@@asyncDispose]: spec passes undefined as the
sole argument to return (step 6.a).
4. AsyncDisposableStack.prototype.use(null): AddDisposableResource step 1.a
only short-circuits for sync-dispose. The disposeAsync loop now handles
method=undefined resources per DisposeResources steps 3.f and 6.
5. AsyncDisposableStack.prototype.use was calling the DisposableStack
internal-field intrinsic; worked by coincidence (same enum offset).
Tests: JSTests/stress/async-disposable-stack-adopt-awaits-result.js
JSTests/stress/async-disposable-stack-use-null-await.js
JSTests/stress/asynciterator-prototype-symbol-async-dispose-return-argument.js
JSTests/stress/asynciterator-prototype-symbol-async-dispose-return-null.js
JSTests/stress/iterator-prototype-symbol-dispose-return-null.js
* JSTests/stress/async-disposable-stack-adopt-awaits-result.js: Added.
(shouldBe):
(const.slow.Promise.resolve.then):
(then):
(shouldBe.events.join):
* JSTests/stress/async-disposable-stack-use-null-await.js: Added.
(shouldBe):
(probe):
(const.empty.probe):
*
JSTests/stress/asynciterator-prototype-symbol-async-dispose-return-argument.js:
Added.
(shouldBe):
(async ag):
(const.AsyncIteratorPrototype.Object.getPrototypeOf.Object.getPrototypeOf.Object.getPrototypeOf.ag.iter.return):
(const.AsyncIteratorPrototype.Object.getPrototypeOf.Object.getPrototypeOf.Object.getPrototypeOf.ag):
(shouldBe.iter.return):
* JSTests/stress/asynciterator-prototype-symbol-async-dispose-return-null.js:
Added.
(shouldBe):
(shouldResolve):
(async ag):
(const.AsyncIteratorPrototype.Object.getPrototypeOf.Object.getPrototypeOf.Object.getPrototypeOf.ag):
(shouldResolve.iter.return):
(shouldBe.):
* JSTests/stress/iterator-prototype-symbol-dispose-return-null.js: Added.
(shouldBe):
(const.IteratorPrototype.Object.getPrototypeOf.Object.getPrototypeOf.Symbol.iterator):
(iter.Symbol.dispose):
(iter.Symbol.dispose.iter.return):
(shouldBe.gen):
* Source/JavaScriptCore/builtins/AsyncDisposableStackPrototype.js:
(adopt):
(disposeAsync):
(use):
* Source/JavaScriptCore/builtins/AsyncIteratorPrototype.js:
(overriddenName.string_appeared_here.asyncDispose):
* Source/JavaScriptCore/builtins/DisposableStackPrototype.js:
(linkTimeConstant.addDisposableResource):
* Source/JavaScriptCore/builtins/JSIteratorPrototype.js:
(overriddenName.string_appeared_here.dispose):
Canonical link: https://commits.webkit.org/309462@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications