swiftwasm / swiftwasm/JavaScriptKit

BridgeJS: Remove forced capture workaround in async thunk body closures once swiftlang/swift#89715 lands

未关闭
#761 0 条评论 0 个 reaction 已指派 1 人 在 GitHub 查看

@krodak 已经在做这个了。

开始于 2026年6月10日。

主要语言
Swift
星标
986
派生
76
平均合并
21 小时 11 分钟
30 天内合并 PR
4

描述

Tracks removal of the workaround introduced in #760.

Context

A zero-parameter async throws(JSException) export generates a captureless _bjs_makePromise body closure, which lowers via thin_to_thick_function and miscompiles on Wasm (swiftlang/swift#89320): the thrown error is corrupted across the async unwind, trapping in Promise_reject or rejecting with a garbage value. #760 works around this at the codegen level by forcing a capture in the emitted body closure (the capture must also be read in the body, since an unread capture list entry is dropped by capture analysis and the closure stays thin):

let __bjs_capture = 0
return _bjs_makePromise(resolve: Promise_resolve_SS, reject: Promise_reject) { [__bjs_capture] () async throws(JSException) -> String in
    _ = __bjs_capture
    return try await ping()
}

What to do once the compiler fix ships

The proper fix is swiftlang/swift#89715 (IRGen: fix async typed throws miscompiles on Wasm). Once it is available in the oldest Swift toolchain JavaScriptKit supports:

  • Remove asyncThrowsBodyForcesCapture and the forced-capture emission from ExportedThunkBuilder in Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift.
  • Regenerate snapshots and the AoT-committed bindings.
  • Keep the zeroArgAsyncThrows end-to-end regression test as the guard that the reject path still works without the workaround.

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。