Skip to content

Commit 64f224c

Browse files
committed
BridgeJS: Replace per-type ABI switches with unified BridgeTypeDescriptor
1 parent db42577 commit 64f224c

File tree

8 files changed

+302
-307
lines changed

8 files changed

+302
-307
lines changed

Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Lines changed: 22 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -888,7 +888,6 @@ struct StackCodegen {
888888
accessor: String,
889889
varPrefix: String
890890
) -> [CodeBlockItemSyntax] {
891-
// Handle containers and optionals first (recursive/special structure)
892891
switch type {
893892

894893
case .nullable(let wrappedType, _):
@@ -901,24 +900,14 @@ struct StackCodegen {
901900
break
902901
}
903902

904-
// Handle types that need accessor transformation before lowering
905-
switch type {
906-
case .jsObject(let className?) where className != "JSObject":
907-
return ["\(raw: accessor).jsObject.bridgeJSLowerStackReturn()"]
908-
case .swiftProtocol(let protocolName):
909-
let wrapperName = "Any\(protocolName)"
910-
return ["(\(raw: accessor) as! \(raw: wrapperName)).bridgeJSLowerStackReturn()"]
911-
default:
912-
break
913-
}
914-
915-
// Family-based lowering
916-
switch type.abiFamily {
917-
case .directScalar, .directMultiWord:
918-
return ["\(raw: accessor).bridgeJSLowerStackReturn()"]
919-
case .taggedPayload, .stackBased:
920-
return ["\(raw: accessor).bridgeJSLowerReturn()"]
921-
case .void:
903+
let desc = type.descriptor
904+
let transformed = desc.accessorTransform.apply(accessor)
905+
switch desc.lowerMethod {
906+
case .stackReturn:
907+
return ["\(raw: transformed).bridgeJSLowerStackReturn()"]
908+
case .fullReturn, .pushParameter:
909+
return ["\(raw: transformed).bridgeJSLowerReturn()"]
910+
case .none:
922911
return []
923912
}
924913
}
@@ -1033,8 +1022,7 @@ struct StackCodegen {
10331022
accessor: String,
10341023
varPrefix: String
10351024
) -> [CodeBlockItemSyntax] {
1036-
// Stack-based types use the generic Optional conformance directly
1037-
if wrappedType.abiFamily == .stackBased {
1025+
if wrappedType.descriptor.optionalUsesStackABI {
10381026
return ["\(raw: accessor).bridgeJSLowerReturn()"]
10391027
}
10401028

@@ -1062,23 +1050,16 @@ struct StackCodegen {
10621050
unwrappedVar: String,
10631051
varPrefix: String
10641052
) -> [CodeBlockItemSyntax] {
1065-
// Handle types needing accessor transformation
1066-
switch wrappedType {
1067-
case .jsObject(let className?) where className != "JSObject":
1068-
return ["\(raw: unwrappedVar).jsObject.bridgeJSLowerStackReturn()"]
1069-
default:
1070-
break
1071-
}
1072-
1073-
// Family-based lowering for unwrapped optional values
1074-
switch wrappedType.abiFamily {
1075-
case .directScalar, .directMultiWord:
1076-
return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"]
1077-
case .taggedPayload:
1078-
return ["_swift_js_push_i32(\(raw: unwrappedVar).bridgeJSLowerParameter())"]
1079-
case .stackBased:
1080-
return ["\(raw: unwrappedVar).bridgeJSLowerReturn()"]
1081-
case .void:
1053+
let desc = wrappedType.descriptor
1054+
let transformed = desc.accessorTransform.apply(unwrappedVar)
1055+
switch desc.lowerMethod {
1056+
case .stackReturn:
1057+
return ["\(raw: transformed).bridgeJSLowerStackReturn()"]
1058+
case .fullReturn:
1059+
return ["\(raw: transformed).bridgeJSLowerReturn()"]
1060+
case .pushParameter:
1061+
return ["_swift_js_push_i32(\(raw: transformed).bridgeJSLowerParameter())"]
1062+
case .none:
10821063
return ["preconditionFailure(\"BridgeJS: unsupported optional wrapped type\")"]
10831064
}
10841065
}
@@ -1703,101 +1684,22 @@ extension BridgeType {
17031684
case .namespaceEnum:
17041685
throw BridgeJSCoreError("Namespace enums are not supported to pass as parameters")
17051686
default:
1706-
return liftParameterInfoForNonOptional()
1707-
}
1708-
}
1709-
1710-
private func liftParameterInfoForNonOptional() -> LiftingIntrinsicInfo {
1711-
switch abiFamily {
1712-
case .directScalar(let wasmType):
1713-
let name: String
1714-
switch self {
1715-
case .closure: name = "callbackId"
1716-
default: name = "value"
1717-
}
1718-
return LiftingIntrinsicInfo(parameters: [(name, wasmType)])
1719-
case .directMultiWord:
1720-
switch self {
1721-
case .string:
1722-
return .string
1723-
case .jsValue:
1724-
return .jsValue
1725-
case .rawValueEnum(_, let rawType):
1726-
return rawType.liftingIntrinsicInfo
1727-
default:
1728-
fatalError("Unexpected directMultiWord type: \(self)")
1729-
}
1730-
case .taggedPayload:
1731-
return .associatedValueEnum
1732-
case .stackBased:
1733-
return LiftingIntrinsicInfo(parameters: [])
1734-
case .void:
1735-
return .void
1687+
return LiftingIntrinsicInfo(parameters: descriptor.wasmParams)
17361688
}
17371689
}
17381690

17391691
struct LoweringIntrinsicInfo: Sendable {
17401692
let returnType: WasmCoreType?
1741-
1742-
static let bool = LoweringIntrinsicInfo(returnType: .i32)
1743-
static let int = LoweringIntrinsicInfo(returnType: .i32)
1744-
static let float = LoweringIntrinsicInfo(returnType: .f32)
1745-
static let double = LoweringIntrinsicInfo(returnType: .f64)
1746-
static let string = LoweringIntrinsicInfo(returnType: nil)
1747-
static let jsObject = LoweringIntrinsicInfo(returnType: .i32)
1748-
static let jsValue = LoweringIntrinsicInfo(returnType: nil)
1749-
static let swiftHeapObject = LoweringIntrinsicInfo(returnType: .pointer)
1750-
static let unsafePointer = LoweringIntrinsicInfo(returnType: .pointer)
1751-
static let void = LoweringIntrinsicInfo(returnType: nil)
1752-
static let caseEnum = LoweringIntrinsicInfo(returnType: .i32)
1753-
static let rawValueEnum = LoweringIntrinsicInfo(returnType: .i32)
1754-
static let associatedValueEnum = LoweringIntrinsicInfo(returnType: nil)
1755-
static let swiftStruct = LoweringIntrinsicInfo(returnType: nil)
1756-
static let optional = LoweringIntrinsicInfo(returnType: nil)
1757-
static let array = LoweringIntrinsicInfo(returnType: nil)
17581693
}
17591694

17601695
func loweringReturnInfo() throws -> LoweringIntrinsicInfo {
17611696
switch self {
17621697
case .nullable:
1763-
return .optional
1698+
return LoweringIntrinsicInfo(returnType: nil)
17641699
case .namespaceEnum:
17651700
throw BridgeJSCoreError("Namespace enums are not supported to pass as parameters")
17661701
default:
1767-
return loweringReturnInfoForNonOptional()
1768-
}
1769-
}
1770-
1771-
private func loweringReturnInfoForNonOptional() -> LoweringIntrinsicInfo {
1772-
switch abiFamily {
1773-
case .directScalar(let wasmType):
1774-
return LoweringIntrinsicInfo(returnType: wasmType)
1775-
case .directMultiWord, .stackBased, .taggedPayload:
1776-
return LoweringIntrinsicInfo(returnType: nil)
1777-
case .void:
1778-
return .void
1779-
}
1780-
}
1781-
}
1782-
1783-
extension SwiftEnumRawType {
1784-
var liftingIntrinsicInfo: BridgeType.LiftingIntrinsicInfo {
1785-
switch self {
1786-
case .bool: return .bool
1787-
case .int, .int32, .int64, .uint, .uint32, .uint64: return .int
1788-
case .float: return .float
1789-
case .double: return .double
1790-
case .string: return .string
1791-
}
1792-
}
1793-
1794-
var loweringIntrinsicInfo: BridgeType.LoweringIntrinsicInfo {
1795-
switch self {
1796-
case .bool: return .bool
1797-
case .int, .int32, .int64, .uint, .uint32, .uint64: return .int
1798-
case .float: return .float
1799-
case .double: return .double
1800-
case .string: return .string
1702+
return LoweringIntrinsicInfo(returnType: descriptor.wasmReturnType)
18011703
}
18021704
}
18031705
}

Plugins/BridgeJS/Sources/BridgeJSCore/ImportTS.swift

Lines changed: 11 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -695,19 +695,6 @@ enum SwiftCodePattern {
695695
extension BridgeType {
696696
struct LoweringParameterInfo {
697697
let loweredParameters: [(name: String, type: WasmCoreType)]
698-
699-
static let bool = LoweringParameterInfo(loweredParameters: [("value", .i32)])
700-
static let int = LoweringParameterInfo(loweredParameters: [("value", .i32)])
701-
static let float = LoweringParameterInfo(loweredParameters: [("value", .f32)])
702-
static let double = LoweringParameterInfo(loweredParameters: [("value", .f64)])
703-
static let string = LoweringParameterInfo(loweredParameters: [("value", .i32)])
704-
static let jsObject = LoweringParameterInfo(loweredParameters: [("value", .i32)])
705-
static let jsValue = LoweringParameterInfo(loweredParameters: [
706-
("kind", .i32),
707-
("payload1", .i32),
708-
("payload2", .f64),
709-
])
710-
static let void = LoweringParameterInfo(loweredParameters: [])
711698
}
712699

713700
func loweringParameterInfo(context: BridgeContext = .importTS) throws -> LoweringParameterInfo {
@@ -732,57 +719,22 @@ extension BridgeType {
732719
}
733720

734721
private func loweringParameterInfoForNonOptional(context: BridgeContext) throws -> LoweringParameterInfo {
735-
// Special context-dependent overrides
736-
if context == .importTS {
737-
switch self {
738-
case .swiftStruct:
739-
return LoweringParameterInfo(loweredParameters: [("objectId", .i32)])
740-
default:
741-
break
742-
}
722+
switch self {
723+
case .swiftStruct where context == .importTS:
724+
return LoweringParameterInfo(loweredParameters: [("objectId", .i32)])
725+
case .string:
726+
return LoweringParameterInfo(loweredParameters: [("value", .i32)])
727+
case .rawValueEnum(_, .string):
728+
return LoweringParameterInfo(loweredParameters: [("value", .i32)])
729+
default:
730+
break
743731
}
744732

745-
switch abiFamily {
746-
case .directScalar(let wasmType):
747-
let name: String
748-
switch self {
749-
case .closure: name = "funcRef"
750-
case .swiftHeapObject, .unsafePointer: name = "pointer"
751-
default: name = "value"
752-
}
753-
return LoweringParameterInfo(loweredParameters: [(name, wasmType)])
754-
case .directMultiWord:
755-
switch self {
756-
case .string:
757-
return .string
758-
case .jsValue:
759-
return .jsValue
760-
case .rawValueEnum(_, let rawType):
761-
let wasmType = rawType.wasmCoreType ?? .i32
762-
return LoweringParameterInfo(loweredParameters: [("value", wasmType)])
763-
default:
764-
fatalError("Unexpected directMultiWord type: \(self)")
765-
}
766-
case .taggedPayload:
767-
return LoweringParameterInfo(loweredParameters: [("caseId", .i32)])
768-
case .stackBased:
769-
return LoweringParameterInfo(loweredParameters: [])
770-
case .void:
771-
return .void
772-
}
733+
return LoweringParameterInfo(loweredParameters: descriptor.wasmParams)
773734
}
774735

775736
struct LiftingReturnInfo {
776737
let valueToLift: WasmCoreType?
777-
778-
static let bool = LiftingReturnInfo(valueToLift: .i32)
779-
static let int = LiftingReturnInfo(valueToLift: .i32)
780-
static let float = LiftingReturnInfo(valueToLift: .f32)
781-
static let double = LiftingReturnInfo(valueToLift: .f64)
782-
static let string = LiftingReturnInfo(valueToLift: .i32)
783-
static let jsObject = LiftingReturnInfo(valueToLift: .i32)
784-
static let jsValue = LiftingReturnInfo(valueToLift: nil)
785-
static let void = LiftingReturnInfo(valueToLift: nil)
786738
}
787739

788740
func liftingReturnInfo(
@@ -807,7 +759,6 @@ extension BridgeType {
807759
}
808760

809761
private func liftingReturnInfoForNonOptional(context: BridgeContext) -> LiftingReturnInfo {
810-
// Special context-dependent overrides
811762
if context == .importTS {
812763
switch self {
813764
case .swiftStruct:
@@ -816,29 +767,7 @@ extension BridgeType {
816767
break
817768
}
818769
}
819-
820-
switch abiFamily {
821-
case .directScalar(let wasmType):
822-
return LiftingReturnInfo(valueToLift: wasmType)
823-
case .directMultiWord:
824-
switch self {
825-
case .string:
826-
return .string
827-
case .jsValue:
828-
return .jsValue
829-
case .rawValueEnum(_, let rawType):
830-
let wasmType = rawType.wasmCoreType ?? .i32
831-
return LiftingReturnInfo(valueToLift: wasmType)
832-
default:
833-
fatalError("Unexpected directMultiWord type: \(self)")
834-
}
835-
case .taggedPayload:
836-
return LiftingReturnInfo(valueToLift: .i32)
837-
case .stackBased:
838-
return LiftingReturnInfo(valueToLift: nil)
839-
case .void:
840-
return .void
841-
}
770+
return LiftingReturnInfo(valueToLift: descriptor.importReturnType)
842771
}
843772
}
844773

0 commit comments

Comments
 (0)