Skip to content

Commit 9149cf2

Browse files
committed
WIP
1 parent 224b21f commit 9149cf2

File tree

2 files changed

+38
-28
lines changed

2 files changed

+38
-28
lines changed

Sources/JExtractSwift/Swift2JavaTranslator+JavaBindingsPrinting.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -522,10 +522,12 @@ extension Swift2JavaTranslator {
522522
"arena$"
523523
}
524524

525+
let varName = "_result" + outParameter.name
526+
525527
printer.print(
526-
"MemorySegment \(outParameter.name) = \(arena).allocate(\(memoryLayout));"
528+
"MemorySegment \(varName) = \(arena).allocate(\(memoryLayout));"
527529
)
528-
downCallArguments.append(outParameter.name)
530+
downCallArguments.append(varName)
529531
}
530532

531533
//=== Part 3: Downcall.
@@ -542,14 +544,14 @@ extension Swift2JavaTranslator {
542544
if isConstructor {
543545
// For constructors, the caller expects the "self" memory segment.
544546
printer.print("\(downCall);")
545-
let outParameterName = decl.translatedSignature.result.outParameters[0].name
546-
printer.print("return \(outParameterName);")
547+
printer.print("return _result;")
547548
} else if decl.translatedSignature.result.javaResultType == .void {
548549
printer.print("\(downCall);")
549550
} else {
550551
let placeholder = if decl.translatedSignature.result.outParameters.isEmpty {
551552
downCall
552553
} else {
554+
// FIXME: Support cdecl thunk returning a value while populating the out parameters.
553555
"_result"
554556
}
555557
let result = decl.translatedSignature.result.conversion.render(&printer, placeholder)
@@ -634,6 +636,8 @@ extension JavaConversionStep {
634636

635637
/// Returns the conversion string applied to the placeholder.
636638
func render(_ printer: inout CodePrinter, _ placeholder: String) -> String {
639+
// NOTE: 'printer' is used if the conversion wants to cause side-effects.
640+
// E.g. storing a temporary values into a variable.
637641
switch self {
638642
case .pass:
639643
return placeholder

Sources/JExtractSwift/Swift2JavaTranslator+JavaTranslation.swift

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -38,42 +38,48 @@ struct JavaParameter {
3838
var name: String
3939
}
4040

41-
enum JavaModifier {
42-
// Access modifiers
43-
case `public`
44-
case `private`
45-
case `protected`
46-
47-
// Non-access modifiers.
48-
case `final`
49-
case `static`
50-
case `abstract`
51-
case `transient`
52-
case `synchronized`
53-
case `volatile`
54-
}
55-
56-
struct JavaMethodSignature {
57-
var modifiers: [JavaModifier]
58-
var returnType: JavaType
59-
var parameters: [JavaParameter]
60-
}
61-
41+
/// Represent a Swift API parameter translated to Java.
6242
struct TranslatedParameter {
43+
/// Java parameter(s) mapped to the Swift parameter.
44+
///
45+
/// Array because one Swift parameter can be mapped to multiple parameters.
6346
var javaParameters: [JavaParameter]
47+
48+
/// Describes how to convert the Java parameter to the lowered arguments for
49+
/// the foreign function.
6450
var conversion: JavaConversionStep
6551
}
6652

53+
/// Represent a Swift API result translated to Java.
6754
struct TranslatedResult {
55+
/// Java type that represents the Swift result type.
6856
var javaResultType: JavaType
57+
58+
/// Required indirect return receivers for receiving the result.
59+
///
60+
/// 'JavaParameter.name' is the suffix for the receiver variable names. For example
61+
///
62+
/// var _result_pointer = MemorySegment.allocate(...)
63+
/// var _result_count = MemroySegment.allocate(...)
64+
/// downCall(_result_pointer, _result_count)
65+
/// return constructResult(_result_pointer, _result_count)
66+
///
67+
/// This case, there're two out parameter, named '_pointer' and '_count'.
6968
var outParameters: [JavaParameter]
69+
70+
/// Describes how to construct the Java result from the foreign function return
71+
/// value and/or the out parameters.
7072
var conversion: JavaConversionStep
7173
}
7274

75+
/// Translated function signature representing a Swift API.
76+
///
77+
/// Since this holds the lowered signature, and the original `SwiftFunctionSignature`
78+
/// in it, this contains all the API information (except the name) to generate the
79+
/// cdecl thunk, Java binding, and the Java wrapper function.
7380
struct TranslatedFunctionSignature {
7481
var loweredSignature: LoweredFunctionSignature
7582

76-
///
7783
var selfParameter: TranslatedParameter?
7884
var parameters: [TranslatedParameter]
7985
var result: TranslatedResult
@@ -304,7 +310,7 @@ struct JavaTranslation {
304310
return TranslatedResult(
305311
javaResultType: javaType,
306312
outParameters: [
307-
JavaParameter(type: javaType, name: "_result")
313+
JavaParameter(type: javaType, name: "")
308314
],
309315
conversion: .constructSwiftValue(javaType)
310316
)
@@ -341,7 +347,7 @@ enum JavaConversionStep {
341347
// If `withArena` is true, `arena$` argument is added.
342348
case call(function: String, withArena: Bool)
343349

344-
// Call '\(Type)(\(placeholder), arena$)'.
350+
// Call 'new \(Type)(\(placeholder), swiftArena$)'.
345351
case constructSwiftValue(JavaType)
346352

347353
// Construct the type using the placeholder as arguments.

0 commit comments

Comments
 (0)