@@ -137,7 +137,7 @@ public class ExportSwift {
137137 case . swiftStruct( let structName) :
138138 typeNameForIntrinsic = structName
139139 liftingExpr = ExprSyntax ( " \( raw: structName) .bridgeJSLiftParameter() " )
140- case . array:
140+ case . array, . typedArray :
141141 typeNameForIntrinsic = param. type. swiftType
142142 liftingExpr = StackCodegen ( ) . liftExpression ( for: param. type)
143143 case . nullable( let wrappedType, let kind) :
@@ -306,6 +306,16 @@ public class ExportSwift {
306306 for stmt in stackCodegen. lowerStatements ( for: returnType, accessor: " ret " , varPrefix: " ret " ) {
307307 append ( stmt)
308308 }
309+ case . typedArray:
310+ // Top-level typed array return: use immediate copy via _bridgeJS_typedArrayPush
311+ append ( " _bridgeJS_typedArrayPush(ret) " )
312+ case . nullable( . typedArray, _) :
313+ // Optional typed arrays in return position: use stack-based optional protocol
314+ // (element-by-element) to match JS liftReturn's optional handling.
315+ let stackCodegen = StackCodegen ( )
316+ for stmt in stackCodegen. lowerStatements ( for: returnType, accessor: " ret " , varPrefix: " ret " ) {
317+ append ( stmt)
318+ }
309319 case . dictionary( . swiftProtocol) :
310320 let stackCodegen = StackCodegen ( )
311321 for stmt in stackCodegen. lowerStatements ( for: returnType, accessor: " ret " , varPrefix: " ret " ) {
@@ -754,7 +764,8 @@ struct StackCodegen {
754764 switch type {
755765 case . string, . integer, . bool, . float, . double,
756766 . jsObject( nil ) , . jsValue, . swiftStruct, . swiftHeapObject, . unsafePointer,
757- . swiftProtocol, . caseEnum, . associatedValueEnum, . rawValueEnum, . array, . dictionary:
767+ . swiftProtocol, . caseEnum, . associatedValueEnum, . rawValueEnum, . array, . dictionary,
768+ . typedArray:
758769 return " \( raw: type. swiftType) .bridgeJSStackPop() "
759770 case . jsObject( let className? ) :
760771 return " \( raw: className) (unsafelyWrapping: JSObject.bridgeJSStackPop()) "
@@ -772,7 +783,7 @@ struct StackCodegen {
772783 switch wrappedType {
773784 case . string, . integer, . bool, . float, . double, . jsObject( nil ) , . jsValue,
774785 . swiftStruct, . swiftHeapObject, . caseEnum, . associatedValueEnum, . rawValueEnum,
775- . array, . dictionary:
786+ . array, . dictionary, . typedArray :
776787 return " \( raw: typeName) < \( raw: wrappedType. swiftType) >.bridgeJSStackPop() "
777788 case . jsObject( let className? ) :
778789 return " \( raw: typeName) <JSObject>.bridgeJSStackPop().map { \( raw: className) (unsafelyWrapping: $0) } "
@@ -807,6 +818,21 @@ struct StackCodegen {
807818 return [ ]
808819 case . array( let elementType) :
809820 return lowerArrayStatements ( elementType: elementType, accessor: accessor, varPrefix: varPrefix)
821+ case . typedArray( let kind) :
822+ // In stack context (struct fields), use element-by-element protocol
823+ // to match JS stackLiftFragment which also falls back to arrayLift.
824+ let elementType : BridgeType
825+ switch kind {
826+ case . int8: elementType = . integer( . int8)
827+ case . uint8: elementType = . integer( . uint8)
828+ case . int16: elementType = . integer( . int16)
829+ case . uint16: elementType = . integer( . uint16)
830+ case . int32, . intWord: elementType = . integer( . int32)
831+ case . uint32, . uintWord: elementType = . integer( . uint32)
832+ case . float32: elementType = . float
833+ case . float64: elementType = . double
834+ }
835+ return lowerArrayStatements ( elementType: elementType, accessor: accessor, varPrefix: varPrefix)
810836 case . dictionary( let valueType) :
811837 return lowerDictionaryStatements ( valueType: valueType, accessor: accessor, varPrefix: varPrefix)
812838 }
@@ -1459,6 +1485,7 @@ extension BridgeType {
14591485 case . nullable( let wrappedType, let kind) :
14601486 return kind == . null ? " Optional< \( wrappedType. swiftType) > " : " JSUndefinedOr< \( wrappedType. swiftType) > "
14611487 case . array( let elementType) : return " [ \( elementType. swiftType) ] "
1488+ case . typedArray( let kind) : return " [ \( kind. swiftElementType) ] "
14621489 case . dictionary( let valueType) : return " [String: \( valueType. swiftType) ] "
14631490 case . caseEnum( let name) : return name
14641491 case . rawValueEnum( let name, _) : return name
@@ -1490,7 +1517,7 @@ extension BridgeType {
14901517
14911518 var isStackUsingParameter : Bool {
14921519 switch self {
1493- case . swiftStruct, . array, . dictionary, . associatedValueEnum:
1520+ case . swiftStruct, . array, . dictionary, . associatedValueEnum, . typedArray :
14941521 return true
14951522 case . nullable( let wrapped, _) :
14961523 return wrapped. isStackUsingParameter
@@ -1550,7 +1577,7 @@ extension BridgeType {
15501577 throw BridgeJSCoreError ( " Namespace enums are not supported to pass as parameters " )
15511578 case . closure:
15521579 return LiftingIntrinsicInfo ( parameters: [ ( " callbackId " , . i32) ] )
1553- case . array, . dictionary:
1580+ case . array, . dictionary, . typedArray :
15541581 return LiftingIntrinsicInfo ( parameters: [ ] )
15551582 }
15561583 }
@@ -1601,7 +1628,7 @@ extension BridgeType {
16011628 throw BridgeJSCoreError ( " Namespace enums are not supported to pass as parameters " )
16021629 case . closure:
16031630 return . jsObject
1604- case . array, . dictionary:
1631+ case . array, . dictionary, . typedArray :
16051632 return . array
16061633 }
16071634 }
0 commit comments