swiftwasm / swiftwasm/JavaScriptKit

[BridgeJS] Pass String parameters unretained by default

Ouverte
#677 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

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

Description

When calling a JS function through BridgeJS with String parameters, every String is

  • lowered by calling _swift_js_make_js_string
  • which decodes and retains in JS object store (new entry, new ref = 1)
  • the object store ref is passed as wasm parameter
  • the JS thunk immediately get the object and releases (count--, remove from store)

this is very wasteful, and makes retain the number one bottleneck in current ElementaryUI performance benchmarks.

Example:

@JSFunction func hello(_ v: String) throws

// generates
func _$hello(_ v: String) throws(JSException) -> Void {
    let vValue = v.bridgeJSLowerParameter()
    bjs_hello(vValue)
    if let error = _swift_js_take_exception() {
        throw error
    }
}
function bjs_hello(v) {
    try {
        const vObject = swift.memory.getObject(v);
        swift.memory.release(v);
        imports.hello(vObject);
    } catch (error) {
        setException(error);
    }
}

I suggest:

  • passing String always "in-line" (ie: as address + length) without retaining in the JS memory store
  • still support JSString by-ref to control Swift caller caching (ie: retain once and use same ref multiple times)

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.

Piste de recherche

Start by tracing _swift_js_make_js_string, bridgeJSLowerParameter, and the generated bjs_hello thunk shown in the issue, then inspect how JSString references are represented. Done means ordinary String parameters cross the bridge without a JS memory-store retain/release cycle while JSString still supports caller-controlled by-reference reuse; verify the impact against the ElementaryUI performance benchmarks.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
javascript, swift, wasm
Domaine
api, performance, web-dev
Type d'issue
Refactorisation
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
28/100

Recevez les nouvelles issues par e-mail

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