swiftwasm / swiftwasm/JavaScriptKit

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

Abierto
#761 0 comentarios 0 reacciones 1 asignado Ver en GitHub

@krodak ya está trabajando en esto.

Desde el 10/6/2026.

Lenguaje dominante
Swift
Estrellas
986
Forks
76
Merge medio
21 h 11 min
PR fusionados (30 d)
4

Descripción

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.

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.