@@ -34,6 +34,7 @@ final class JSGlueVariableScope {
3434 static let reservedStructHelpers = " structHelpers "
3535 static let reservedSwiftClosureRegistry = " swiftClosureRegistry "
3636 static let reservedMakeSwiftClosure = " makeClosure "
37+ static let reservedTaStack = " taStack "
3738
3839 private let intrinsicRegistry : JSIntrinsicRegistry
3940
@@ -63,6 +64,7 @@ final class JSGlueVariableScope {
6364 reservedStructHelpers,
6465 reservedSwiftClosureRegistry,
6566 reservedMakeSwiftClosure,
67+ reservedTaStack,
6668 ]
6769
6870 init ( intrinsicRegistry: JSIntrinsicRegistry ) {
@@ -1896,20 +1898,31 @@ struct IntrinsicJSFragment: Sendable {
18961898 let ( scope, printer) = ( context. scope, context. printer)
18971899 let resultVar = scope. variable ( " arrayResult " )
18981900 let lenVar = scope. variable ( " arrayLen " )
1899- let iVar = scope. variable ( " i " )
19001901
19011902 printer. write ( " const \( lenVar) = \( scope. popI32 ( ) ) ; " )
1902- printer. write ( " const \( resultVar) = []; " )
1903- printer. write ( " for (let \( iVar) = 0; \( iVar) < \( lenVar) ; \( iVar) ++) { " )
1903+ printer. write ( " let \( resultVar) ; " )
1904+ printer. write ( " if ( \( lenVar) === -1) { " )
1905+ printer. indent {
1906+ // Bulk path: Swift pushed a typed array onto the typed-array stack
1907+ printer. write ( " \( resultVar) = \( JSGlueVariableScope . reservedTaStack) .pop(); " )
1908+ }
1909+ printer. write ( " } else { " )
19041910 try printer. indent {
1905- let elementFragment = try stackLiftFragment ( elementType: elementType)
1906- let elementResults = try elementFragment. printCode ( [ ] , context)
1907- if let elementExpr = elementResults. first {
1908- printer. write ( " \( resultVar) .push( \( elementExpr) ); " )
1911+ // Element-by-element path (original behavior)
1912+ let iVar = scope. variable ( " i " )
1913+ printer. write ( " \( resultVar) = []; " )
1914+ printer. write ( " for (let \( iVar) = 0; \( iVar) < \( lenVar) ; \( iVar) ++) { " )
1915+ try printer. indent {
1916+ let elementFragment = try stackLiftFragment ( elementType: elementType)
1917+ let elementResults = try elementFragment. printCode ( [ ] , context)
1918+ if let elementExpr = elementResults. first {
1919+ printer. write ( " \( resultVar) .push( \( elementExpr) ); " )
1920+ }
19091921 }
1922+ printer. write ( " } " )
1923+ printer. write ( " \( resultVar) .reverse(); " )
19101924 }
19111925 printer. write ( " } " )
1912- printer. write ( " \( resultVar) .reverse(); " )
19131926 return [ resultVar]
19141927 }
19151928 )
0 commit comments