Skip to content

Commit a77ee78

Browse files
authored
Merge pull request #621 from swiftwasm/yt/rename-stack-abi-ops
[NFC] BridgeJS: Minimize enum with assoc values code generation
2 parents 9ddfda9 + e129b41 commit a77ee78

File tree

9 files changed

+76
-924
lines changed

9 files changed

+76
-924
lines changed

Benchmarks/Sources/Generated/BridgeJS.swift

Lines changed: 4 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
@_spi(BridgeJS) import JavaScriptKit
99

1010
extension APIResult: _BridgedSwiftAssociatedValueEnum {
11-
private static func _bridgeJSLiftFromCaseId(_ caseId: Int32) -> APIResult {
11+
@_spi(BridgeJS) @_transparent public static func bridgeJSStackPopPayload(_ caseId: Int32) -> APIResult {
1212
switch caseId {
1313
case 0:
1414
return .success(String.bridgeJSLiftParameter())
@@ -27,9 +27,7 @@ extension APIResult: _BridgedSwiftAssociatedValueEnum {
2727
}
2828
}
2929

30-
// MARK: Protocol Export
31-
32-
@_spi(BridgeJS) @_transparent public consuming func bridgeJSLowerParameter() -> Int32 {
30+
@_spi(BridgeJS) @_transparent public consuming func bridgeJSStackPushPayload() -> Int32 {
3331
switch self {
3432
case .success(let param0):
3533
param0.bridgeJSLowerStackReturn()
@@ -50,42 +48,10 @@ extension APIResult: _BridgedSwiftAssociatedValueEnum {
5048
return Int32(5)
5149
}
5250
}
53-
54-
@_spi(BridgeJS) @_transparent public static func bridgeJSLiftReturn(_ caseId: Int32) -> APIResult {
55-
return _bridgeJSLiftFromCaseId(caseId)
56-
}
57-
58-
// MARK: ExportSwift
59-
60-
@_spi(BridgeJS) @_transparent public static func bridgeJSLiftParameter(_ caseId: Int32) -> APIResult {
61-
return _bridgeJSLiftFromCaseId(caseId)
62-
}
63-
64-
@_spi(BridgeJS) @_transparent public consuming func bridgeJSLowerReturn() {
65-
switch self {
66-
case .success(let param0):
67-
param0.bridgeJSLowerStackReturn()
68-
_swift_js_push_i32(Int32(0))
69-
case .failure(let param0):
70-
param0.bridgeJSLowerStackReturn()
71-
_swift_js_push_i32(Int32(1))
72-
case .flag(let param0):
73-
param0.bridgeJSLowerStackReturn()
74-
_swift_js_push_i32(Int32(2))
75-
case .rate(let param0):
76-
param0.bridgeJSLowerStackReturn()
77-
_swift_js_push_i32(Int32(3))
78-
case .precise(let param0):
79-
param0.bridgeJSLowerStackReturn()
80-
_swift_js_push_i32(Int32(4))
81-
case .info:
82-
_swift_js_push_i32(Int32(5))
83-
}
84-
}
8551
}
8652

8753
extension ComplexResult: _BridgedSwiftAssociatedValueEnum {
88-
private static func _bridgeJSLiftFromCaseId(_ caseId: Int32) -> ComplexResult {
54+
@_spi(BridgeJS) @_transparent public static func bridgeJSStackPopPayload(_ caseId: Int32) -> ComplexResult {
8955
switch caseId {
9056
case 0:
9157
return .success(String.bridgeJSLiftParameter())
@@ -106,9 +72,7 @@ extension ComplexResult: _BridgedSwiftAssociatedValueEnum {
10672
}
10773
}
10874

109-
// MARK: Protocol Export
110-
111-
@_spi(BridgeJS) @_transparent public consuming func bridgeJSLowerParameter() -> Int32 {
75+
@_spi(BridgeJS) @_transparent public consuming func bridgeJSStackPushPayload() -> Int32 {
11276
switch self {
11377
case .success(let param0):
11478
param0.bridgeJSLowerStackReturn()
@@ -147,56 +111,6 @@ extension ComplexResult: _BridgedSwiftAssociatedValueEnum {
147111
return Int32(6)
148112
}
149113
}
150-
151-
@_spi(BridgeJS) @_transparent public static func bridgeJSLiftReturn(_ caseId: Int32) -> ComplexResult {
152-
return _bridgeJSLiftFromCaseId(caseId)
153-
}
154-
155-
// MARK: ExportSwift
156-
157-
@_spi(BridgeJS) @_transparent public static func bridgeJSLiftParameter(_ caseId: Int32) -> ComplexResult {
158-
return _bridgeJSLiftFromCaseId(caseId)
159-
}
160-
161-
@_spi(BridgeJS) @_transparent public consuming func bridgeJSLowerReturn() {
162-
switch self {
163-
case .success(let param0):
164-
param0.bridgeJSLowerStackReturn()
165-
_swift_js_push_i32(Int32(0))
166-
case .error(let param0, let param1):
167-
param0.bridgeJSLowerStackReturn()
168-
param1.bridgeJSLowerStackReturn()
169-
_swift_js_push_i32(Int32(1))
170-
case .location(let param0, let param1, let param2):
171-
param0.bridgeJSLowerStackReturn()
172-
param1.bridgeJSLowerStackReturn()
173-
param2.bridgeJSLowerStackReturn()
174-
_swift_js_push_i32(Int32(2))
175-
case .status(let param0, let param1, let param2):
176-
param0.bridgeJSLowerStackReturn()
177-
param1.bridgeJSLowerStackReturn()
178-
param2.bridgeJSLowerStackReturn()
179-
_swift_js_push_i32(Int32(3))
180-
case .coordinates(let param0, let param1, let param2):
181-
param0.bridgeJSLowerStackReturn()
182-
param1.bridgeJSLowerStackReturn()
183-
param2.bridgeJSLowerStackReturn()
184-
_swift_js_push_i32(Int32(4))
185-
case .comprehensive(let param0, let param1, let param2, let param3, let param4, let param5, let param6, let param7, let param8):
186-
param0.bridgeJSLowerStackReturn()
187-
param1.bridgeJSLowerStackReturn()
188-
param2.bridgeJSLowerStackReturn()
189-
param3.bridgeJSLowerStackReturn()
190-
param4.bridgeJSLowerStackReturn()
191-
param5.bridgeJSLowerStackReturn()
192-
param6.bridgeJSLowerStackReturn()
193-
param7.bridgeJSLowerStackReturn()
194-
param8.bridgeJSLowerStackReturn()
195-
_swift_js_push_i32(Int32(5))
196-
case .info:
197-
_swift_js_push_i32(Int32(6))
198-
}
199-
}
200114
}
201115

202116
extension SimpleStruct: _BridgedSwiftStruct {

Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Lines changed: 6 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,7 +1199,9 @@ struct EnumCodegen {
11991199
let printer = CodeFragmentPrinter()
12001200
printer.write("extension \(typeName): _BridgedSwiftAssociatedValueEnum {")
12011201
printer.indent {
1202-
printer.write("private static func _bridgeJSLiftFromCaseId(_ caseId: Int32) -> \(typeName) {")
1202+
printer.write(
1203+
"@_spi(BridgeJS) @_transparent public static func bridgeJSStackPopPayload(_ caseId: Int32) -> \(typeName) {"
1204+
)
12031205
printer.indent {
12041206
printer.write("switch caseId {")
12051207
generateStackLiftSwitchCases(printer: printer, enumDef: enumDef)
@@ -1212,40 +1214,7 @@ struct EnumCodegen {
12121214
printer.write("}")
12131215
printer.nextLine()
12141216

1215-
printer.write("// MARK: Protocol Export")
1216-
printer.nextLine()
1217-
1218-
printer.write("@_spi(BridgeJS) @_transparent public consuming func bridgeJSLowerParameter() -> Int32 {")
1219-
printer.indent {
1220-
printer.write("switch self {")
1221-
generateLowerParameterSwitchCases(printer: printer, enumDef: enumDef)
1222-
printer.write("}")
1223-
}
1224-
printer.write("}")
1225-
printer.nextLine()
1226-
1227-
printer.write(
1228-
multilineString: """
1229-
@_spi(BridgeJS) @_transparent public static func bridgeJSLiftReturn(_ caseId: Int32) -> \(typeName) {
1230-
return _bridgeJSLiftFromCaseId(caseId)
1231-
}
1232-
"""
1233-
)
1234-
printer.nextLine()
1235-
1236-
printer.write("// MARK: ExportSwift")
1237-
printer.nextLine()
1238-
1239-
printer.write(
1240-
multilineString: """
1241-
@_spi(BridgeJS) @_transparent public static func bridgeJSLiftParameter(_ caseId: Int32) -> \(typeName) {
1242-
return _bridgeJSLiftFromCaseId(caseId)
1243-
}
1244-
"""
1245-
)
1246-
printer.nextLine()
1247-
1248-
printer.write("@_spi(BridgeJS) @_transparent public consuming func bridgeJSLowerReturn() {")
1217+
printer.write("@_spi(BridgeJS) @_transparent public consuming func bridgeJSStackPushPayload() -> Int32 {")
12491218
printer.indent {
12501219
printer.write("switch self {")
12511220
generateReturnSwitchCases(printer: printer, enumDef: enumDef)
@@ -1298,32 +1267,12 @@ struct EnumCodegen {
12981267
}
12991268
}
13001269

1301-
private func generateLowerParameterSwitchCases(printer: CodeFragmentPrinter, enumDef: ExportedEnum) {
1302-
for (caseIndex, enumCase) in enumDef.cases.enumerated() {
1303-
if enumCase.associatedValues.isEmpty {
1304-
printer.write("case .\(enumCase.name):")
1305-
printer.indent {
1306-
printer.write("return Int32(\(caseIndex))")
1307-
}
1308-
} else {
1309-
let pattern = enumCase.associatedValues.enumerated()
1310-
.map { index, associatedValue in "let \(associatedValue.label ?? "param\(index)")" }
1311-
.joined(separator: ", ")
1312-
printer.write("case .\(enumCase.name)(\(pattern)):")
1313-
printer.indent {
1314-
generatePayloadPushingCode(printer: printer, associatedValues: enumCase.associatedValues)
1315-
printer.write("return Int32(\(caseIndex))")
1316-
}
1317-
}
1318-
}
1319-
}
1320-
13211270
private func generateReturnSwitchCases(printer: CodeFragmentPrinter, enumDef: ExportedEnum) {
13221271
for (caseIndex, enumCase) in enumDef.cases.enumerated() {
13231272
if enumCase.associatedValues.isEmpty {
13241273
printer.write("case .\(enumCase.name):")
13251274
printer.indent {
1326-
printer.write("_swift_js_push_i32(Int32(\(caseIndex)))")
1275+
printer.write("return Int32(\(caseIndex))")
13271276
}
13281277
} else {
13291278
let pattern = enumCase.associatedValues.enumerated()
@@ -1334,7 +1283,7 @@ struct EnumCodegen {
13341283
generatePayloadPushingCode(printer: printer, associatedValues: enumCase.associatedValues)
13351284
// Push tag AFTER payloads so it's popped first (LIFO) by the JS lift function.
13361285
// This ensures nested enum tags don't overwrite the outer tag.
1337-
printer.write("_swift_js_push_i32(Int32(\(caseIndex)))")
1286+
printer.write("return Int32(\(caseIndex))")
13381287
}
13391288
}
13401289
}

0 commit comments

Comments
 (0)