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