Skip to content

Commit 87efb9f

Browse files
committed
Done implementing returning byte[] in ffm mode
1 parent 6716f4e commit 87efb9f

File tree

2 files changed

+39
-55
lines changed

2 files changed

+39
-55
lines changed

Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaBindingsPrinting.swift

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,17 @@ extension FFMSwift2JavaGenerator {
456456
downCallArguments.append(varName)
457457
}
458458

459+
if let outCallback = translatedSignature.result.outCallback {
460+
let funcName = outCallback.name
461+
assert(funcName.first == "$", "OutCallback names must start with $")
462+
let varName = funcName.dropFirst()
463+
downCallArguments.append(
464+
"""
465+
swiftjava_SwiftModule_returnArray.\(outCallback.name).toUpcallStub(\(varName), arena$)
466+
"""
467+
)
468+
}
469+
459470
//=== Part 3: Downcall.
460471
let thunkName = thunkNameRegistry.functionThunkName(decl: decl)
461472
let downCall = "\(thunkName).call(\(downCallArguments.joined(separator: ", ")))"
@@ -469,11 +480,8 @@ extension FFMSwift2JavaGenerator {
469480
let placeholderForDowncall: String?
470481

471482
if let outCallback = translatedSignature.result.outCallback {
472-
print("[swift] has out callback")
473483
placeholder = "\(outCallback.name)" // the result will be read out from the _result_initialize java class
474484
placeholderForDowncall = "\(downCall)"
475-
print("[swift] has out callback = placeholder \(placeholder)")
476-
print("[swift] has out callback = placeholderForDowncall \(placeholderForDowncall)")
477485
} else if translatedSignature.result.outParameters.isEmpty {
478486
placeholder = downCall
479487
placeholderForDowncall = nil

Tests/JExtractSwiftTests/ByteArrayTests.swift

Lines changed: 28 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -89,69 +89,45 @@ final class ByteArrayTests {
8989
JExtractGenerationMode.ffm,
9090
/* expected Java chunks */
9191
[
92-
// """
93-
// /**
94-
// * {@snippet lang=c :
95-
// * void swiftjava_SwiftModule_returnArray(void (*_result_initialize)(const void *, ptrdiff_t))
96-
// * }
97-
// */
98-
// private static class swiftjava_SwiftModule_returnArray {
99-
// private static final FunctionDescriptor DESC = FunctionDescriptor.ofVoid(
100-
// /* _result_initialize: */SwiftValueLayout.SWIFT_POINTER
101-
// );
102-
// private static final MemorySegment ADDR =
103-
// SwiftModule.findOrThrow("swiftjava_SwiftModule_returnArray");
104-
// private static final MethodHandle HANDLE = Linker.nativeLinker().downcallHandle(ADDR, DESC);
105-
// public static void call(java.lang.foreign.MemorySegment _result_initialize) {
106-
// try {
107-
// if (CallTraces.TRACE_DOWNCALLS) {
108-
// CallTraces.traceDowncall(_result_initialize);
109-
// }
110-
// HANDLE.invokeExact(_result_initialize);
111-
// } catch (Throwable ex$) {
112-
// throw new AssertionError("should not reach here", ex$);
113-
// }
114-
// }
115-
// }
116-
// """,
117-
// """
118-
// /**
119-
// * {snippet lang=c :
120-
// * void (*)(const void *, ptrdiff_t)
121-
// * }
122-
// */
123-
// private static class $_result_initialize {
124-
// final static class Function {
125-
// byte[] result;
126-
// void apply(java.lang.foreign.MemorySegment _0, long _1) {
127-
// this.result = _0.reinterpret(_1).toArray(ValueLayout.JAVA_BYTE);
128-
// }
129-
// }
130-
// private static final FunctionDescriptor DESC = FunctionDescriptor.ofVoid(
131-
// /* _0: */SwiftValueLayout.SWIFT_POINTER,
132-
// /* _1: */SwiftValueLayout.SWIFT_INT
133-
// );
134-
// private static final MethodHandle HANDLE = SwiftRuntime.upcallHandle(Function.class, "apply", DESC);
135-
// private static MemorySegment toUpcallStub(Function fi, Arena arena) {
136-
// return Linker.nativeLinker().upcallStub(HANDLE.bindTo(fi), DESC, arena);
137-
// }
138-
// }
139-
// """,
92+
"""
93+
/**
94+
* {snippet lang=c :
95+
* void (void *, size_t)
96+
* }
97+
*/
98+
private static class $_result_initialize {
99+
public final static class Function {
100+
byte[] result = null;
101+
void apply(java.lang.foreign.MemorySegment _0, long _1) {
102+
this.result = _0.reinterpret(_1).toArray(ValueLayout.JAVA_BYTE);
103+
}
104+
}
105+
private static final FunctionDescriptor DESC = FunctionDescriptor.ofVoid(
106+
/* _0: */SwiftValueLayout.SWIFT_POINTER,
107+
/* _1: */SwiftValueLayout.SWIFT_INT
108+
);
109+
private static final MethodHandle HANDLE = SwiftRuntime.upcallHandle(Function.class, "apply", DESC);
110+
private static MemorySegment toUpcallStub(Function fi, Arena arena) {
111+
return Linker.nativeLinker().upcallStub(HANDLE.bindTo(fi), DESC, arena);
112+
}
113+
}
114+
""",
140115
"""
141116
/**
142117
* Downcall to Swift:
143-
* {@snippet lang = swift:
118+
* {@snippet lang=swift :
144119
* public func returnArray() -> [UInt8]
145-
*}
120+
* }
146121
*/
122+
@Unsigned
147123
public static byte[] returnArray() {
148-
try (var arena$ = Arena.ofAuto()) {
124+
try(var arena$ = Arena.ofConfined()) {
149125
var _result_initialize = new swiftjava_SwiftModule_returnArray.$_result_initialize.Function();
150126
swiftjava_SwiftModule_returnArray.call(swiftjava_SwiftModule_returnArray.$_result_initialize.toUpcallStub(_result_initialize, arena$));
151127
return _result_initialize.result;
152128
}
153129
}
154-
"""
130+
""",
155131
],
156132
/* expected Swift chunks */
157133
[

0 commit comments

Comments
 (0)