Skip to content

Commit 9ee3c40

Browse files
committed
BridgeJS: Replace per-type ABI switches with unified BridgeTypeDescriptor
1 parent 3c75e68 commit 9ee3c40

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
@@ -916,7 +916,6 @@ struct StackCodegen {
916916
accessor: String,
917917
varPrefix: String
918918
) -> [CodeBlockItemSyntax] {
919-
// Handle containers and optionals first (recursive/special structure)
920919
switch type {
921920
case .nullable(let wrappedType, _):
922921
return lowerOptionalStatements(wrappedType: wrappedType, accessor: accessor, varPrefix: varPrefix)
@@ -928,24 +927,14 @@ struct StackCodegen {
928927
break
929928
}
930929

931-
// Handle types that need accessor transformation before lowering
932-
switch type {
933-
case .jsObject(let className?) where className != "JSObject":
934-
return ["\(raw: accessor).jsObject.bridgeJSLowerStackReturn()"]
935-
case .swiftProtocol(let protocolName):
936-
let wrapperName = "Any\(protocolName)"
937-
return ["(\(raw: accessor) as! \(raw: wrapperName)).bridgeJSLowerStackReturn()"]
938-
default:
939-
break
940-
}
941-
942-
// Family-based lowering
943-
switch type.abiFamily {
944-
case .directScalar, .directMultiWord:
945-
return ["\(raw: accessor).bridgeJSLowerStackReturn()"]
946-
case .taggedPayload, .stackBased:
947-
return ["\(raw: accessor).bridgeJSLowerReturn()"]
948-
case .void:
930+
let desc = type.descriptor
931+
let transformed = desc.accessorTransform.apply(accessor)
932+
switch desc.lowerMethod {
933+
case .stackReturn:
934+
return ["\(raw: transformed).bridgeJSLowerStackReturn()"]
935+
case .fullReturn, .pushParameter:
936+
return ["\(raw: transformed).bridgeJSLowerReturn()"]
937+
case .none:
949938
return []
950939
}
951940
}
@@ -1060,8 +1049,7 @@ struct StackCodegen {
10601049
accessor: String,
10611050
varPrefix: String
10621051
) -> [CodeBlockItemSyntax] {
1063-
// Stack-based types use the generic Optional conformance directly
1064-
if wrappedType.abiFamily == .stackBased {
1052+
if wrappedType.descriptor.optionalUsesStackABI {
10651053
return ["\(raw: accessor).bridgeJSLowerReturn()"]
10661054
}
10671055

@@ -1089,23 +1077,16 @@ struct StackCodegen {
10891077
unwrappedVar: String,
10901078
varPrefix: String
10911079
) -> [CodeBlockItemSyntax] {
1092-
// Handle types needing accessor transformation
1093-
switch wrappedType {
1094-
case .jsObject(let className?) where className != "JSObject":
1095-
return ["\(raw: unwrappedVar).jsObject.bridgeJSLowerStackReturn()"]
1096-
default:
1097-
break
1098-
}
1099-
1100-
// Family-based lowering for unwrapped optional values
1101-
switch wrappedType.abiFamily {
1102-
case .directScalar, .directMultiWord:
1103-
return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"]
1104-
case .taggedPayload:
1105-
return ["_swift_js_push_i32(\(raw: unwrappedVar).bridgeJSLowerParameter())"]
1106-
case .stackBased:
1107-
return ["\(raw: unwrappedVar).bridgeJSLowerReturn()"]
1108-
case .void:
1080+
let desc = wrappedType.descriptor
1081+
let transformed = desc.accessorTransform.apply(unwrappedVar)
1082+
switch desc.lowerMethod {
1083+
case .stackReturn:
1084+
return ["\(raw: transformed).bridgeJSLowerStackReturn()"]
1085+
case .fullReturn:
1086+
return ["\(raw: transformed).bridgeJSLowerReturn()"]
1087+
case .pushParameter:
1088+
return ["_swift_js_push_i32(\(raw: transformed).bridgeJSLowerParameter())"]
1089+
case .none:
11091090
return ["preconditionFailure(\"BridgeJS: unsupported optional wrapped type\")"]
11101091
}
11111092
}
@@ -1730,101 +1711,22 @@ extension BridgeType {
17301711
case .namespaceEnum:
17311712
throw BridgeJSCoreError("Namespace enums are not supported to pass as parameters")
17321713
default:
1733-
return liftParameterInfoForNonOptional()
1734-
}
1735-
}
1736-
1737-
private func liftParameterInfoForNonOptional() -> LiftingIntrinsicInfo {
1738-
switch abiFamily {
1739-
case .directScalar(let wasmType):
1740-
let name: String
1741-
switch self {
1742-
case .closure: name = "callbackId"
1743-
default: name = "value"
1744-
}
1745-
return LiftingIntrinsicInfo(parameters: [(name, wasmType)])
1746-
case .directMultiWord:
1747-
switch self {
1748-
case .string:
1749-
return .string
1750-
case .jsValue:
1751-
return .jsValue
1752-
case .rawValueEnum(_, let rawType):
1753-
return rawType.liftingIntrinsicInfo
1754-
default:
1755-
fatalError("Unexpected directMultiWord type: \(self)")
1756-
}
1757-
case .taggedPayload:
1758-
return .associatedValueEnum
1759-
case .stackBased:
1760-
return LiftingIntrinsicInfo(parameters: [])
1761-
case .void:
1762-
return .void
1714+
return LiftingIntrinsicInfo(parameters: descriptor.wasmParams)
17631715
}
17641716
}
17651717

17661718
struct LoweringIntrinsicInfo: Sendable {
17671719
let returnType: WasmCoreType?
1768-
1769-
static let bool = LoweringIntrinsicInfo(returnType: .i32)
1770-
static let int = LoweringIntrinsicInfo(returnType: .i32)
1771-
static let float = LoweringIntrinsicInfo(returnType: .f32)
1772-
static let double = LoweringIntrinsicInfo(returnType: .f64)
1773-
static let string = LoweringIntrinsicInfo(returnType: nil)
1774-
static let jsObject = LoweringIntrinsicInfo(returnType: .i32)
1775-
static let jsValue = LoweringIntrinsicInfo(returnType: nil)
1776-
static let swiftHeapObject = LoweringIntrinsicInfo(returnType: .pointer)
1777-
static let unsafePointer = LoweringIntrinsicInfo(returnType: .pointer)
1778-
static let void = LoweringIntrinsicInfo(returnType: nil)
1779-
static let caseEnum = LoweringIntrinsicInfo(returnType: .i32)
1780-
static let rawValueEnum = LoweringIntrinsicInfo(returnType: .i32)
1781-
static let associatedValueEnum = LoweringIntrinsicInfo(returnType: nil)
1782-
static let swiftStruct = LoweringIntrinsicInfo(returnType: nil)
1783-
static let optional = LoweringIntrinsicInfo(returnType: nil)
1784-
static let array = LoweringIntrinsicInfo(returnType: nil)
17851720
}
17861721

17871722
func loweringReturnInfo() throws -> LoweringIntrinsicInfo {
17881723
switch self {
17891724
case .nullable:
1790-
return .optional
1725+
return LoweringIntrinsicInfo(returnType: nil)
17911726
case .namespaceEnum:
17921727
throw BridgeJSCoreError("Namespace enums are not supported to pass as parameters")
17931728
default:
1794-
return loweringReturnInfoForNonOptional()
1795-
}
1796-
}
1797-
1798-
private func loweringReturnInfoForNonOptional() -> LoweringIntrinsicInfo {
1799-
switch abiFamily {
1800-
case .directScalar(let wasmType):
1801-
return LoweringIntrinsicInfo(returnType: wasmType)
1802-
case .directMultiWord, .stackBased, .taggedPayload:
1803-
return LoweringIntrinsicInfo(returnType: nil)
1804-
case .void:
1805-
return .void
1806-
}
1807-
}
1808-
}
1809-
1810-
extension SwiftEnumRawType {
1811-
var liftingIntrinsicInfo: BridgeType.LiftingIntrinsicInfo {
1812-
switch self {
1813-
case .bool: return .bool
1814-
case .int, .int32, .int64, .uint, .uint32, .uint64: return .int
1815-
case .float: return .float
1816-
case .double: return .double
1817-
case .string: return .string
1818-
}
1819-
}
1820-
1821-
var loweringIntrinsicInfo: BridgeType.LoweringIntrinsicInfo {
1822-
switch self {
1823-
case .bool: return .bool
1824-
case .int, .int32, .int64, .uint, .uint32, .uint64: return .int
1825-
case .float: return .float
1826-
case .double: return .double
1827-
case .string: return .string
1729+
return LoweringIntrinsicInfo(returnType: descriptor.wasmReturnType)
18281730
}
18291731
}
18301732
}

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)