Skip to content

Commit ed7fa8e

Browse files
committed
Revert "jextract: pass arena from Swift instead of default interface for callbacks (#489)"
This reverts commit acff3ee.
1 parent 4f885a3 commit ed7fa8e

File tree

12 files changed

+47
-90
lines changed

12 files changed

+47
-90
lines changed

Samples/SwiftJavaExtractJNISampleApp/src/test/java/com/example/swift/ProtocolTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ void protocolMethod() {
7777
void protocolClassMethod() {
7878
try (var arena = SwiftArena.ofConfined()) {
7979
ProtocolA proto1 = ConcreteProtocolAB.init(10, 5, arena);
80-
assertEquals(10, proto1.makeClass(arena).getX());
80+
assertEquals(10, proto1.makeClass().getX());
8181
}
8282
}
8383

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+InterfaceWrapperGeneration.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ extension JNISwift2JavaGenerator {
4242
let protocolType: SwiftNominalType
4343
let functions: [Function]
4444
let variables: [Variable]
45-
let importedType: ImportedNominalType
4645

4746
var wrapperName: String {
4847
protocolType.nominalTypeDecl.javaInterfaceSwiftProtocolWrapperName
@@ -100,8 +99,7 @@ extension JNISwift2JavaGenerator {
10099
return JavaInterfaceSwiftWrapper(
101100
protocolType: SwiftNominalType(nominalTypeDecl: type.swiftNominal),
102101
functions: functions,
103-
variables: variables,
104-
importedType: type
102+
variables: variables
105103
)
106104
}
107105

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ extension JNISwift2JavaGenerator {
214214
}
215215
216216
public static \(decl.swiftNominal.name) wrapMemoryAddressUnsafe(long selfPointer) {
217-
return new \(decl.swiftNominal.name)(selfPointer, SwiftMemoryManagement.DEFAULT_SWIFT_JAVA_AUTO_ARENA);
217+
return new \(decl.swiftNominal.name)(selfPointer, SwiftMemoryManagement.GLOBAL_SWIFT_JAVA_ARENA);
218218
}
219219
"""
220220
)
@@ -531,9 +531,17 @@ extension JNISwift2JavaGenerator {
531531
// If we have enabled javaCallbacks we must emit default
532532
// arena methods for protocols, as this is what
533533
// Swift will call into, when you call a interface from Swift.
534-
let shouldGenerateGlobalArenaVariation = config.effectiveMemoryManagementMode.requiresGlobalArena && translatedSignature.requiresSwiftArena
534+
let shouldGenerateGlobalArenaVariation: Bool
535535
let isParentProtocol = importedFunc?.parentType?.asNominalType?.isProtocol ?? false
536536

537+
if config.effectiveMemoryManagementMode.requiresGlobalArena && translatedSignature.requiresSwiftArena {
538+
shouldGenerateGlobalArenaVariation = true
539+
} else if isParentProtocol, translatedSignature.requiresSwiftArena, config.effectiveEnableJavaCallbacks {
540+
shouldGenerateGlobalArenaVariation = true
541+
} else {
542+
shouldGenerateGlobalArenaVariation = false
543+
}
544+
537545
if shouldGenerateGlobalArenaVariation {
538546
if let importedFunc {
539547
printDeclDocumentation(&printer, importedFunc)
@@ -546,7 +554,7 @@ extension JNISwift2JavaGenerator {
546554
}
547555

548556
printer.printBraceBlock("\(annotationsStr)\(modifiers.joined(separator: " ")) \(resultType) \(translatedDecl.name)(\(parametersStr))\(throwsClause)") { printer in
549-
let globalArenaName = "SwiftMemoryManagement.DEFAULT_SWIFT_JAVA_AUTO_ARENA"
557+
let globalArenaName = "SwiftMemoryManagement.GLOBAL_SWIFT_JAVA_ARENA"
550558
let arguments = translatedDecl.translatedFunctionSignature.parameters.map(\.parameter.name) + [globalArenaName]
551559
let call = "\(translatedDecl.name)(\(arguments.joined(separator: ", ")))"
552560
if translatedDecl.translatedFunctionSignature.resultType.javaType.isVoid {

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,9 +1317,5 @@ extension JNISwift2JavaGenerator {
13171317

13181318
// FIXME: Remove once we support protocol variables
13191319
case protocolVariablesNotSupported
1320-
1321-
/// We cannot generate interface wrappers for
1322-
/// protocols that we unable to be jextracted.
1323-
case protocolWasNotExtracted
13241320
}
13251321
}

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+SwiftThunkPrinting.swift

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,9 @@ extension JNISwift2JavaGenerator {
124124
printer.print("var \(translatedWrapper.javaInterfaceVariableName): \(translatedWrapper.javaInterfaceName) { get }")
125125
}
126126
printer.println()
127-
try printer.printBraceBlock("extension \(translatedWrapper.wrapperName)") { printer in
127+
printer.printBraceBlock("extension \(translatedWrapper.wrapperName)") { printer in
128128
for function in translatedWrapper.functions {
129-
try printInterfaceWrapperFunctionImpl(&printer, function, inside: translatedWrapper)
129+
printInterfaceWrapperFunctionImpl(&printer, function, inside: translatedWrapper)
130130
printer.println()
131131
}
132132

@@ -142,29 +142,16 @@ extension JNISwift2JavaGenerator {
142142
_ printer: inout CodePrinter,
143143
_ function: JavaInterfaceSwiftWrapper.Function,
144144
inside wrapper: JavaInterfaceSwiftWrapper
145-
) throws {
146-
guard let protocolMethod = wrapper.importedType.methods.first(where: { $0.functionSignature == function.originalFunctionSignature }) else {
147-
fatalError("Failed to find protocol method")
148-
}
149-
guard let translatedDecl = self.translatedDecl(for: protocolMethod) else {
150-
throw JavaTranslationError.protocolWasNotExtracted
151-
}
152-
145+
) {
153146
printer.printBraceBlock(function.swiftDecl.signatureString) { printer in
154-
var upcallArguments = zip(
147+
let upcallArguments = zip(
155148
function.originalFunctionSignature.parameters,
156149
function.parameterConversions
157150
).map { param, conversion in
158151
// Wrap-java does not extract parameter names, so no labels
159152
conversion.render(&printer, param.parameterName!)
160153
}
161154

162-
// If the underlying translated method requires
163-
// a SwiftArena, we pass in the global arena
164-
if translatedDecl.translatedFunctionSignature.requiresSwiftArena {
165-
upcallArguments.append("JNI.shared.defaultAutoArena")
166-
}
167-
168155
let tryClause = function.originalFunctionSignature.isThrowing ? "try " : ""
169156
let javaUpcall = "\(tryClause)\(wrapper.javaInterfaceVariableName).\(function.swiftFunctionName)(\(upcallArguments.joined(separator: ", ")))"
170157

Sources/SwiftJava/AnyJavaObject.swift

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,6 @@ extension AnyJavaObject {
7777
return String(seq)
7878
}
7979

80-
/// The mangled name for this java class
81-
public static var mangledName: String {
82-
"L\(fullJavaClassNameWithSlashes);"
83-
}
84-
8580
/// Initialize a Java object from its instance.
8681
public init(javaThis: jobject, environment: JNIEnvironment) {
8782
self.init(javaHolder: JavaObjectHolder(object: javaThis, environment: environment))

Sources/SwiftJavaRuntimeSupport/JNI.swift

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,38 +15,13 @@
1515
import SwiftJava
1616
import CSwiftJavaJNI
1717

18-
/// A type that represents the shared JNI environment
19-
/// used to share any global JNI variables.
20-
///
21-
/// This is initialized when the `JNI_OnLoad` is triggered,
22-
/// which happens when you call `System.loadLibrary(...)`
23-
/// from Java.
24-
public final class JNI {
25-
/// The shared JNI object, initialized by `JNI_OnLoad`
26-
public fileprivate(set) static var shared: JNI!
18+
final class JNI {
19+
static var shared: JNI!
2720

28-
/// The default application class loader
29-
public let applicationClassLoader: JavaClassLoader
30-
31-
/// The default auto arena of SwiftKitCore
32-
public let defaultAutoArena: JavaSwiftArena
21+
let applicationClassLoader: JavaClassLoader
3322

3423
init(fromVM javaVM: JavaVirtualMachine) {
35-
let environment = try! javaVM.environment()
36-
37-
self.applicationClassLoader = try! JavaClass<JavaThread>(environment: environment).currentThread().getContextClassLoader()
38-
39-
// Find global arena
40-
let swiftMemoryClass = environment.interface.FindClass(environment, "org/swift/swiftkit/core/SwiftMemoryManagement")!
41-
let arenaFieldID = environment.interface.GetStaticFieldID(
42-
environment,
43-
swiftMemoryClass,
44-
"DEFAULT_SWIFT_JAVA_AUTO_ARENA",
45-
JavaSwiftArena.mangledName
46-
)
47-
let localObject = environment.interface.GetStaticObjectField(environment, swiftMemoryClass, arenaFieldID)!
48-
self.defaultAutoArena = JavaSwiftArena(javaThis: localObject, environment: environment)
49-
environment.interface.DeleteLocalRef(environment, localObject)
24+
self.applicationClassLoader = try! JavaClass<JavaThread>(environment: javaVM.environment()).currentThread().getContextClassLoader()
5025
}
5126
}
5227

Sources/SwiftJavaRuntimeSupport/generated/JavaSwiftArena.swift

Lines changed: 0 additions & 18 deletions
This file was deleted.

Sources/SwiftJavaRuntimeSupport/swift-java.config

Lines changed: 0 additions & 6 deletions
This file was deleted.

SwiftKitCore/src/main/java/org/swift/swiftkit/core/SwiftMemoryManagement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@
1515
package org.swift.swiftkit.core;
1616

1717
public class SwiftMemoryManagement {
18-
public static final SwiftArena DEFAULT_SWIFT_JAVA_AUTO_ARENA = SwiftArena.ofAuto();
18+
public static final SwiftArena GLOBAL_SWIFT_JAVA_ARENA = SwiftArena.ofAuto();
1919
}

0 commit comments

Comments
 (0)