@@ -820,6 +820,8 @@ struct StackCodegen {
820820 return " \( raw : type . swiftType ) .bridgeJSLiftParameter(_swift_js_pop_i32()) "
821821 case . optional ( let wrappedType ) :
822822 return liftOptionalExpression ( wrappedType : wrappedType )
823+ case . undefinedOr ( let wrappedType ) :
824+ return liftUndefinedExpression ( wrappedType : wrappedType )
823825 case . array ( let elementType ) :
824826 return liftArrayExpression ( elementType : elementType )
825827 case . closure :
@@ -839,7 +841,7 @@ struct StackCodegen {
839841 return liftArrayExpressionInline ( elementType : elementType )
840842 case . swiftProtocol ( let protocolName ) :
841843 return " [Any \( raw : protocolName ) ].bridgeJSLiftParameter() "
842- case . optional , . array , . closure :
844+ case . optional , . undefinedOr , . array , . closure :
843845 return liftArrayExpressionInline ( elementType : elementType )
844846 case . void , . namespaceEnum :
845847 fatalError ( " Invalid array element type: \( elementType ) " )
@@ -883,11 +885,34 @@ struct StackCodegen {
883885 }
884886 }()
885887 """
886- case . void , . namespaceEnum , . closure , . optional , . unsafePointer , . swiftProtocol :
888+ case . undefinedOr , . void , . namespaceEnum , . closure , . optional , . unsafePointer , . swiftProtocol :
887889 fatalError ( " Invalid optional wrapped type: \( wrappedType ) " )
888890 }
889891 }
890892
893+ private func liftUndefinedExpression ( wrappedType : BridgeType ) -> ExprSyntax {
894+ switch wrappedType {
895+ case . string , . int , . uint , . bool , . float , . double , . jsObject ,
896+ . swiftStruct , . swiftHeapObject , . caseEnum , . associatedValueEnum , . rawValueEnum :
897+ return " JSUndefinedOr< \( raw : wrappedType . swiftType ) >.bridgeJSLiftParameter() "
898+ case . array ( let elementType ) :
899+ let arrayLift = liftArrayExpression ( elementType : elementType )
900+ let swiftTypeName = elementType . swiftType
901+ return """
902+ {
903+ let __isDefined = _swift_js_pop_i32()
904+ if __isDefined == 0 {
905+ return JSUndefinedOr< \( raw : swiftTypeName ) >.undefined
906+ } else {
907+ return JSUndefinedOr< \( raw : swiftTypeName ) >(optional: \( arrayLift ) )
908+ }
909+ }()
910+ """
911+ case . void , . namespaceEnum , . closure , . optional , . undefinedOr , . unsafePointer , . swiftProtocol :
912+ fatalError ( " Invalid undefinedOr wrapped type: \( wrappedType ) " )
913+ }
914+ }
915+
891916 /// Generates statements to lower/push a value onto the stack.
892917 /// - Parameters:
893918 /// - type: The BridgeType to lower
@@ -917,6 +942,8 @@ struct StackCodegen {
917942 return [ " \( raw : accessor ) .bridgeJSLowerReturn() " ]
918943 case . optional ( let wrappedType ) :
919944 return lowerOptionalStatements ( wrappedType : wrappedType , accessor : accessor , varPrefix : varPrefix )
945+ case . undefinedOr ( let wrappedType ) :
946+ return lowerOptionalStatements ( wrappedType : wrappedType , accessor : accessor , varPrefix : varPrefix )
920947 case . void , . namespaceEnum :
921948 return [ ]
922949 case . array ( let elementType ) :
@@ -938,7 +965,7 @@ struct StackCodegen {
938965 return [ " \( raw : accessor ) .map { $0.jsObject }.bridgeJSLowerReturn() " ]
939966 case . swiftProtocol ( let protocolName ) :
940967 return [ " \( raw : accessor ) .map { $0 as! Any \( raw : protocolName ) }.bridgeJSLowerReturn() " ]
941- case . optional , . array , . closure :
968+ case . optional , . undefinedOr , . array , . closure :
942969 return lowerArrayStatementsInline (
943970 elementType : elementType ,
944971 accessor : accessor ,
@@ -1597,6 +1624,7 @@ extension BridgeType {
15971624 case . swiftProtocol ( let name ) : return " Any \( name ) "
15981625 case . void : return " Void "
15991626 case . optional ( let wrappedType ) : return " Optional< \( wrappedType . swiftType ) > "
1627+ case . undefinedOr ( let wrappedType ) : return " JSUndefinedOr< \( wrappedType . swiftType ) > "
16001628 case . array ( let elementType ) : return " [ \( elementType . swiftType ) ] "
16011629 case . caseEnum ( let name ) : return name
16021630 case . rawValueEnum ( let name , _) : return name
@@ -1644,6 +1672,10 @@ extension BridgeType {
16441672 var optionalParams : [ ( name : String , type : WasmCoreType ) ] = [ ( " isSome " , . i32 ) ]
16451673 optionalParams . append ( contentsOf : try wrappedType . liftParameterInfo ( ) . parameters )
16461674 return LiftingIntrinsicInfo ( parameters : optionalParams )
1675+ case . undefinedOr ( let wrappedType ) :
1676+ var params : [ ( name : String , type : WasmCoreType ) ] = [ ( " isDefined " , . i32 ) ]
1677+ params . append ( contentsOf : try wrappedType . liftParameterInfo ( ) . parameters )
1678+ return LiftingIntrinsicInfo ( parameters : params )
16471679 case . caseEnum : return . caseEnum
16481680 case . rawValueEnum ( _, let rawType ) :
16491681 return rawType . liftingIntrinsicInfo
@@ -1693,6 +1725,7 @@ extension BridgeType {
16931725 case . swiftProtocol : return . jsObject
16941726 case . void : return . void
16951727 case . optional : return . optional
1728+ case . undefinedOr : return . optional
16961729 case . caseEnum : return . caseEnum
16971730 case . rawValueEnum ( _, let rawType ) :
16981731 return rawType . loweringIntrinsicInfo
0 commit comments