From e794a62b555f3ee7c5d21d7041fa4e824e5630f9 Mon Sep 17 00:00:00 2001 From: Mads Odgaard Date: Sun, 30 Nov 2025 21:41:45 +0100 Subject: [PATCH 1/2] fix global arena mode for interfaces --- ...t2JavaGenerator+JavaBindingsPrinting.swift | 13 ++++++++- .../MemoryManagementModeTests.swift | 27 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift index 07d23dc0f..1e18cbe8f 100644 --- a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift +++ b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift @@ -424,7 +424,11 @@ extension JNISwift2JavaGenerator { ) } - private func printJavaBindingWrapperMethod(_ printer: inout CodePrinter, _ decl: ImportedFunc, signaturesOnly: Bool) { + private func printJavaBindingWrapperMethod( + _ printer: inout CodePrinter, + _ decl: ImportedFunc, + signaturesOnly: Bool + ) { guard let translatedDecl = translatedDecl(for: decl) else { fatalError("Decl was not translated, \(decl)") } @@ -470,6 +474,13 @@ extension JNISwift2JavaGenerator { if let importedFunc { printDeclDocumentation(&printer, importedFunc) } + var modifiers = modifiers + + // If we are a protocol, we emit this as default method + if importedFunc?.parentType?.asNominalTypeDeclaration?.kind == .protocol { + modifiers.insert("default", at: 1) + } + printer.printBraceBlock("\(annotationsStr)\(modifiers.joined(separator: " ")) \(resultType) \(translatedDecl.name)(\(parametersStr))\(throwsClause)") { printer in let globalArenaName = "SwiftMemoryManagement.GLOBAL_SWIFT_JAVA_ARENA" let arguments = translatedDecl.translatedFunctionSignature.parameters.map(\.parameter.name) + [globalArenaName] diff --git a/Tests/JExtractSwiftTests/MemoryManagementModeTests.swift b/Tests/JExtractSwiftTests/MemoryManagementModeTests.swift index 6017c9875..e848f575b 100644 --- a/Tests/JExtractSwiftTests/MemoryManagementModeTests.swift +++ b/Tests/JExtractSwiftTests/MemoryManagementModeTests.swift @@ -74,4 +74,31 @@ struct MemoryManagementModeTests { ] ) } + + @Test + func allowGlobalAutomatic_protocol() throws { + var config = Configuration() + config.memoryManagementMode = .allowGlobalAutomatic + + try assertOutput( + input: + """ + public class MyClass {} + + public protocol MyProtocol { + public func f() -> MyClass + } + """, + config: config, + .jni, .java, + detectChunkByInitialLines: 1, + expectedChunks: [ + """ + public default MyClass f() { + return f(SwiftMemoryManagement.GLOBAL_SWIFT_JAVA_ARENA); + } + """ + ] + ) + } } From d7b43d0bad37d052b9e30b7c743a154eb742780c Mon Sep 17 00:00:00 2001 From: Mads Odgaard Date: Sun, 30 Nov 2025 21:45:04 +0100 Subject: [PATCH 2/2] add additional codegen test line --- Tests/JExtractSwiftTests/MemoryManagementModeTests.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tests/JExtractSwiftTests/MemoryManagementModeTests.swift b/Tests/JExtractSwiftTests/MemoryManagementModeTests.swift index e848f575b..2228aad88 100644 --- a/Tests/JExtractSwiftTests/MemoryManagementModeTests.swift +++ b/Tests/JExtractSwiftTests/MemoryManagementModeTests.swift @@ -97,6 +97,9 @@ struct MemoryManagementModeTests { public default MyClass f() { return f(SwiftMemoryManagement.GLOBAL_SWIFT_JAVA_ARENA); } + """, + """ + public MyClass f(SwiftArena swiftArena$); """ ] )