@@ -1042,17 +1042,10 @@ public class ExportSwift {
10421042 let typeName = enumDef. swiftCallName
10431043 return """
10441044 private extension \( raw: typeName) {
1045- static func bridgeJSLiftParameter(_ caseId: Int32, _ paramsId: Int32, _ paramsLen: Int32) -> \( raw: typeName) {
1046- let params: [UInt8] = .init(unsafeUninitializedCapacity: Int(paramsLen)) { buf, initializedCount in
1047- _swift_js_init_memory(paramsId, buf.baseAddress.unsafelyUnwrapped)
1048- initializedCount = Int(paramsLen)
1049- }
1050- return params.withUnsafeBytes { raw in
1051- var reader = _BJSBinaryReader(raw: raw)
1052- switch caseId {
1053- \( raw: generateBinaryLiftSwitchCases ( enumDef: enumDef) . joined ( separator: " \n " ) )
1054- default: fatalError( " Unknown \( raw: typeName) case ID: \\ (caseId) " )
1055- }
1045+ static func bridgeJSLiftParameter(_ caseId: Int32) -> \( raw: typeName) {
1046+ switch caseId {
1047+ \( raw: generateStackLiftSwitchCases ( enumDef: enumDef) . joined ( separator: " \n " ) )
1048+ default: fatalError( " Unknown \( raw: typeName) case ID: \\ (caseId) " )
10561049 }
10571050 }
10581051
@@ -1065,43 +1058,37 @@ public class ExportSwift {
10651058 """
10661059 }
10671060
1068- private func generateBinaryLiftSwitchCases ( enumDef: ExportedEnum ) -> [ String ] {
1061+ private func generateStackLiftSwitchCases ( enumDef: ExportedEnum ) -> [ String ] {
10691062 var cases : [ String ] = [ ]
10701063 for (caseIndex, enumCase) in enumDef. cases. enumerated ( ) {
10711064 if enumCase. associatedValues. isEmpty {
10721065 cases. append ( " case \( caseIndex) : return . \( enumCase. name) " )
10731066 } else {
10741067 var lines : [ String ] = [ ]
10751068 lines. append ( " case \( caseIndex) : " )
1076- lines . append ( " reader.readParamCount(expected: \( enumCase. associatedValues. count ) ) " )
1077- var argList : [ String ] = [ ]
1078-
1079- for (paramIndex , associatedValue ) in enumCase . associatedValues . enumerated ( ) {
1080- let paramName = associatedValue . label ?? " param \( paramIndex ) "
1081- argList . append ( paramName)
1082-
1069+ let argList = enumCase. associatedValues. map { associatedValue in
1070+ let paramName : String
1071+ if let label = associatedValue . label {
1072+ paramName = " \( label ) : "
1073+ } else {
1074+ paramName = " "
1075+ }
10831076 switch associatedValue. type {
10841077 case . string:
1085- lines . append ( " reader.expectTag(.string) " )
1086- lines . append ( " let \( paramName) = reader.readString() " )
1078+ return
1079+ " \( paramName) String.bridgeJSLiftParameter(_swift_js_pop_param_int32(), _swift_js_pop_param_int32()) "
10871080 case . int:
1088- lines. append ( " reader.expectTag(.int32) " )
1089- lines. append ( " let \( paramName) = Int(reader.readInt32()) " )
1081+ return " \( paramName) Int.bridgeJSLiftParameter(_swift_js_pop_param_int32()) "
10901082 case . bool:
1091- lines. append ( " reader.expectTag(.bool) " )
1092- lines. append ( " let \( paramName) = Int32(reader.readUInt8()) != 0 " )
1083+ return " \( paramName) Bool.bridgeJSLiftParameter(_swift_js_pop_param_int32()) "
10931084 case . float:
1094- lines. append ( " reader.expectTag(.float32) " )
1095- lines. append ( " let \( paramName) = reader.readFloat32() " )
1085+ return " \( paramName) Float.bridgeJSLiftParameter(_swift_js_pop_param_f32()) "
10961086 case . double:
1097- lines. append ( " reader.expectTag(.float64) " )
1098- lines. append ( " let \( paramName) = reader.readFloat64() " )
1087+ return " \( paramName) Double.bridgeJSLiftParameter(_swift_js_pop_param_f64()) "
10991088 default :
1100- lines. append ( " reader.expectTag(.int32) " )
1101- lines. append ( " let \( paramName) = reader.readInt32() " )
1089+ return " \( paramName) Int.bridgeJSLiftParameter(_swift_js_pop_param_int32()) "
11021090 }
11031091 }
1104-
11051092 lines. append ( " return . \( enumCase. name) ( \( argList. joined ( separator: " , " ) ) ) " )
11061093 cases. append ( lines. joined ( separator: " \n " ) )
11071094 }
@@ -1114,26 +1101,26 @@ public class ExportSwift {
11141101 for (caseIndex, enumCase) in enumDef. cases. enumerated ( ) {
11151102 if enumCase. associatedValues. isEmpty {
11161103 cases. append ( " case . \( enumCase. name) : " )
1117- cases. append ( " _swift_js_return_tag (Int32(\( caseIndex) )) " )
1104+ cases. append ( " _swift_js_push_tag (Int32(\( caseIndex) )) " )
11181105 } else {
11191106 var bodyLines : [ String ] = [ ]
1120- bodyLines. append ( " _swift_js_return_tag (Int32(\( caseIndex) )) " )
1107+ bodyLines. append ( " _swift_js_push_tag (Int32(\( caseIndex) )) " )
11211108 for (index, associatedValue) in enumCase. associatedValues. enumerated ( ) {
11221109 let paramName = associatedValue. label ?? " param \( index) "
11231110 switch associatedValue. type {
11241111 case . string:
11251112 bodyLines. append ( " var __bjs_ \( paramName) = \( paramName) " )
11261113 bodyLines. append ( " __bjs_ \( paramName) .withUTF8 { ptr in " )
1127- bodyLines. append ( " _swift_js_return_string (ptr.baseAddress, Int32(ptr.count))" )
1114+ bodyLines. append ( " _swift_js_push_string (ptr.baseAddress, Int32(ptr.count))" )
11281115 bodyLines. append ( " } " )
11291116 case . int:
1130- bodyLines. append ( " _swift_js_return_int (Int32(\( paramName) )) " )
1117+ bodyLines. append ( " _swift_js_push_int (Int32(\( paramName) )) " )
11311118 case . bool:
1132- bodyLines. append ( " _swift_js_return_bool (\( paramName) ? 1 : 0) " )
1119+ bodyLines. append ( " _swift_js_push_int (\( paramName) ? 1 : 0) " )
11331120 case . float:
1134- bodyLines. append ( " _swift_js_return_f32 (\( paramName) ) " )
1121+ bodyLines. append ( " _swift_js_push_f32 (\( paramName) ) " )
11351122 case . double:
1136- bodyLines. append ( " _swift_js_return_f64 (\( paramName) ) " )
1123+ bodyLines. append ( " _swift_js_push_f64 (\( paramName) ) " )
11371124 default :
11381125 bodyLines. append (
11391126 " preconditionFailure( \" BridgeJS: unsupported associated value type in generated code \" ) "
@@ -1410,7 +1397,7 @@ extension BridgeType {
14101397 static let void = LiftingIntrinsicInfo ( parameters: [ ] )
14111398 static let caseEnum = LiftingIntrinsicInfo ( parameters: [ ( " value " , . i32) ] )
14121399 static let associatedValueEnum = LiftingIntrinsicInfo ( parameters: [
1413- ( " caseId " , . i32) , ( " paramsId " , . i32 ) , ( " paramsLen " , . i32 ) ,
1400+ ( " caseId " , . i32)
14141401 ] )
14151402 }
14161403
0 commit comments