swiftwasm / swiftwasm/JavaScriptKit

BridgeJS: Remove JSException storage boxing once swiftlang/swift#89715 lands

Ouverte
#767 0 commentaires 0 réactions 1 personne assignée Voir sur GitHub

@krodak y travaille déjà.

Depuis le 11/6/2026.

Langage dominant
Swift
Étoiles
986
Forks
76
Merge moyen
21 h 11 min
PR mergées (30 j)
4

Description

Tracks removal of the JSException storage boxing introduced in #766.

Context

swiftlang/swift#89320 miscompiles Wasm calls to captureless async throws(JSException) closure values when the typed error exceeds the direct error convention: the thrown error is corrupted across the async unwind, so the rejected Promise receives garbage. JSException (~36 bytes) always took the affected indirect-error path.

#766 works around this at the library level by boxing JSException's stored properties (thrownValue, description, stack) into a private final class, shrinking the struct to a single stored reference so it travels in the direct error convention and the broken path is never taken. The public API is unchanged; the cost is one heap allocation per thrown exception. The original exploration is in https://github.com/PassiveLogic/JavaScriptKit/pull/13.

The codegen-level counterpart for zero-parameter async throwing exports is tracked separately in #761.

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:

  • Move thrownValue, description, and stack back to stored properties on JSException and delete the Storage class. This is a library-internal layout change only, not a breaking API change.
  • Keep the async closure reject end-to-end tests as the regression guard that the reject path still works without the boxing.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.