Skip to content

Commit 568df63

Browse files
committed
BridgeJS: Migrate to stack based solution for storing / passing value types
1 parent 516e247 commit 568df63

39 files changed

+1376
-1539
lines changed

Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Lines changed: 27 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,17 +1042,10 @@ public class ExportSwift {
10421042
let typeName = enumDef.swiftCallName
10431043
return """
10441044
private extension \(raw: typeName) {
1045-
static func bridgeJSLiftParameter(_ caseId: Int32, _ paramsId: Int32, _ paramsLen: Int32) -> \(raw: typeName) {
1046-
let params: [UInt8] = .init(unsafeUninitializedCapacity: Int(paramsLen)) { buf, initializedCount in
1047-
_swift_js_init_memory(paramsId, buf.baseAddress.unsafelyUnwrapped)
1048-
initializedCount = Int(paramsLen)
1049-
}
1050-
return params.withUnsafeBytes { raw in
1051-
var reader = _BJSBinaryReader(raw: raw)
1052-
switch caseId {
1053-
\(raw: generateBinaryLiftSwitchCases(enumDef: enumDef).joined(separator: "\n"))
1054-
default: fatalError("Unknown \(raw: typeName) case ID: \\(caseId)")
1055-
}
1045+
static func bridgeJSLiftParameter(_ caseId: Int32) -> \(raw: typeName) {
1046+
switch caseId {
1047+
\(raw: generateStackLiftSwitchCases(enumDef: enumDef).joined(separator: "\n"))
1048+
default: fatalError("Unknown \(raw: typeName) case ID: \\(caseId)")
10561049
}
10571050
}
10581051
@@ -1065,43 +1058,37 @@ public class ExportSwift {
10651058
"""
10661059
}
10671060

1068-
private func generateBinaryLiftSwitchCases(enumDef: ExportedEnum) -> [String] {
1061+
private func generateStackLiftSwitchCases(enumDef: ExportedEnum) -> [String] {
10691062
var cases: [String] = []
10701063
for (caseIndex, enumCase) in enumDef.cases.enumerated() {
10711064
if enumCase.associatedValues.isEmpty {
10721065
cases.append("case \(caseIndex): return .\(enumCase.name)")
10731066
} else {
10741067
var lines: [String] = []
10751068
lines.append("case \(caseIndex):")
1076-
lines.append("reader.readParamCount(expected: \(enumCase.associatedValues.count))")
1077-
var argList: [String] = []
1078-
1079-
for (paramIndex, associatedValue) in enumCase.associatedValues.enumerated() {
1080-
let paramName = associatedValue.label ?? "param\(paramIndex)"
1081-
argList.append(paramName)
1082-
1069+
let argList = enumCase.associatedValues.map { associatedValue in
1070+
let paramName: String
1071+
if let label = associatedValue.label {
1072+
paramName = "\(label): "
1073+
} else {
1074+
paramName = ""
1075+
}
10831076
switch associatedValue.type {
10841077
case .string:
1085-
lines.append("reader.expectTag(.string)")
1086-
lines.append("let \(paramName) = reader.readString()")
1078+
return
1079+
"\(paramName)String.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32())"
10871080
case .int:
1088-
lines.append("reader.expectTag(.int32)")
1089-
lines.append("let \(paramName) = Int(reader.readInt32())")
1081+
return "\(paramName)Int.bridgeJSLiftParameter(_swift_js_pop_param_int32())"
10901082
case .bool:
1091-
lines.append("reader.expectTag(.bool)")
1092-
lines.append("let \(paramName) = Int32(reader.readUInt8()) != 0")
1083+
return "\(paramName)Bool.bridgeJSLiftParameter(_swift_js_pop_param_int32())"
10931084
case .float:
1094-
lines.append("reader.expectTag(.float32)")
1095-
lines.append("let \(paramName) = reader.readFloat32()")
1085+
return "\(paramName)Float.bridgeJSLiftParameter(_swift_js_pop_param_f32())"
10961086
case .double:
1097-
lines.append("reader.expectTag(.float64)")
1098-
lines.append("let \(paramName) = reader.readFloat64()")
1087+
return "\(paramName)Double.bridgeJSLiftParameter(_swift_js_pop_param_f64())"
10991088
default:
1100-
lines.append("reader.expectTag(.int32)")
1101-
lines.append("let \(paramName) = reader.readInt32()")
1089+
return "\(paramName)Int.bridgeJSLiftParameter(_swift_js_pop_param_int32())"
11021090
}
11031091
}
1104-
11051092
lines.append("return .\(enumCase.name)(\(argList.joined(separator: ", ")))")
11061093
cases.append(lines.joined(separator: "\n"))
11071094
}
@@ -1114,26 +1101,26 @@ public class ExportSwift {
11141101
for (caseIndex, enumCase) in enumDef.cases.enumerated() {
11151102
if enumCase.associatedValues.isEmpty {
11161103
cases.append("case .\(enumCase.name):")
1117-
cases.append("_swift_js_return_tag(Int32(\(caseIndex)))")
1104+
cases.append("_swift_js_push_tag(Int32(\(caseIndex)))")
11181105
} else {
11191106
var bodyLines: [String] = []
1120-
bodyLines.append("_swift_js_return_tag(Int32(\(caseIndex)))")
1107+
bodyLines.append("_swift_js_push_tag(Int32(\(caseIndex)))")
11211108
for (index, associatedValue) in enumCase.associatedValues.enumerated() {
11221109
let paramName = associatedValue.label ?? "param\(index)"
11231110
switch associatedValue.type {
11241111
case .string:
11251112
bodyLines.append("var __bjs_\(paramName) = \(paramName)")
11261113
bodyLines.append("__bjs_\(paramName).withUTF8 { ptr in")
1127-
bodyLines.append("_swift_js_return_string(ptr.baseAddress, Int32(ptr.count))")
1114+
bodyLines.append("_swift_js_push_string(ptr.baseAddress, Int32(ptr.count))")
11281115
bodyLines.append("}")
11291116
case .int:
1130-
bodyLines.append("_swift_js_return_int(Int32(\(paramName)))")
1117+
bodyLines.append("_swift_js_push_int(Int32(\(paramName)))")
11311118
case .bool:
1132-
bodyLines.append("_swift_js_return_bool(\(paramName) ? 1 : 0)")
1119+
bodyLines.append("_swift_js_push_int(\(paramName) ? 1 : 0)")
11331120
case .float:
1134-
bodyLines.append("_swift_js_return_f32(\(paramName))")
1121+
bodyLines.append("_swift_js_push_f32(\(paramName))")
11351122
case .double:
1136-
bodyLines.append("_swift_js_return_f64(\(paramName))")
1123+
bodyLines.append("_swift_js_push_f64(\(paramName))")
11371124
default:
11381125
bodyLines.append(
11391126
"preconditionFailure(\"BridgeJS: unsupported associated value type in generated code\")"
@@ -1410,7 +1397,7 @@ extension BridgeType {
14101397
static let void = LiftingIntrinsicInfo(parameters: [])
14111398
static let caseEnum = LiftingIntrinsicInfo(parameters: [("value", .i32)])
14121399
static let associatedValueEnum = LiftingIntrinsicInfo(parameters: [
1413-
("caseId", .i32), ("paramsId", .i32), ("paramsLen", .i32),
1400+
("caseId", .i32)
14141401
])
14151402
}
14161403

0 commit comments

Comments
 (0)