@@ -28,7 +28,7 @@ public class ExportSwift {
2828 private var exportedProtocolNameByKey : [ String : String ] = [ : ]
2929 private var typeDeclResolver : TypeDeclResolver = TypeDeclResolver ( )
3030 private let enumCodegen : EnumCodegen = EnumCodegen ( )
31- private lazy var closureCodegen = ClosureCodegen ( moduleName : moduleName )
31+ private let closureCodegen = ClosureCodegen ( )
3232
3333 public init ( progress: ProgressReporting , moduleName: String ) {
3434 self . progress = progress
@@ -1354,6 +1354,7 @@ public class ExportSwift {
13541354 ClosureSignature (
13551355 parameters: parameters,
13561356 returnType: returnType,
1357+ moduleName: moduleName,
13571358 isAsync: isAsync,
13581359 isThrows: isThrows
13591360 )
@@ -1477,7 +1478,6 @@ public class ExportSwift {
14771478 }
14781479 decls. append ( Self . prelude)
14791480
1480- // Collect all unique closure signatures
14811481 var closureSignatures : Set < ClosureSignature > = [ ]
14821482 for function in exportedFunctions {
14831483 collectClosureSignatures ( from: function. parameters, into: & closureSignatures)
@@ -1817,20 +1817,14 @@ public class ExportSwift {
18171817 }
18181818
18191819 private struct ClosureCodegen {
1820- let moduleName : String
1821-
18221820 func generateOptionalParameterLowering( signature: ClosureSignature ) throws -> String {
18231821 var lines : [ String ] = [ ]
18241822
18251823 for (index, paramType) in signature. parameters. enumerated ( ) {
18261824 guard case . optional( let wrappedType) = paramType else {
18271825 continue
18281826 }
1829-
18301827 let paramName = " param \( index) "
1831-
1832- // Use bridgeJSLowerParameterWithRetain for heap objects in escaping closures
1833- // to ensure proper ownership transfer
18341828 if case . swiftHeapObject = wrappedType {
18351829 lines. append (
18361830 " let ( \( paramName) IsSome, \( paramName) Value) = \( paramName) .bridgeJSLowerParameterWithRetain() "
@@ -1859,7 +1853,7 @@ public class ExportSwift {
18591853 let closureType = " ( \( closureParams) ) \( swiftEffects) -> \( swiftReturnType) "
18601854
18611855 var invokeParams : [ ( name: String , type: String ) ] = [ ( " _ " , " Int32 " ) ]
1862- var invokeCallArgs : [ String ] = [ " owner.callbackId " ]
1856+ var invokeCallArgs : [ String ] = [ " callback.bridgeJSLowerParameter() " ]
18631857
18641858 for (index, paramType) in signature. parameters. enumerated ( ) {
18651859 let paramName = " param \( index) "
@@ -1920,7 +1914,7 @@ public class ExportSwift {
19201914 """
19211915 }
19221916
1923- let externName = " invoke_js_callback_ \( mangledName . lowercased ( ) ) "
1917+ let externName = " invoke_js_callback_ \( signature . moduleName ) _ \( mangledName ) "
19241918 let optionalLoweringCode = try generateOptionalParameterLowering ( signature: signature)
19251919
19261920 return """
@@ -1938,8 +1932,8 @@ public class ExportSwift {
19381932 }
19391933
19401934 static func bridgeJSLift(_ callbackId: Int32) -> \( raw: closureType) {
1941- let owner = _JSCallbackOwner(callbackId: callbackId)
1942- return { [owner ] \( raw: signature. parameters. indices. map { " param \( $0) " } . joined ( separator: " , " ) ) in
1935+ let callback = JSObject.bridgeJSLiftParameter( callbackId)
1936+ return { [callback ] \( raw: signature. parameters. indices. map { " param \( $0) " } . joined ( separator: " , " ) ) in
19431937 #if arch(wasm32)
19441938 @_extern(wasm, module: " bjs " , name: " \( raw: externName) " )
19451939 func _invoke( \( raw: invokeSignature) ) -> \( raw: invokeReturnType)
@@ -1955,7 +1949,7 @@ public class ExportSwift {
19551949
19561950 func renderClosureInvokeHandler( signature: ClosureSignature ) throws -> DeclSyntax {
19571951 let boxClassName = " _BJS_ClosureBox_ \( signature. mangleName) "
1958- let abiName = " invoke_swift_closure_ \( signature. mangleName . lowercased ( ) ) "
1952+ let abiName = " invoke_swift_closure_ \( signature. moduleName ) _ \( signature . mangleName ) "
19591953
19601954 var abiParams : [ ( name: String , type: String ) ] = [ ( " boxPtr " , " UnsafeMutableRawPointer " ) ]
19611955 var liftedParams : [ String ] = [ ]
@@ -2471,14 +2465,12 @@ public class ExportSwift {
24712465 return decls
24722466 }
24732467
2474- /// Collects all closure signatures from function parameters
24752468 private func collectClosureSignatures( from parameters: [ Parameter ] , into signatures: inout Set < ClosureSignature > ) {
24762469 for param in parameters {
24772470 collectClosureSignatures ( from: param. type, into: & signatures)
24782471 }
24792472 }
24802473
2481- /// Collects all closure signatures from a bridge type
24822474 private func collectClosureSignatures( from type: BridgeType , into signatures: inout Set < ClosureSignature > ) {
24832475 switch type {
24842476 case . closure( let signature) :
@@ -2933,7 +2925,6 @@ extension BridgeType {
29332925 case . namespaceEnum:
29342926 throw BridgeJSCoreError ( " Namespace enums are not supported to pass as parameters " )
29352927 case . closure:
2936- // Closures are returned as UnsafeMutableRawPointer (box pointer)
29372928 return . swiftHeapObject
29382929 }
29392930 }
0 commit comments