Skip to content

Commit 15974c7

Browse files
committed
BridgeJS: Snapshot for LIFO order issue in Swift glue code for stack-based types
1 parent 1fda970 commit 15974c7

File tree

5 files changed

+93
-21
lines changed

5 files changed

+93
-21
lines changed

Plugins/BridgeJS/Tests/BridgeJSToolTests/Inputs/EnumAssociatedValue.swift

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,8 @@ enum APIResult {
1010

1111
@JS func handle(result: APIResult)
1212
@JS func getResult() -> APIResult
13-
@JS func roundtripAPIResult(result: APIResult) -> APIResult {
14-
return result
15-
}
16-
@JS func roundTripOptionalAPIResult(result: APIResult?) -> APIResult? {
17-
return result
18-
}
13+
@JS func roundtripAPIResult(result: APIResult) -> APIResult
14+
@JS func roundTripOptionalAPIResult(result: APIResult?) -> APIResult?
1915

2016
@JS
2117
enum ComplexResult {
@@ -29,12 +25,8 @@ enum ComplexResult {
2925

3026
@JS func handleComplex(result: ComplexResult)
3127
@JS func getComplexResult() -> ComplexResult
32-
@JS func roundtripComplexResult(_ result: ComplexResult) -> ComplexResult {
33-
return result
34-
}
35-
@JS func roundTripOptionalComplexResult(result: ComplexResult?) -> ComplexResult? {
36-
return result
37-
}
28+
@JS func roundtripComplexResult(_ result: ComplexResult) -> ComplexResult
29+
@JS func roundTripOptionalComplexResult(result: ComplexResult?) -> ComplexResult?
3830

3931
@JS
4032
enum Utilities {
@@ -45,26 +37,21 @@ enum Utilities {
4537
}
4638
}
4739

48-
@JS func roundTripOptionalUtilitiesResult(result: Utilities.Result?) -> Utilities.Result? {
49-
return result
50-
}
40+
@JS func roundTripOptionalUtilitiesResult(result: Utilities.Result?) -> Utilities.Result?
5141

5242
@JS(namespace: "API")
5343
@JS enum NetworkingResult {
5444
case success(String)
5545
case failure(String, Int)
5646
}
5747

58-
@JS func roundTripOptionalNetworkingResult(result: NetworkingResult?) -> NetworkingResult? {
59-
return result
60-
}
48+
@JS func roundTripOptionalNetworkingResult(result: NetworkingResult?) -> NetworkingResult?
6149

6250
@JS
6351
enum APIOptionalResult {
6452
case success(String?)
6553
case failure(Int?, Bool?)
6654
case status(Bool?, Int?, String?)
6755
}
68-
@JS func roundTripOptionalAPIOptionalResult(result: APIOptionalResult?) -> APIOptionalResult? {
69-
return result
70-
}
56+
@JS func roundTripOptionalAPIOptionalResult(result: APIOptionalResult?) -> APIOptionalResult?
57+
@JS func compareAPIResults(result1: APIOptionalResult?, result2: APIOptionalResult?) -> APIOptionalResult?

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/EnumAssociatedValue.Export.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ export type Exports = {
8686
roundTripOptionalUtilitiesResult(result: Utilities.ResultTag | null): Utilities.ResultTag | null;
8787
roundTripOptionalNetworkingResult(result: API.NetworkingResultTag | null): API.NetworkingResultTag | null;
8888
roundTripOptionalAPIOptionalResult(result: APIOptionalResultTag | null): APIOptionalResultTag | null;
89+
compareAPIResults(result1: APIOptionalResultTag | null, result2: APIOptionalResultTag | null): APIOptionalResultTag | null;
8990
APIResult: APIResultObject
9091
ComplexResult: ComplexResultObject
9192
APIOptionalResult: APIOptionalResultObject

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSLinkTests/EnumAssociatedValue.Export.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,33 @@ export async function createInstantiator(options, swift) {
814814
if (resultCleanup) { resultCleanup(); }
815815
return optResult;
816816
},
817+
compareAPIResults: function bjs_compareAPIResults(result1, result2) {
818+
const isSome = result1 != null;
819+
let result1CaseId, result1Cleanup;
820+
if (isSome) {
821+
const enumResult = enumHelpers.APIOptionalResult.lower(result1);
822+
result1CaseId = enumResult.caseId;
823+
result1Cleanup = enumResult.cleanup;
824+
}
825+
const isSome1 = result2 != null;
826+
let result2CaseId, result2Cleanup;
827+
if (isSome1) {
828+
const enumResult1 = enumHelpers.APIOptionalResult.lower(result2);
829+
result2CaseId = enumResult1.caseId;
830+
result2Cleanup = enumResult1.cleanup;
831+
}
832+
instance.exports.bjs_compareAPIResults(+isSome, isSome ? result1CaseId : 0, +isSome1, isSome1 ? result2CaseId : 0);
833+
const isNull = (tmpRetTag === -1);
834+
let optResult;
835+
if (isNull) {
836+
optResult = null;
837+
} else {
838+
optResult = enumHelpers.APIOptionalResult.raise(tmpRetTag, tmpRetStrings, tmpRetInts, tmpRetF32s, tmpRetF64s);
839+
}
840+
if (result1Cleanup) { result1Cleanup(); }
841+
if (result2Cleanup) { result2Cleanup(); }
842+
return optResult;
843+
},
817844
APIResult: APIResultValues,
818845
ComplexResult: ComplexResultValues,
819846
APIOptionalResult: APIOptionalResultValues,

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/ExportSwiftTests/EnumAssociatedValue.json

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,52 @@
787787
}
788788
}
789789
}
790+
},
791+
{
792+
"abiName" : "bjs_compareAPIResults",
793+
"effects" : {
794+
"isAsync" : false,
795+
"isStatic" : false,
796+
"isThrows" : false
797+
},
798+
"name" : "compareAPIResults",
799+
"parameters" : [
800+
{
801+
"label" : "result1",
802+
"name" : "result1",
803+
"type" : {
804+
"optional" : {
805+
"_0" : {
806+
"associatedValueEnum" : {
807+
"_0" : "APIOptionalResult"
808+
}
809+
}
810+
}
811+
}
812+
},
813+
{
814+
"label" : "result2",
815+
"name" : "result2",
816+
"type" : {
817+
"optional" : {
818+
"_0" : {
819+
"associatedValueEnum" : {
820+
"_0" : "APIOptionalResult"
821+
}
822+
}
823+
}
824+
}
825+
}
826+
],
827+
"returnType" : {
828+
"optional" : {
829+
"_0" : {
830+
"associatedValueEnum" : {
831+
"_0" : "APIOptionalResult"
832+
}
833+
}
834+
}
835+
}
790836
}
791837
],
792838
"moduleName" : "TestModule",

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/ExportSwiftTests/EnumAssociatedValue.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,4 +606,15 @@ public func _bjs_roundTripOptionalAPIOptionalResult(resultIsSome: Int32, resultC
606606
#else
607607
fatalError("Only available on WebAssembly")
608608
#endif
609+
}
610+
611+
@_expose(wasm, "bjs_compareAPIResults")
612+
@_cdecl("bjs_compareAPIResults")
613+
public func _bjs_compareAPIResults(result1IsSome: Int32, result1CaseId: Int32, result2IsSome: Int32, result2CaseId: Int32) -> Void {
614+
#if arch(wasm32)
615+
let ret = compareAPIResults(result1: Optional<APIOptionalResult>.bridgeJSLiftParameter(result1IsSome, result1CaseId), result2: Optional<APIOptionalResult>.bridgeJSLiftParameter(result2IsSome, result2CaseId))
616+
return ret.bridgeJSLowerReturn()
617+
#else
618+
fatalError("Only available on WebAssembly")
619+
#endif
609620
}

0 commit comments

Comments
 (0)