@@ -147,27 +147,7 @@ public class ExportSwift {
147147 } else {
148148 optionalSwiftType = " JSUndefinedOr "
149149 }
150- if case . array( let elementType) = wrappedType {
151- let arrayLift = StackCodegen ( ) . liftArrayExpression ( elementType: elementType)
152- let isSomeParam = argumentsToLift [ 0 ]
153- let swiftTypeName = elementType. swiftType
154- typeNameForIntrinsic = " \( optionalSwiftType) <[ \( swiftTypeName) ]> "
155- let absentExpr =
156- kind == . null
157- ? " \( optionalSwiftType) <[ \( swiftTypeName) ]>.none "
158- : " \( optionalSwiftType) <[ \( swiftTypeName) ]>.undefined "
159- liftingExpr = ExprSyntax (
160- """
161- {
162- if \( raw: isSomeParam) == 0 {
163- return \( raw: absentExpr)
164- } else {
165- return \( arrayLift)
166- }
167- }()
168- """
169- )
170- } else if case . swiftProtocol( let protocolName) = wrappedType {
150+ if case . swiftProtocol( let protocolName) = wrappedType {
171151 let wrapperName = " Any \( protocolName) "
172152 typeNameForIntrinsic = " \( optionalSwiftType) < \( wrapperName) > "
173153 liftingExpr = ExprSyntax (
@@ -919,43 +899,11 @@ struct StackCodegen {
919899 let typeName = kind == . null ? " Optional " : " JSUndefinedOr "
920900 switch wrappedType {
921901 case . string, . int, . uint, . bool, . float, . double, . jsObject( nil ) , . jsValue,
922- . swiftStruct, . swiftHeapObject, . caseEnum, . associatedValueEnum, . rawValueEnum:
902+ . swiftStruct, . swiftHeapObject, . caseEnum, . associatedValueEnum, . rawValueEnum,
903+ . array, . dictionary:
923904 return " \( raw: typeName) < \( raw: wrappedType. swiftType) >.bridgeJSLiftParameter() "
924905 case . jsObject( let className? ) :
925906 return " \( raw: typeName) <JSObject>.bridgeJSLiftParameter().map { \( raw: className) (unsafelyWrapping: $0) } "
926- case . array( let elementType) :
927- let arrayLift = liftArrayExpression ( elementType: elementType)
928- let swiftTypeName = elementType. swiftType
929- let absentExpr =
930- kind == . null
931- ? " \( typeName) <[ \( swiftTypeName) ]>.none " : " \( typeName) <[ \( swiftTypeName) ]>.undefined "
932- return """
933- {
934- let __isSome = _swift_js_pop_i32()
935- if __isSome == 0 {
936- return \( raw: absentExpr)
937- } else {
938- return \( arrayLift)
939- }
940- }()
941- """
942- case . dictionary( let valueType) :
943- let dictionaryLift = liftDictionaryExpression ( valueType: valueType)
944- let swiftTypeName = valueType. swiftType
945- let absentExpr =
946- kind == . null
947- ? " \( typeName) <[String: \( swiftTypeName) ]>.none "
948- : " \( typeName) <[String: \( swiftTypeName) ]>.undefined "
949- return """
950- {
951- let __isSome = _swift_js_pop_i32()
952- if __isSome == 0 {
953- return \( raw: absentExpr)
954- } else {
955- return \( dictionaryLift)
956- }
957- }()
958- """
959907 case . nullable, . void, . namespaceEnum, . closure, . unsafePointer, . swiftProtocol:
960908 fatalError ( " Invalid nullable wrapped type: \( wrappedType) " )
961909 }
@@ -1112,6 +1060,13 @@ struct StackCodegen {
11121060 accessor: String ,
11131061 varPrefix: String
11141062 ) -> [ CodeBlockItemSyntax ] {
1063+ switch wrappedType {
1064+ case . array, . dictionary, . swiftStruct:
1065+ return [ " \( raw: accessor) .bridgeJSLowerReturn() " ]
1066+ default :
1067+ break
1068+ }
1069+
11151070 var statements : [ String ] = [ ]
11161071 statements. append ( " let __bjs_isSome_ \( varPrefix) = \( accessor) != nil " )
11171072 statements. append ( " if let __bjs_unwrapped_ \( varPrefix) = \( accessor) { " )
@@ -1140,23 +1095,15 @@ struct StackCodegen {
11401095 case . string, . int, . uint, . bool, . float, . double, . jsValue:
11411096 return [ " \( raw: unwrappedVar) .bridgeJSLowerStackReturn() " ]
11421097 case . caseEnum, . rawValueEnum:
1143- // Enums conform to _BridgedSwiftStackType
11441098 return [ " \( raw: unwrappedVar) .bridgeJSLowerStackReturn() " ]
1145- case . swiftStruct:
1146- return [ " \( raw: unwrappedVar) .bridgeJSLowerReturn() " ]
11471099 case . swiftHeapObject:
11481100 return [ " \( raw: unwrappedVar) .bridgeJSLowerStackReturn() " ]
11491101 case . associatedValueEnum:
1150- // Push payloads via bridgeJSLowerParameter(), then push the returned case ID
11511102 return [ " _swift_js_push_i32( \( raw: unwrappedVar) .bridgeJSLowerParameter()) " ]
11521103 case . jsObject( nil ) :
11531104 return [ " \( raw: unwrappedVar) .bridgeJSLowerStackReturn() " ]
11541105 case . jsObject( _? ) :
11551106 return [ " \( raw: unwrappedVar) .jsObject.bridgeJSLowerStackReturn() " ]
1156- case . array( let elementType) :
1157- return lowerArrayStatements ( elementType: elementType, accessor: unwrappedVar, varPrefix: varPrefix)
1158- case . dictionary( let valueType) :
1159- return lowerDictionaryStatements ( valueType: valueType, accessor: unwrappedVar, varPrefix: varPrefix)
11601107 default :
11611108 return [ " preconditionFailure( \" BridgeJS: unsupported optional wrapped type \" ) " ]
11621109 }
@@ -1834,8 +1781,12 @@ extension BridgeType {
18341781 case . swiftProtocol: return . jsObject
18351782 case . void: return . void
18361783 case . nullable( let wrappedType, _) :
1784+ let wrappedInfo = try wrappedType. liftParameterInfo ( )
1785+ if wrappedInfo. parameters. isEmpty {
1786+ return LiftingIntrinsicInfo ( parameters: [ ] )
1787+ }
18371788 var optionalParams : [ ( name: String , type: WasmCoreType ) ] = [ ( " isSome " , . i32) ]
1838- optionalParams. append ( contentsOf: try wrappedType . liftParameterInfo ( ) . parameters)
1789+ optionalParams. append ( contentsOf: wrappedInfo . parameters)
18391790 return LiftingIntrinsicInfo ( parameters: optionalParams)
18401791 case . caseEnum: return . caseEnum
18411792 case . rawValueEnum( _, let rawType) :
0 commit comments