@@ -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}
0 commit comments