Skip to content

Commit 03df22f

Browse files
committed
refactor: drop register_wrapper callback — JS owns the wrapper ref
After the pointer-keyed cache simplification, Swift's _<Class>_wrapperRefs map existed only so release_wrapper could find the retained JS ref to release. But JS's strong Map<pointer, wrapper> already keeps the wrapper alive for as long as Swift needs it. Swift doesn't need its own strong reference to the JS wrapper at all. Removed: - Wasm export bjs_<Class>_register_wrapper(pointer, jsRef) - Swift per-class global _<Class>_wrapperRefs - JS-side swift.memory.retain(obj) + register_wrapper callback on miss - Swift-side _swift_js_release_ref() call in release_wrapper Release thunk simplifies to: guard _<Class>_identityTable.remove(pointer) != nil else { return } Unmanaged<Class>.fromOpaque(pointer).release() Invariants preserved: === identity, Swift heap-object lifetime (retain on miss balanced by release in release_wrapper), wrapper survives GC while reachable via the strong Map, array-element identity. Performance impact (500k iters, median ms, swift mode only): v2 v3 delta vs v2 vs pointer (1924) passBothWaysRoundtrip 28 27 -4% getPoolRepeated_100 34 34 parity swiftCreatesObject 592 347 -41% -82% churnObjects 438 332 -24% -58% Miss path is now faster than the 'none' baseline (347 vs 507 ms) — the wasm-callback savings on each fresh wrapper compound: one fewer cross- boundary call per allocation. 165/165 tests green.
1 parent cb04d8c commit 03df22f

8 files changed

Lines changed: 28 additions & 193 deletions

File tree

Benchmarks/Sources/Generated/BridgeJS.swift

Lines changed: 3 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1817,8 +1817,6 @@ fileprivate func _bjs_IdentityCacheBenchmarkIdentity_wrap_extern(_ pointer: Unsa
18171817

18181818
nonisolated(unsafe) var _SimpleClassSwiftIdentity_identityTable: Set<UnsafeMutableRawPointer> = []
18191819

1820-
nonisolated(unsafe) var _SimpleClassSwiftIdentity_wrapperRefs: [UnsafeMutableRawPointer: Int32] = [:]
1821-
18221820
@_expose(wasm, "bjs_SimpleClassSwiftIdentity_init")
18231821
@_cdecl("bjs_SimpleClassSwiftIdentity_init")
18241822
public func _bjs_SimpleClassSwiftIdentity_init(_ nameBytes: Int32, _ nameLength: Int32, _ count: Int32, _ flag: Int32, _ rate: Float32, _ precise: Float64) -> UnsafeMutableRawPointer {
@@ -1956,24 +1954,12 @@ public func _bjs_SimpleClassSwiftIdentity_deinit(_ pointer: UnsafeMutableRawPoin
19561954
#endif
19571955
}
19581956

1959-
@_expose(wasm, "bjs_SimpleClassSwiftIdentity_register_wrapper")
1960-
@_cdecl("bjs_SimpleClassSwiftIdentity_register_wrapper")
1961-
public func _bjs_SimpleClassSwiftIdentity_register_wrapper(_ pointer: UnsafeMutableRawPointer, _ jsRef: Int32) -> Void {
1962-
#if arch(wasm32)
1963-
_SimpleClassSwiftIdentity_wrapperRefs[pointer] = jsRef
1964-
#else
1965-
fatalError("Only available on WebAssembly")
1966-
#endif
1967-
}
1968-
19691957
@_expose(wasm, "bjs_SimpleClassSwiftIdentity_release_wrapper")
19701958
@_cdecl("bjs_SimpleClassSwiftIdentity_release_wrapper")
19711959
public func _bjs_SimpleClassSwiftIdentity_release_wrapper(_ pointer: UnsafeMutableRawPointer) -> Void {
19721960
#if arch(wasm32)
1973-
guard let jsRef = _SimpleClassSwiftIdentity_wrapperRefs.removeValue(forKey: pointer) else { return }
1974-
_SimpleClassSwiftIdentity_identityTable.remove(pointer)
1961+
guard _SimpleClassSwiftIdentity_identityTable.remove(pointer) != nil else { return }
19751962
Unmanaged<SimpleClassSwiftIdentity>.fromOpaque(pointer).release()
1976-
_swift_js_release_ref(jsRef)
19771963
#else
19781964
fatalError("Only available on WebAssembly")
19791965
#endif
@@ -2019,8 +2005,6 @@ fileprivate func _bjs_SimpleClassSwiftIdentity_wrap_extern(_ pointer: UnsafeMuta
20192005

20202006
nonisolated(unsafe) var _ClassRoundtripSwiftIdentity_identityTable: Set<UnsafeMutableRawPointer> = []
20212007

2022-
nonisolated(unsafe) var _ClassRoundtripSwiftIdentity_wrapperRefs: [UnsafeMutableRawPointer: Int32] = [:]
2023-
20242008
@_expose(wasm, "bjs_ClassRoundtripSwiftIdentity_init")
20252009
@_cdecl("bjs_ClassRoundtripSwiftIdentity_init")
20262010
public func _bjs_ClassRoundtripSwiftIdentity_init() -> UnsafeMutableRawPointer {
@@ -2107,24 +2091,12 @@ public func _bjs_ClassRoundtripSwiftIdentity_deinit(_ pointer: UnsafeMutableRawP
21072091
#endif
21082092
}
21092093

2110-
@_expose(wasm, "bjs_ClassRoundtripSwiftIdentity_register_wrapper")
2111-
@_cdecl("bjs_ClassRoundtripSwiftIdentity_register_wrapper")
2112-
public func _bjs_ClassRoundtripSwiftIdentity_register_wrapper(_ pointer: UnsafeMutableRawPointer, _ jsRef: Int32) -> Void {
2113-
#if arch(wasm32)
2114-
_ClassRoundtripSwiftIdentity_wrapperRefs[pointer] = jsRef
2115-
#else
2116-
fatalError("Only available on WebAssembly")
2117-
#endif
2118-
}
2119-
21202094
@_expose(wasm, "bjs_ClassRoundtripSwiftIdentity_release_wrapper")
21212095
@_cdecl("bjs_ClassRoundtripSwiftIdentity_release_wrapper")
21222096
public func _bjs_ClassRoundtripSwiftIdentity_release_wrapper(_ pointer: UnsafeMutableRawPointer) -> Void {
21232097
#if arch(wasm32)
2124-
guard let jsRef = _ClassRoundtripSwiftIdentity_wrapperRefs.removeValue(forKey: pointer) else { return }
2125-
_ClassRoundtripSwiftIdentity_identityTable.remove(pointer)
2098+
guard _ClassRoundtripSwiftIdentity_identityTable.remove(pointer) != nil else { return }
21262099
Unmanaged<ClassRoundtripSwiftIdentity>.fromOpaque(pointer).release()
2127-
_swift_js_release_ref(jsRef)
21282100
#else
21292101
fatalError("Only available on WebAssembly")
21302102
#endif
@@ -2170,8 +2142,6 @@ fileprivate func _bjs_ClassRoundtripSwiftIdentity_wrap_extern(_ pointer: UnsafeM
21702142

21712143
nonisolated(unsafe) var _IdentityCacheBenchmarkSwiftIdentity_identityTable: Set<UnsafeMutableRawPointer> = []
21722144

2173-
nonisolated(unsafe) var _IdentityCacheBenchmarkSwiftIdentity_wrapperRefs: [UnsafeMutableRawPointer: Int32] = [:]
2174-
21752145
@_expose(wasm, "bjs_IdentityCacheBenchmarkSwiftIdentity_init")
21762146
@_cdecl("bjs_IdentityCacheBenchmarkSwiftIdentity_init")
21772147
public func _bjs_IdentityCacheBenchmarkSwiftIdentity_init() -> UnsafeMutableRawPointer {
@@ -2225,24 +2195,12 @@ public func _bjs_IdentityCacheBenchmarkSwiftIdentity_deinit(_ pointer: UnsafeMut
22252195
#endif
22262196
}
22272197

2228-
@_expose(wasm, "bjs_IdentityCacheBenchmarkSwiftIdentity_register_wrapper")
2229-
@_cdecl("bjs_IdentityCacheBenchmarkSwiftIdentity_register_wrapper")
2230-
public func _bjs_IdentityCacheBenchmarkSwiftIdentity_register_wrapper(_ pointer: UnsafeMutableRawPointer, _ jsRef: Int32) -> Void {
2231-
#if arch(wasm32)
2232-
_IdentityCacheBenchmarkSwiftIdentity_wrapperRefs[pointer] = jsRef
2233-
#else
2234-
fatalError("Only available on WebAssembly")
2235-
#endif
2236-
}
2237-
22382198
@_expose(wasm, "bjs_IdentityCacheBenchmarkSwiftIdentity_release_wrapper")
22392199
@_cdecl("bjs_IdentityCacheBenchmarkSwiftIdentity_release_wrapper")
22402200
public func _bjs_IdentityCacheBenchmarkSwiftIdentity_release_wrapper(_ pointer: UnsafeMutableRawPointer) -> Void {
22412201
#if arch(wasm32)
2242-
guard let jsRef = _IdentityCacheBenchmarkSwiftIdentity_wrapperRefs.removeValue(forKey: pointer) else { return }
2243-
_IdentityCacheBenchmarkSwiftIdentity_identityTable.remove(pointer)
2202+
guard _IdentityCacheBenchmarkSwiftIdentity_identityTable.remove(pointer) != nil else { return }
22442203
Unmanaged<IdentityCacheBenchmarkSwiftIdentity>.fromOpaque(pointer).release()
2245-
_swift_js_release_ref(jsRef)
22462204
#else
22472205
fatalError("Only available on WebAssembly")
22482206
#endif

Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -711,20 +711,14 @@ public class ExportSwift {
711711
func renderSingleExportedClass(klass: ExportedClass) throws -> [DeclSyntax] {
712712
var decls: [DeclSyntax] = []
713713

714-
// identityMode: "swift" — per-class state. Simpler than the original
715-
// id-based design: the JS-side cache is keyed directly by pointer (as
716-
// a strong Map), so Swift only needs:
717-
// - a Set of pointers that already have a JS wrapper
718-
// - a Map of pointer → JS ref (so Swift can release the JS ref
719-
// when the wrapper is released)
720-
// See DECISIONS.md D18 for why this supersedes the 5-global design.
714+
// identityMode: "swift" — per-class state. Post-D19: Swift no longer
715+
// holds the JS wrapper ref; JS keeps the wrapper alive in its own
716+
// strong `Map<pointer, wrapper>`. Swift only tracks "have I already
717+
// issued a wrapper for this pointer?" via a Set.
721718
if isSwiftIdentityMode(klass.name) {
722719
decls.append(
723720
"nonisolated(unsafe) var _\(raw: klass.name)_identityTable: Set<UnsafeMutableRawPointer> = []"
724721
)
725-
decls.append(
726-
"nonisolated(unsafe) var _\(raw: klass.name)_wrapperRefs: [UnsafeMutableRawPointer: Int32] = [:]"
727-
)
728722
}
729723

730724
if let constructor = klass.constructor {
@@ -766,23 +760,11 @@ public class ExportSwift {
766760
decls.append(DeclSyntax(funcDecl))
767761
}
768762

769-
// identityMode: "swift" — emit the register/release thunks that pair
770-
// with the JS-side fresh-wrapper handshake. Both thunks are keyed by
771-
// raw pointer — no id indirection. See DECISIONS.md D18.
763+
// identityMode: "swift" — emit the release thunk. Post-D19 there is
764+
// no separate register thunk: Swift does not hold the JS ref, JS does
765+
// (via its `Map<pointer, wrapper>`). Release just drops the Set entry
766+
// and deallocates the Swift heap object.
772767
if isSwiftIdentityMode(klass.name) {
773-
do {
774-
let registerDecl = SwiftCodePattern.buildExposedFunctionDecl(
775-
abiName: "bjs_\(klass.abiName)_register_wrapper",
776-
signature: SwiftSignatureBuilder.buildABIFunctionSignature(
777-
abiParameters: [("pointer", .pointer), ("jsRef", .i32)],
778-
returnType: nil
779-
)
780-
) { printer in
781-
printer.write("_\(klass.name)_wrapperRefs[pointer] = jsRef")
782-
}
783-
decls.append(DeclSyntax(registerDecl))
784-
}
785-
786768
do {
787769
let releaseDecl = SwiftCodePattern.buildExposedFunctionDecl(
788770
abiName: "bjs_\(klass.abiName)_release_wrapper",
@@ -791,10 +773,8 @@ public class ExportSwift {
791773
returnType: nil
792774
)
793775
) { printer in
794-
printer.write("guard let jsRef = _\(klass.name)_wrapperRefs.removeValue(forKey: pointer) else { return }")
795-
printer.write("_\(klass.name)_identityTable.remove(pointer)")
776+
printer.write("guard _\(klass.name)_identityTable.remove(pointer) != nil else { return }")
796777
printer.write("Unmanaged<\(klass.swiftCallName)>.fromOpaque(pointer).release()")
797-
printer.write("_swift_js_release_ref(jsRef)")
798778
}
799779
decls.append(DeclSyntax(releaseDecl))
800780
}

Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2060,11 +2060,14 @@ extension BridgeJSLink {
20602060
dtsExportEntryPrinter.write("\(klass.name): {")
20612061

20622062
if useSwiftIdentity {
2063-
// DECISIONS.md D18: the `.swift`-mode class is standalone — it does NOT
2063+
// DECISIONS.md D18 + D19: the `.swift`-mode class is standalone — it does NOT
20642064
// extend `SwiftHeapObject`. It keeps a strong `Map<pointer, wrapper>` so
2065-
// re-exports of the same Swift pointer get the same JS wrapper. Swift
2066-
// signals "cache hit" via a single `freshBit` push on the i32 stack
2067-
// (0 = cached, 1 = fresh). No id indirection, no dense array.
2065+
// re-exports of the same Swift pointer get the same JS wrapper.
2066+
//
2067+
// Swift signals "cache hit" via a single `freshBit` push on the i32 stack
2068+
// (0 = cached, 1 = fresh). Post-D19 the JS side owns the wrapper lifetime
2069+
// entirely — no `swift.memory.retain`, no `register_wrapper` callback.
2070+
// Swift only tracks a `Set<pointer>` of pointers it has retained.
20682071
jsPrinter.write("class \(klass.name) {")
20692072
jsPrinter.indent {
20702073
jsPrinter.write("static __swiftIdentityWrappers = new Map();")
@@ -2081,10 +2084,6 @@ extension BridgeJSLink {
20812084
jsPrinter.write("obj.pointer = pointer;")
20822085
jsPrinter.write("obj.__swiftIdentityHasReleased = false;")
20832086
jsPrinter.write("\(klass.name).__swiftIdentityWrappers.set(pointer, obj);")
2084-
// Retain the wrapper in swift.memory so Swift can hold it strongly
2085-
// via `_<Class>_wrapperRefs[pointer]` until release_wrapper fires.
2086-
jsPrinter.write("const jsRef = swift.memory.retain(obj);")
2087-
jsPrinter.write("instance.exports.bjs_\(klass.abiName)_register_wrapper(pointer, jsRef);")
20882087
jsPrinter.write("return obj;")
20892088
}
20902089
jsPrinter.write("}")
@@ -2100,9 +2099,9 @@ extension BridgeJSLink {
21002099
jsPrinter.write("if (this.__swiftIdentityHasReleased) return;")
21012100
jsPrinter.write("this.__swiftIdentityHasReleased = true;")
21022101
jsPrinter.write("const pointer = this.pointer;")
2102+
// Swift's release_wrapper drops the Set entry + releases the Swift
2103+
// heap object. JS drops the Map entry.
21032104
jsPrinter.write("instance.exports.bjs_\(klass.abiName)_release_wrapper(pointer);")
2104-
// Swift's release_wrapper already released the JS ref; clear
2105-
// the JS-side map entry.
21062105
jsPrinter.write("\(klass.name).__swiftIdentityWrappers.delete(pointer);")
21072106
}
21082107
jsPrinter.write("}")

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/IdentityModeSwiftClass.swift

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
nonisolated(unsafe) var _SwiftCached_identityTable: Set<UnsafeMutableRawPointer> = []
22

3-
nonisolated(unsafe) var _SwiftCached_wrapperRefs: [UnsafeMutableRawPointer: Int32] = [:]
4-
53
@_expose(wasm, "bjs_SwiftCached_init")
64
@_cdecl("bjs_SwiftCached_init")
75
public func _bjs_SwiftCached_init(_ nameBytes: Int32, _ nameLength: Int32) -> UnsafeMutableRawPointer {
@@ -55,24 +53,12 @@ public func _bjs_SwiftCached_deinit(_ pointer: UnsafeMutableRawPointer) -> Void
5553
#endif
5654
}
5755

58-
@_expose(wasm, "bjs_SwiftCached_register_wrapper")
59-
@_cdecl("bjs_SwiftCached_register_wrapper")
60-
public func _bjs_SwiftCached_register_wrapper(_ pointer: UnsafeMutableRawPointer, _ jsRef: Int32) -> Void {
61-
#if arch(wasm32)
62-
_SwiftCached_wrapperRefs[pointer] = jsRef
63-
#else
64-
fatalError("Only available on WebAssembly")
65-
#endif
66-
}
67-
6856
@_expose(wasm, "bjs_SwiftCached_release_wrapper")
6957
@_cdecl("bjs_SwiftCached_release_wrapper")
7058
public func _bjs_SwiftCached_release_wrapper(_ pointer: UnsafeMutableRawPointer) -> Void {
7159
#if arch(wasm32)
72-
guard let jsRef = _SwiftCached_wrapperRefs.removeValue(forKey: pointer) else { return }
73-
_SwiftCached_identityTable.remove(pointer)
60+
guard _SwiftCached_identityTable.remove(pointer) != nil else { return }
7461
Unmanaged<SwiftCached>.fromOpaque(pointer).release()
75-
_swift_js_release_ref(jsRef)
7662
#else
7763
fatalError("Only available on WebAssembly")
7864
#endif

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/IdentityModeClass.ConfigSwift.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,8 +316,6 @@ export async function createInstantiator(options, swift) {
316316
obj.pointer = pointer;
317317
obj.__swiftIdentityHasReleased = false;
318318
UncachedModel.__swiftIdentityWrappers.set(pointer, obj);
319-
const jsRef = swift.memory.retain(obj);
320-
instance.exports.bjs_UncachedModel_register_wrapper(pointer, jsRef);
321319
return obj;
322320
}
323321

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/IdentityModeSwiftClass.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,8 +281,6 @@ export async function createInstantiator(options, swift) {
281281
obj.pointer = pointer;
282282
obj.__swiftIdentityHasReleased = false;
283283
SwiftCached.__swiftIdentityWrappers.set(pointer, obj);
284-
const jsRef = swift.memory.retain(obj);
285-
instance.exports.bjs_SwiftCached_register_wrapper(pointer, jsRef);
286284
return obj;
287285
}
288286

Tests/BridgeJSIdentityTests/Generated/BridgeJS.swift

Lines changed: 3 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -464,8 +464,6 @@ fileprivate func _bjs_ArrayIdentityElement_wrap_extern(_ pointer: UnsafeMutableR
464464

465465
nonisolated(unsafe) var _SwiftIdentityTestSubject_identityTable: Set<UnsafeMutableRawPointer> = []
466466

467-
nonisolated(unsafe) var _SwiftIdentityTestSubject_wrapperRefs: [UnsafeMutableRawPointer: Int32] = [:]
468-
469467
@_expose(wasm, "bjs_SwiftIdentityTestSubject_init")
470468
@_cdecl("bjs_SwiftIdentityTestSubject_init")
471469
public func _bjs_SwiftIdentityTestSubject_init(_ value: Int32) -> UnsafeMutableRawPointer {
@@ -552,24 +550,12 @@ public func _bjs_SwiftIdentityTestSubject_deinit(_ pointer: UnsafeMutableRawPoin
552550
#endif
553551
}
554552

555-
@_expose(wasm, "bjs_SwiftIdentityTestSubject_register_wrapper")
556-
@_cdecl("bjs_SwiftIdentityTestSubject_register_wrapper")
557-
public func _bjs_SwiftIdentityTestSubject_register_wrapper(_ pointer: UnsafeMutableRawPointer, _ jsRef: Int32) -> Void {
558-
#if arch(wasm32)
559-
_SwiftIdentityTestSubject_wrapperRefs[pointer] = jsRef
560-
#else
561-
fatalError("Only available on WebAssembly")
562-
#endif
563-
}
564-
565553
@_expose(wasm, "bjs_SwiftIdentityTestSubject_release_wrapper")
566554
@_cdecl("bjs_SwiftIdentityTestSubject_release_wrapper")
567555
public func _bjs_SwiftIdentityTestSubject_release_wrapper(_ pointer: UnsafeMutableRawPointer) -> Void {
568556
#if arch(wasm32)
569-
guard let jsRef = _SwiftIdentityTestSubject_wrapperRefs.removeValue(forKey: pointer) else { return }
570-
_SwiftIdentityTestSubject_identityTable.remove(pointer)
557+
guard _SwiftIdentityTestSubject_identityTable.remove(pointer) != nil else { return }
571558
Unmanaged<SwiftIdentityTestSubject>.fromOpaque(pointer).release()
572-
_swift_js_release_ref(jsRef)
573559
#else
574560
fatalError("Only available on WebAssembly")
575561
#endif
@@ -615,8 +601,6 @@ fileprivate func _bjs_SwiftIdentityTestSubject_wrap_extern(_ pointer: UnsafeMuta
615601

616602
nonisolated(unsafe) var _SwiftRetainLeakSubject_identityTable: Set<UnsafeMutableRawPointer> = []
617603

618-
nonisolated(unsafe) var _SwiftRetainLeakSubject_wrapperRefs: [UnsafeMutableRawPointer: Int32] = [:]
619-
620604
@_expose(wasm, "bjs_SwiftRetainLeakSubject_init")
621605
@_cdecl("bjs_SwiftRetainLeakSubject_init")
622606
public func _bjs_SwiftRetainLeakSubject_init(_ tag: Int32) -> UnsafeMutableRawPointer {
@@ -670,24 +654,12 @@ public func _bjs_SwiftRetainLeakSubject_deinit(_ pointer: UnsafeMutableRawPointe
670654
#endif
671655
}
672656

673-
@_expose(wasm, "bjs_SwiftRetainLeakSubject_register_wrapper")
674-
@_cdecl("bjs_SwiftRetainLeakSubject_register_wrapper")
675-
public func _bjs_SwiftRetainLeakSubject_register_wrapper(_ pointer: UnsafeMutableRawPointer, _ jsRef: Int32) -> Void {
676-
#if arch(wasm32)
677-
_SwiftRetainLeakSubject_wrapperRefs[pointer] = jsRef
678-
#else
679-
fatalError("Only available on WebAssembly")
680-
#endif
681-
}
682-
683657
@_expose(wasm, "bjs_SwiftRetainLeakSubject_release_wrapper")
684658
@_cdecl("bjs_SwiftRetainLeakSubject_release_wrapper")
685659
public func _bjs_SwiftRetainLeakSubject_release_wrapper(_ pointer: UnsafeMutableRawPointer) -> Void {
686660
#if arch(wasm32)
687-
guard let jsRef = _SwiftRetainLeakSubject_wrapperRefs.removeValue(forKey: pointer) else { return }
688-
_SwiftRetainLeakSubject_identityTable.remove(pointer)
661+
guard _SwiftRetainLeakSubject_identityTable.remove(pointer) != nil else { return }
689662
Unmanaged<SwiftRetainLeakSubject>.fromOpaque(pointer).release()
690-
_swift_js_release_ref(jsRef)
691663
#else
692664
fatalError("Only available on WebAssembly")
693665
#endif
@@ -733,8 +705,6 @@ fileprivate func _bjs_SwiftRetainLeakSubject_wrap_extern(_ pointer: UnsafeMutabl
733705

734706
nonisolated(unsafe) var _SwiftChurnSubject_identityTable: Set<UnsafeMutableRawPointer> = []
735707

736-
nonisolated(unsafe) var _SwiftChurnSubject_wrapperRefs: [UnsafeMutableRawPointer: Int32] = [:]
737-
738708
@_expose(wasm, "bjs_SwiftChurnSubject_init")
739709
@_cdecl("bjs_SwiftChurnSubject_init")
740710
public func _bjs_SwiftChurnSubject_init(_ tag: Int32) -> UnsafeMutableRawPointer {
@@ -788,24 +758,12 @@ public func _bjs_SwiftChurnSubject_deinit(_ pointer: UnsafeMutableRawPointer) ->
788758
#endif
789759
}
790760

791-
@_expose(wasm, "bjs_SwiftChurnSubject_register_wrapper")
792-
@_cdecl("bjs_SwiftChurnSubject_register_wrapper")
793-
public func _bjs_SwiftChurnSubject_register_wrapper(_ pointer: UnsafeMutableRawPointer, _ jsRef: Int32) -> Void {
794-
#if arch(wasm32)
795-
_SwiftChurnSubject_wrapperRefs[pointer] = jsRef
796-
#else
797-
fatalError("Only available on WebAssembly")
798-
#endif
799-
}
800-
801761
@_expose(wasm, "bjs_SwiftChurnSubject_release_wrapper")
802762
@_cdecl("bjs_SwiftChurnSubject_release_wrapper")
803763
public func _bjs_SwiftChurnSubject_release_wrapper(_ pointer: UnsafeMutableRawPointer) -> Void {
804764
#if arch(wasm32)
805-
guard let jsRef = _SwiftChurnSubject_wrapperRefs.removeValue(forKey: pointer) else { return }
806-
_SwiftChurnSubject_identityTable.remove(pointer)
765+
guard _SwiftChurnSubject_identityTable.remove(pointer) != nil else { return }
807766
Unmanaged<SwiftChurnSubject>.fromOpaque(pointer).release()
808-
_swift_js_release_ref(jsRef)
809767
#else
810768
fatalError("Only available on WebAssembly")
811769
#endif

0 commit comments

Comments
 (0)