@@ -251,7 +251,6 @@ extension FFMSwift2JavaGenerator {
251251 )
252252 } else {
253253 // Otherwise, the lambda must be wrapped with the lowered function instance.
254- assertionFailure ( " should be unreachable at this point " )
255254 let apiParams = functionType. parameters. flatMap {
256255 $0. javaParameters. map { param in " \( param. type) \( param. name) " }
257256 }
@@ -262,13 +261,38 @@ extension FFMSwift2JavaGenerator {
262261 public interface \( functionType. name) {
263262 \( functionType. result. javaResultType) apply( \( apiParams. joined ( separator: " , " ) ) );
264263 }
265- private static MemorySegment $toUpcallStub( \( functionType. name) fi, Arena arena) {
266- return \( cdeclDescriptor) .toUpcallStub((<cdecl-params>) -> {
267- <maybe-return> fi(<converted-args>)
268- }, arena);
269- }
270264 """
271265 )
266+
267+ let cdeclParams = functionType. cdeclType. parameters. map ( { " \( $0. parameterName!) " } )
268+
269+ printer. printBraceBlock (
270+ """
271+ private static MemorySegment $toUpcallStub( \( functionType. name) fi, Arena arena)
272+ """
273+ ) { printer in
274+ printer. print (
275+ """
276+ return \( cdeclDescriptor) .toUpcallStub(( \( cdeclParams. joined ( separator: " , " ) ) ) -> {
277+ """
278+ )
279+ printer. indent ( )
280+ var convertedArgs : [ String ] = [ ]
281+ for param in functionType. parameters {
282+ let arg = param. conversion. render ( & printer, param. javaParameters [ 0 ] . name)
283+ convertedArgs. append ( arg)
284+ }
285+
286+ let call = " fi.apply( \( convertedArgs. joined ( separator: " , " ) ) ) "
287+ let result = functionType. result. conversion. render ( & printer, call)
288+ if functionType. result. javaResultType == . void {
289+ printer. print ( " \( result) ; " )
290+ } else {
291+ printer. print ( " return \( result) ; " )
292+ }
293+ printer. outdent ( )
294+ printer. print ( " }, arena); " )
295+ }
272296 }
273297 }
274298
@@ -419,7 +443,7 @@ extension JavaConversionStep {
419443 /// Whether the conversion uses SwiftArena.
420444 var requiresSwiftArena : Bool {
421445 switch self {
422- case . placeholder, . constant, . readOutParameter :
446+ case . placeholder, . explodedName , . constant, . readMemorySegment :
423447 return false
424448 case . constructSwiftValue:
425449 return true
@@ -436,9 +460,9 @@ extension JavaConversionStep {
436460 /// Whether the conversion uses temporary Arena.
437461 var requiresTemporaryArena : Bool {
438462 switch self {
439- case . placeholder, . constant:
463+ case . placeholder, . explodedName , . constant:
440464 return false
441- case . readOutParameter :
465+ case . readMemorySegment :
442466 return true
443467 case . cast( let inner, _) , . construct( let inner, _) , . constructSwiftValue( let inner, _) , . swiftValueSelfSegment( let inner) :
444468 return inner. requiresSwiftArena
@@ -459,6 +483,9 @@ extension JavaConversionStep {
459483 case . placeholder:
460484 return placeholder
461485
486+ case . explodedName( let component) :
487+ return " \( placeholder) _ \( component) "
488+
462489 case . swiftValueSelfSegment:
463490 return " \( placeholder) .$memorySegment() "
464491
@@ -491,8 +518,9 @@ extension JavaConversionStep {
491518 case . constant( let value) :
492519 return value
493520
494- case . readOutParameter( let javaType, let name) :
495- return " \( placeholder) _ \( name) .get( \( ForeignValueLayout ( javaType: javaType) !) , 0) "
521+ case . readMemorySegment( let inner, let javaType) :
522+ let inner = inner. render ( & printer, placeholder)
523+ return " \( inner) .get( \( ForeignValueLayout ( javaType: javaType) !) , 0) "
496524 }
497525 }
498526}
0 commit comments