Skip to content

Commit 57406e0

Browse files
committed
Tests: Add identity mode E2E tests with dual-mode assertions
Add Tests/BridgeJSRuntimeTests/IdentityModeSupportTests module covering: - Wrapper identity for shared Swift objects - Cache invalidation on release - Different classes don't collide on same pointer - Retain leak regression test for cache hits - Array identity preservation Wire IDENTITY_MODE env var through prelude.mjs to toggle instantiateOptions. Add unittest-pointer Makefile target for running tests with identityMode: "pointer".
1 parent 9ad174a commit 57406e0

6 files changed

Lines changed: 1137 additions & 0 deletions

File tree

Makefile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,18 @@ unittest:
2121
--disable-sandbox \
2222
js test --prelude ./Tests/prelude.mjs -Xnode --expose-gc
2323

24+
.PHONY: unittest-pointer
25+
unittest-pointer:
26+
@echo Running unit tests with identityMode=pointer
27+
@test -n "$(SWIFT_SDK_ID)" || { \
28+
echo "SWIFT_SDK_ID is not set. Run 'swift sdk list' and pass a matching SDK, e.g. 'make unittest-pointer SWIFT_SDK_ID=<id>'."; \
29+
exit 2; \
30+
}
31+
IDENTITY_MODE=pointer swift package --swift-sdk "$(SWIFT_SDK_ID)" \
32+
$(TRACING_ARGS) \
33+
--disable-sandbox \
34+
js test --prelude ./Tests/prelude.mjs -Xnode --expose-gc
35+
2436
.PHONY: regenerate_swiftpm_resources
2537
regenerate_swiftpm_resources:
2638
npm run build

Tests/BridgeJSRuntimeTests/Generated/BridgeJS.swift

Lines changed: 345 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7656,6 +7656,132 @@ public func _bjs_makeAdder(_ base: Int32) -> Int32 {
76567656
#endif
76577657
}
76587658

7659+
@_expose(wasm, "bjs_getSharedSubject")
7660+
@_cdecl("bjs_getSharedSubject")
7661+
public func _bjs_getSharedSubject() -> UnsafeMutableRawPointer {
7662+
#if arch(wasm32)
7663+
let ret = getSharedSubject()
7664+
return ret.bridgeJSLowerReturn()
7665+
#else
7666+
fatalError("Only available on WebAssembly")
7667+
#endif
7668+
}
7669+
7670+
@_expose(wasm, "bjs_resetSharedSubject")
7671+
@_cdecl("bjs_resetSharedSubject")
7672+
public func _bjs_resetSharedSubject() -> Void {
7673+
#if arch(wasm32)
7674+
resetSharedSubject()
7675+
#else
7676+
fatalError("Only available on WebAssembly")
7677+
#endif
7678+
}
7679+
7680+
@_expose(wasm, "bjs_getRetainLeakSubject")
7681+
@_cdecl("bjs_getRetainLeakSubject")
7682+
public func _bjs_getRetainLeakSubject() -> UnsafeMutableRawPointer {
7683+
#if arch(wasm32)
7684+
let ret = getRetainLeakSubject()
7685+
return ret.bridgeJSLowerReturn()
7686+
#else
7687+
fatalError("Only available on WebAssembly")
7688+
#endif
7689+
}
7690+
7691+
@_expose(wasm, "bjs_resetRetainLeakSubject")
7692+
@_cdecl("bjs_resetRetainLeakSubject")
7693+
public func _bjs_resetRetainLeakSubject() -> Void {
7694+
#if arch(wasm32)
7695+
resetRetainLeakSubject()
7696+
#else
7697+
fatalError("Only available on WebAssembly")
7698+
#endif
7699+
}
7700+
7701+
@_expose(wasm, "bjs_getRetainLeakDeinits")
7702+
@_cdecl("bjs_getRetainLeakDeinits")
7703+
public func _bjs_getRetainLeakDeinits() -> Int32 {
7704+
#if arch(wasm32)
7705+
let ret = getRetainLeakDeinits()
7706+
return ret.bridgeJSLowerReturn()
7707+
#else
7708+
fatalError("Only available on WebAssembly")
7709+
#endif
7710+
}
7711+
7712+
@_expose(wasm, "bjs_resetRetainLeakDeinits")
7713+
@_cdecl("bjs_resetRetainLeakDeinits")
7714+
public func _bjs_resetRetainLeakDeinits() -> Void {
7715+
#if arch(wasm32)
7716+
resetRetainLeakDeinits()
7717+
#else
7718+
fatalError("Only available on WebAssembly")
7719+
#endif
7720+
}
7721+
7722+
@_expose(wasm, "bjs_setupArrayPool")
7723+
@_cdecl("bjs_setupArrayPool")
7724+
public func _bjs_setupArrayPool(_ count: Int32) -> Void {
7725+
#if arch(wasm32)
7726+
setupArrayPool(_: Int.bridgeJSLiftParameter(count))
7727+
#else
7728+
fatalError("Only available on WebAssembly")
7729+
#endif
7730+
}
7731+
7732+
@_expose(wasm, "bjs_getArrayPool")
7733+
@_cdecl("bjs_getArrayPool")
7734+
public func _bjs_getArrayPool() -> Void {
7735+
#if arch(wasm32)
7736+
let ret = getArrayPool()
7737+
ret.bridgeJSStackPush()
7738+
#else
7739+
fatalError("Only available on WebAssembly")
7740+
#endif
7741+
}
7742+
7743+
@_expose(wasm, "bjs_getArrayPoolElement")
7744+
@_cdecl("bjs_getArrayPoolElement")
7745+
public func _bjs_getArrayPoolElement(_ index: Int32) -> Void {
7746+
#if arch(wasm32)
7747+
let ret = getArrayPoolElement(_: Int.bridgeJSLiftParameter(index))
7748+
return ret.bridgeJSLowerReturn()
7749+
#else
7750+
fatalError("Only available on WebAssembly")
7751+
#endif
7752+
}
7753+
7754+
@_expose(wasm, "bjs_getArrayPoolDeinits")
7755+
@_cdecl("bjs_getArrayPoolDeinits")
7756+
public func _bjs_getArrayPoolDeinits() -> Int32 {
7757+
#if arch(wasm32)
7758+
let ret = getArrayPoolDeinits()
7759+
return ret.bridgeJSLowerReturn()
7760+
#else
7761+
fatalError("Only available on WebAssembly")
7762+
#endif
7763+
}
7764+
7765+
@_expose(wasm, "bjs_resetArrayPoolDeinits")
7766+
@_cdecl("bjs_resetArrayPoolDeinits")
7767+
public func _bjs_resetArrayPoolDeinits() -> Void {
7768+
#if arch(wasm32)
7769+
resetArrayPoolDeinits()
7770+
#else
7771+
fatalError("Only available on WebAssembly")
7772+
#endif
7773+
}
7774+
7775+
@_expose(wasm, "bjs_clearArrayPool")
7776+
@_cdecl("bjs_clearArrayPool")
7777+
public func _bjs_clearArrayPool() -> Void {
7778+
#if arch(wasm32)
7779+
clearArrayPool()
7780+
#else
7781+
fatalError("Only available on WebAssembly")
7782+
#endif
7783+
}
7784+
76597785
@_expose(wasm, "bjs_roundTripPointerFields")
76607786
@_cdecl("bjs_roundTripPointerFields")
76617787
public func _bjs_roundTripPointerFields() -> Void {
@@ -10472,6 +10598,206 @@ fileprivate func _bjs_TextProcessor_wrap_extern(_ pointer: UnsafeMutableRawPoint
1047210598
return _bjs_TextProcessor_wrap_extern(pointer)
1047310599
}
1047410600

10601+
@_expose(wasm, "bjs_IdentityTestSubject_init")
10602+
@_cdecl("bjs_IdentityTestSubject_init")
10603+
public func _bjs_IdentityTestSubject_init(_ value: Int32) -> UnsafeMutableRawPointer {
10604+
#if arch(wasm32)
10605+
let ret = IdentityTestSubject(value: Int.bridgeJSLiftParameter(value))
10606+
return ret.bridgeJSLowerReturn()
10607+
#else
10608+
fatalError("Only available on WebAssembly")
10609+
#endif
10610+
}
10611+
10612+
@_expose(wasm, "bjs_IdentityTestSubject_value_get")
10613+
@_cdecl("bjs_IdentityTestSubject_value_get")
10614+
public func _bjs_IdentityTestSubject_value_get(_ _self: UnsafeMutableRawPointer) -> Int32 {
10615+
#if arch(wasm32)
10616+
let ret = IdentityTestSubject.bridgeJSLiftParameter(_self).value
10617+
return ret.bridgeJSLowerReturn()
10618+
#else
10619+
fatalError("Only available on WebAssembly")
10620+
#endif
10621+
}
10622+
10623+
@_expose(wasm, "bjs_IdentityTestSubject_value_set")
10624+
@_cdecl("bjs_IdentityTestSubject_value_set")
10625+
public func _bjs_IdentityTestSubject_value_set(_ _self: UnsafeMutableRawPointer, _ value: Int32) -> Void {
10626+
#if arch(wasm32)
10627+
IdentityTestSubject.bridgeJSLiftParameter(_self).value = Int.bridgeJSLiftParameter(value)
10628+
#else
10629+
fatalError("Only available on WebAssembly")
10630+
#endif
10631+
}
10632+
10633+
@_expose(wasm, "bjs_IdentityTestSubject_currentValue_get")
10634+
@_cdecl("bjs_IdentityTestSubject_currentValue_get")
10635+
public func _bjs_IdentityTestSubject_currentValue_get(_ _self: UnsafeMutableRawPointer) -> Int32 {
10636+
#if arch(wasm32)
10637+
let ret = IdentityTestSubject.bridgeJSLiftParameter(_self).currentValue
10638+
return ret.bridgeJSLowerReturn()
10639+
#else
10640+
fatalError("Only available on WebAssembly")
10641+
#endif
10642+
}
10643+
10644+
@_expose(wasm, "bjs_IdentityTestSubject_deinit")
10645+
@_cdecl("bjs_IdentityTestSubject_deinit")
10646+
public func _bjs_IdentityTestSubject_deinit(_ pointer: UnsafeMutableRawPointer) -> Void {
10647+
#if arch(wasm32)
10648+
Unmanaged<IdentityTestSubject>.fromOpaque(pointer).release()
10649+
#else
10650+
fatalError("Only available on WebAssembly")
10651+
#endif
10652+
}
10653+
10654+
extension IdentityTestSubject: ConvertibleToJSValue, _BridgedSwiftHeapObject, _BridgedSwiftProtocolExportable {
10655+
var jsValue: JSValue {
10656+
return .object(JSObject(id: UInt32(bitPattern: _bjs_IdentityTestSubject_wrap(Unmanaged.passRetained(self).toOpaque()))))
10657+
}
10658+
consuming func bridgeJSLowerAsProtocolReturn() -> Int32 {
10659+
_bjs_IdentityTestSubject_wrap(Unmanaged.passRetained(self).toOpaque())
10660+
}
10661+
}
10662+
10663+
#if arch(wasm32)
10664+
@_extern(wasm, module: "BridgeJSRuntimeTests", name: "bjs_IdentityTestSubject_wrap")
10665+
fileprivate func _bjs_IdentityTestSubject_wrap_extern(_ pointer: UnsafeMutableRawPointer) -> Int32
10666+
#else
10667+
fileprivate func _bjs_IdentityTestSubject_wrap_extern(_ pointer: UnsafeMutableRawPointer) -> Int32 {
10668+
fatalError("Only available on WebAssembly")
10669+
}
10670+
#endif
10671+
@inline(never) fileprivate func _bjs_IdentityTestSubject_wrap(_ pointer: UnsafeMutableRawPointer) -> Int32 {
10672+
return _bjs_IdentityTestSubject_wrap_extern(pointer)
10673+
}
10674+
10675+
@_expose(wasm, "bjs_RetainLeakSubject_init")
10676+
@_cdecl("bjs_RetainLeakSubject_init")
10677+
public func _bjs_RetainLeakSubject_init(_ tag: Int32) -> UnsafeMutableRawPointer {
10678+
#if arch(wasm32)
10679+
let ret = RetainLeakSubject(tag: Int.bridgeJSLiftParameter(tag))
10680+
return ret.bridgeJSLowerReturn()
10681+
#else
10682+
fatalError("Only available on WebAssembly")
10683+
#endif
10684+
}
10685+
10686+
@_expose(wasm, "bjs_RetainLeakSubject_tag_get")
10687+
@_cdecl("bjs_RetainLeakSubject_tag_get")
10688+
public func _bjs_RetainLeakSubject_tag_get(_ _self: UnsafeMutableRawPointer) -> Int32 {
10689+
#if arch(wasm32)
10690+
let ret = RetainLeakSubject.bridgeJSLiftParameter(_self).tag
10691+
return ret.bridgeJSLowerReturn()
10692+
#else
10693+
fatalError("Only available on WebAssembly")
10694+
#endif
10695+
}
10696+
10697+
@_expose(wasm, "bjs_RetainLeakSubject_tag_set")
10698+
@_cdecl("bjs_RetainLeakSubject_tag_set")
10699+
public func _bjs_RetainLeakSubject_tag_set(_ _self: UnsafeMutableRawPointer, _ value: Int32) -> Void {
10700+
#if arch(wasm32)
10701+
RetainLeakSubject.bridgeJSLiftParameter(_self).tag = Int.bridgeJSLiftParameter(value)
10702+
#else
10703+
fatalError("Only available on WebAssembly")
10704+
#endif
10705+
}
10706+
10707+
@_expose(wasm, "bjs_RetainLeakSubject_deinit")
10708+
@_cdecl("bjs_RetainLeakSubject_deinit")
10709+
public func _bjs_RetainLeakSubject_deinit(_ pointer: UnsafeMutableRawPointer) -> Void {
10710+
#if arch(wasm32)
10711+
Unmanaged<RetainLeakSubject>.fromOpaque(pointer).release()
10712+
#else
10713+
fatalError("Only available on WebAssembly")
10714+
#endif
10715+
}
10716+
10717+
extension RetainLeakSubject: ConvertibleToJSValue, _BridgedSwiftHeapObject, _BridgedSwiftProtocolExportable {
10718+
var jsValue: JSValue {
10719+
return .object(JSObject(id: UInt32(bitPattern: _bjs_RetainLeakSubject_wrap(Unmanaged.passRetained(self).toOpaque()))))
10720+
}
10721+
consuming func bridgeJSLowerAsProtocolReturn() -> Int32 {
10722+
_bjs_RetainLeakSubject_wrap(Unmanaged.passRetained(self).toOpaque())
10723+
}
10724+
}
10725+
10726+
#if arch(wasm32)
10727+
@_extern(wasm, module: "BridgeJSRuntimeTests", name: "bjs_RetainLeakSubject_wrap")
10728+
fileprivate func _bjs_RetainLeakSubject_wrap_extern(_ pointer: UnsafeMutableRawPointer) -> Int32
10729+
#else
10730+
fileprivate func _bjs_RetainLeakSubject_wrap_extern(_ pointer: UnsafeMutableRawPointer) -> Int32 {
10731+
fatalError("Only available on WebAssembly")
10732+
}
10733+
#endif
10734+
@inline(never) fileprivate func _bjs_RetainLeakSubject_wrap(_ pointer: UnsafeMutableRawPointer) -> Int32 {
10735+
return _bjs_RetainLeakSubject_wrap_extern(pointer)
10736+
}
10737+
10738+
@_expose(wasm, "bjs_ArrayIdentityElement_init")
10739+
@_cdecl("bjs_ArrayIdentityElement_init")
10740+
public func _bjs_ArrayIdentityElement_init(_ tag: Int32) -> UnsafeMutableRawPointer {
10741+
#if arch(wasm32)
10742+
let ret = ArrayIdentityElement(tag: Int.bridgeJSLiftParameter(tag))
10743+
return ret.bridgeJSLowerReturn()
10744+
#else
10745+
fatalError("Only available on WebAssembly")
10746+
#endif
10747+
}
10748+
10749+
@_expose(wasm, "bjs_ArrayIdentityElement_tag_get")
10750+
@_cdecl("bjs_ArrayIdentityElement_tag_get")
10751+
public func _bjs_ArrayIdentityElement_tag_get(_ _self: UnsafeMutableRawPointer) -> Int32 {
10752+
#if arch(wasm32)
10753+
let ret = ArrayIdentityElement.bridgeJSLiftParameter(_self).tag
10754+
return ret.bridgeJSLowerReturn()
10755+
#else
10756+
fatalError("Only available on WebAssembly")
10757+
#endif
10758+
}
10759+
10760+
@_expose(wasm, "bjs_ArrayIdentityElement_tag_set")
10761+
@_cdecl("bjs_ArrayIdentityElement_tag_set")
10762+
public func _bjs_ArrayIdentityElement_tag_set(_ _self: UnsafeMutableRawPointer, _ value: Int32) -> Void {
10763+
#if arch(wasm32)
10764+
ArrayIdentityElement.bridgeJSLiftParameter(_self).tag = Int.bridgeJSLiftParameter(value)
10765+
#else
10766+
fatalError("Only available on WebAssembly")
10767+
#endif
10768+
}
10769+
10770+
@_expose(wasm, "bjs_ArrayIdentityElement_deinit")
10771+
@_cdecl("bjs_ArrayIdentityElement_deinit")
10772+
public func _bjs_ArrayIdentityElement_deinit(_ pointer: UnsafeMutableRawPointer) -> Void {
10773+
#if arch(wasm32)
10774+
Unmanaged<ArrayIdentityElement>.fromOpaque(pointer).release()
10775+
#else
10776+
fatalError("Only available on WebAssembly")
10777+
#endif
10778+
}
10779+
10780+
extension ArrayIdentityElement: ConvertibleToJSValue, _BridgedSwiftHeapObject, _BridgedSwiftProtocolExportable {
10781+
var jsValue: JSValue {
10782+
return .object(JSObject(id: UInt32(bitPattern: _bjs_ArrayIdentityElement_wrap(Unmanaged.passRetained(self).toOpaque()))))
10783+
}
10784+
consuming func bridgeJSLowerAsProtocolReturn() -> Int32 {
10785+
_bjs_ArrayIdentityElement_wrap(Unmanaged.passRetained(self).toOpaque())
10786+
}
10787+
}
10788+
10789+
#if arch(wasm32)
10790+
@_extern(wasm, module: "BridgeJSRuntimeTests", name: "bjs_ArrayIdentityElement_wrap")
10791+
fileprivate func _bjs_ArrayIdentityElement_wrap_extern(_ pointer: UnsafeMutableRawPointer) -> Int32
10792+
#else
10793+
fileprivate func _bjs_ArrayIdentityElement_wrap_extern(_ pointer: UnsafeMutableRawPointer) -> Int32 {
10794+
fatalError("Only available on WebAssembly")
10795+
}
10796+
#endif
10797+
@inline(never) fileprivate func _bjs_ArrayIdentityElement_wrap(_ pointer: UnsafeMutableRawPointer) -> Int32 {
10798+
return _bjs_ArrayIdentityElement_wrap_extern(pointer)
10799+
}
10800+
1047510801
@_expose(wasm, "bjs_OptionalHolder_init")
1047610802
@_cdecl("bjs_OptionalHolder_init")
1047710803
public func _bjs_OptionalHolder_init(_ nullableGreeterIsSome: Int32, _ nullableGreeterValue: UnsafeMutableRawPointer, _ undefinedNumberIsSome: Int32, _ undefinedNumberValue: Float64) -> UnsafeMutableRawPointer {
@@ -12945,6 +13271,25 @@ func _$Animal_getIsCat(_ self: JSObject) throws(JSException) -> Bool {
1294513271
return Bool.bridgeJSLiftReturn(ret)
1294613272
}
1294713273

13274+
#if arch(wasm32)
13275+
@_extern(wasm, module: "BridgeJSRuntimeTests", name: "bjs_IdentityModeSupportImports_runJsIdentityModeSupportTests_static")
13276+
fileprivate func bjs_IdentityModeSupportImports_runJsIdentityModeSupportTests_static_extern() -> Void
13277+
#else
13278+
fileprivate func bjs_IdentityModeSupportImports_runJsIdentityModeSupportTests_static_extern() -> Void {
13279+
fatalError("Only available on WebAssembly")
13280+
}
13281+
#endif
13282+
@inline(never) fileprivate func bjs_IdentityModeSupportImports_runJsIdentityModeSupportTests_static() -> Void {
13283+
return bjs_IdentityModeSupportImports_runJsIdentityModeSupportTests_static_extern()
13284+
}
13285+
13286+
func _$IdentityModeSupportImports_runJsIdentityModeSupportTests() throws(JSException) -> Void {
13287+
bjs_IdentityModeSupportImports_runJsIdentityModeSupportTests_static()
13288+
if let error = _swift_js_take_exception() {
13289+
throw error
13290+
}
13291+
}
13292+
1294813293
#if arch(wasm32)
1294913294
@_extern(wasm, module: "BridgeJSRuntimeTests", name: "bjs_jsTranslatePoint")
1295013295
fileprivate func bjs_jsTranslatePoint_extern(_ point: Int32, _ dx: Int32, _ dy: Int32) -> Int32

0 commit comments

Comments
 (0)