Skip to content

Commit b1f50bc

Browse files
committed
generate wrappers that respect mode
1 parent 8bc7096 commit b1f50bc

File tree

4 files changed

+48
-9
lines changed

4 files changed

+48
-9
lines changed

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import JavaTypes
1616

1717
// MARK: Defaults
1818

19+
private let globalArenaName = "GLOBAL_ARENA"
20+
1921
extension JNISwift2JavaGenerator {
2022
/// Default set Java imports for every generated file
2123
static let defaultJavaImports: Array<String> = [
@@ -72,6 +74,11 @@ extension JNISwift2JavaGenerator {
7274
printImports(&printer)
7375

7476
printModuleClass(&printer) { printer in
77+
if config.effectiveMemoryManagementMode.requiresGlobalArena {
78+
printer.print("static final SwiftArena \(globalArenaName) = SwiftArena.ofAuto();")
79+
printer.println()
80+
}
81+
7582
printer.print(
7683
"""
7784
static final String LIB_NAME = "\(swiftModuleName)";
@@ -247,29 +254,50 @@ extension JNISwift2JavaGenerator {
247254
guard let translatedDecl = translatedDecl(for: decl) else {
248255
fatalError("Decl was not translated, \(decl)")
249256
}
257+
let translatedSignature = translatedDecl.translatedFunctionSignature
250258

251259
var modifiers = ["public"]
260+
252261
if decl.isStatic || decl.isInitializer || !decl.hasParent {
253262
modifiers.append("static")
254263
}
255264

256-
let translatedSignature = translatedDecl.translatedFunctionSignature
257265
let resultType = translatedSignature.resultType.javaType
258-
var parameters = translatedDecl.translatedFunctionSignature.parameters.map({ $0.parameter.renderParameter() })
259-
if translatedSignature.requiresSwiftArena {
260-
parameters.append("SwiftArena swiftArena$")
261-
}
266+
var parameters = translatedDecl.translatedFunctionSignature.parameters.map { $0.parameter.renderParameter() }
262267
let throwsClause = decl.isThrowing ? " throws Exception" : ""
263268

264269
var annotationsStr = translatedSignature.annotations.map({ $0.render() }).joined(separator: "\n")
265270
if !annotationsStr.isEmpty { annotationsStr += "\n" }
266271

267-
let modifiersStr = modifiers.joined(separator: " ")
268272
let parametersStr = parameters.joined(separator: ", ")
269273

274+
// Print default global arena variation
275+
if config.effectiveMemoryManagementMode.requiresGlobalArena && translatedSignature.requiresSwiftArena {
276+
printDeclDocumentation(&printer, decl)
277+
printer.printBraceBlock(
278+
"\(annotationsStr)\(modifiers.joined(separator: " ")) \(resultType) \(translatedDecl.name)(\(parametersStr))\(throwsClause)"
279+
) { printer in
280+
let arguments = translatedDecl.translatedFunctionSignature.parameters.map(\.parameter.name) + ["\(swiftModuleName).\(globalArenaName)"]
281+
let call = "\(translatedDecl.name)(\(arguments.joined(separator: ", ")))"
282+
if translatedDecl.translatedFunctionSignature.resultType.javaType.isVoid {
283+
printer.print("\(call);")
284+
} else {
285+
printer.print("return \(call);")
286+
}
287+
}
288+
printer.println()
289+
}
290+
291+
// Make any function with explicit arena private if we force automatic.
292+
if config.effectiveMemoryManagementMode == .forceAutomatic && translatedSignature.requiresSwiftArena {
293+
modifiers[0] = "private"
294+
}
295+
if translatedSignature.requiresSwiftArena {
296+
parameters.append("SwiftArena swiftArena$")
297+
}
270298
printDeclDocumentation(&printer, decl)
271299
printer.printBraceBlock(
272-
"\(annotationsStr)\(modifiersStr) \(resultType) \(translatedDecl.name)(\(parametersStr))\(throwsClause)"
300+
"\(annotationsStr)\(modifiers.joined(separator: " ")) \(resultType) \(translatedDecl.name)(\(parameters.joined(separator: ", ")))\(throwsClause)"
273301
) { printer in
274302
printDowncall(&printer, decl)
275303
}

Sources/JavaKitConfigurationShared/Configuration.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public struct Configuration: Codable {
5353

5454
public var memoryManagementMode: JExtractMemoryManagementMode?
5555
public var effectiveMemoryManagementMode: JExtractMemoryManagementMode {
56-
memoryManagementMode ?? .forceExplicit
56+
memoryManagementMode ?? .default
5757
}
5858

5959
// ==== java 2 swift ---------------------------------------------------------

Sources/JavaKitConfigurationShared/GenerationMode.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,15 @@ public enum JExtractMemoryManagementMode: String, Codable {
9090
/// Force all memory management to a default global automatic `SwiftArena`
9191
/// that will deallocate memory when the GC decides to.
9292
case forceAutomatic
93+
94+
public static var `default`: Self {
95+
.forceExplicit
96+
}
97+
98+
public var requiresGlobalArena: Bool {
99+
switch self {
100+
case .forceExplicit: false
101+
case .allowAutomatic, .forceAutomatic: true
102+
}
103+
}
93104
}

Sources/SwiftJavaTool/Commands/JExtractCommand.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ extension SwiftJava {
6868
var minimumInputAccessLevel: JExtractMinimumAccessLevelMode = .default
6969

7070
@Option(help: "The memory management mode to use for the generated code. By default, the user must explicitly provide `SwiftArena` to all calls that require it. By choosing `allow-automatic`, user can omit this parameter and a global GC-based arena will be used. `force-automatic` removes all explicit memory management.")
71-
var memoryManagementMode: JExtractMemoryManagementMode = .forceExplicit
71+
var memoryManagementMode: JExtractMemoryManagementMode = .default
7272

7373
@Option(
7474
help: """

0 commit comments

Comments
 (0)