diff --git a/Sources/JExtractSwift/Swift2JavaTranslator+JavaBindingsPrinting.swift b/Sources/JExtractSwift/Swift2JavaTranslator+JavaBindingsPrinting.swift index 27869695..a592e89e 100644 --- a/Sources/JExtractSwift/Swift2JavaTranslator+JavaBindingsPrinting.swift +++ b/Sources/JExtractSwift/Swift2JavaTranslator+JavaBindingsPrinting.swift @@ -24,18 +24,27 @@ extension Swift2JavaTranslator { printJavaBindingDescriptorClass(&printer, decl) // Render the "make the downcall" functions. - printFuncDowncallMethod(&printer, decl) + printJavaBindingWrapperMethod(&printer, decl) } /// Print FFM Java binding descriptors for the imported Swift API. - func printJavaBindingDescriptorClass( + package func printJavaBindingDescriptorClass( _ printer: inout CodePrinter, _ decl: ImportedFunc ) { let thunkName = thunkNameRegistry.functionThunkName(decl: decl) let cFunc = decl.cFunctionDecl(cName: thunkName) - printer.printBraceBlock("private static class \(cFunc.name)") { printer in + printer.printBraceBlock( + """ + /** + * {@snippet lang=c : + * \(cFunc.description) + * } + */ + private static class \(cFunc.name) + """ + ) { printer in printFunctionDescriptorValue(&printer, cFunc) printer.print( """ @@ -44,11 +53,12 @@ extension Swift2JavaTranslator { public static final MethodHandle HANDLE = Linker.nativeLinker().downcallHandle(ADDR, DESC); """ ) + printJavaBindingDowncallMethod(&printer, cFunc) } } /// Print the 'FunctionDescriptor' of the lowered cdecl thunk. - public func printFunctionDescriptorValue( + func printFunctionDescriptorValue( _ printer: inout CodePrinter, _ cFunc: CFunction ) { @@ -74,9 +84,42 @@ extension Swift2JavaTranslator { printer.print(");") } + func printJavaBindingDowncallMethod( + _ printer: inout CodePrinter, + _ cFunc: CFunction + ) { + let returnTy = cFunc.resultType.javaType + let maybeReturn = cFunc.resultType.isVoid ? "" : "return (\(returnTy)) " + + var params: [String] = [] + var args: [String] = [] + for param in cFunc.parameters { + // ! unwrapping because cdecl lowering guarantees the parameter named. + params.append("\(param.type.javaType) \(param.name!)") + args.append(param.name!) + } + let paramsStr = params.joined(separator: ", ") + let argsStr = args.joined(separator: ", ") + + printer.print( + """ + public static \(returnTy) call(\(paramsStr)) { + try { + if (SwiftKit.TRACE_DOWNCALLS) { + SwiftKit.traceDowncall(\(argsStr)); + } + \(maybeReturn)HANDLE.invokeExact(\(argsStr)); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + """ + ) + } + /// Print the calling body that forwards all the parameters to the `methodName`, /// with adding `SwiftArena.ofAuto()` at the end. - public func printFuncDowncallMethod( + public func printJavaBindingWrapperMethod( _ printer: inout CodePrinter, _ decl: ImportedFunc) { let methodName: String = switch decl.kind { @@ -130,19 +173,11 @@ extension Swift2JavaTranslator { _ printer: inout CodePrinter, _ decl: ImportedFunc ) { - //=== Part 1: MethodHandle - let descriptorClassIdentifier = thunkNameRegistry.functionThunkName(decl: decl) - printer.print( - "var mh$ = \(descriptorClassIdentifier).HANDLE;" - ) - - let tryHead = if decl.translatedSignature.requiresTemporaryArena { - "try(var arena$ = Arena.ofConfined()) {" - } else { - "try {" + //=== Part 1: prepare temporary arena if needed. + if decl.translatedSignature.requiresTemporaryArena { + printer.print("try(var arena$ = Arena.ofConfined()) {") + printer.indent(); } - printer.print(tryHead); - printer.indent(); //=== Part 2: prepare all arguments. var downCallArguments: [String] = [] @@ -151,15 +186,7 @@ extension Swift2JavaTranslator { for (i, parameter) in decl.translatedSignature.parameters.enumerated() { let original = decl.swiftSignature.parameters[i] let parameterName = original.parameterName ?? "_\(i)" - let converted = parameter.conversion.render(&printer, parameterName) - let lowered: String - if parameter.conversion.isTrivial { - lowered = converted - } else { - // Store the conversion to a temporary variable. - lowered = "\(parameterName)$" - printer.print("var \(lowered) = \(converted);") - } + let lowered = parameter.conversion.render(&printer, parameterName) downCallArguments.append(lowered) } @@ -191,14 +218,8 @@ extension Swift2JavaTranslator { } //=== Part 3: Downcall. - printer.print( - """ - if (SwiftKit.TRACE_DOWNCALLS) { - SwiftKit.traceDowncall(\(downCallArguments.joined(separator: ", "))); - } - """ - ) - let downCall = "mh$.invokeExact(\(downCallArguments.joined(separator: ", ")))" + let thunkName = thunkNameRegistry.functionThunkName(decl: decl) + let downCall = "\(thunkName).call(\(downCallArguments.joined(separator: ", ")))" //=== Part 4: Convert the return value. if decl.translatedSignature.result.javaResultType == .void { @@ -221,14 +242,10 @@ extension Swift2JavaTranslator { } } - printer.outdent() - printer.print( - """ - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - """ - ) + if decl.translatedSignature.requiresTemporaryArena { + printer.outdent() + printer.print("}") + } } func renderMemoryLayoutValue(for javaType: JavaType) -> String { diff --git a/Sources/JExtractSwift/Swift2JavaTranslator+JavaTranslation.swift b/Sources/JExtractSwift/Swift2JavaTranslator+JavaTranslation.swift index 4d5fc80a..e126ca8a 100644 --- a/Sources/JExtractSwift/Swift2JavaTranslator+JavaTranslation.swift +++ b/Sources/JExtractSwift/Swift2JavaTranslator+JavaTranslation.swift @@ -270,7 +270,7 @@ struct JavaTranslation { return TranslatedResult( javaResultType: javaType, outParameters: [], - conversion: .cast(javaType) + conversion: .pass ) } diff --git a/Tests/JExtractSwiftTests/FuncCallbackImportTests.swift b/Tests/JExtractSwiftTests/FuncCallbackImportTests.swift index 4bcb4e05..50022c55 100644 --- a/Tests/JExtractSwiftTests/FuncCallbackImportTests.swift +++ b/Tests/JExtractSwiftTests/FuncCallbackImportTests.swift @@ -45,7 +45,7 @@ final class FuncCallbackImportTests { let funcDecl = st.importedGlobalFuncs.first { $0.name == "callMe" }! let output = CodePrinter.toString { printer in - st.printFuncDowncallMethod(&printer, funcDecl) + st.printJavaBindingWrapperMethod(&printer, funcDecl) } assertOutput( @@ -59,15 +59,8 @@ final class FuncCallbackImportTests { * } */ public static void callMe(java.lang.Runnable callback) { - var mh$ = swiftjava___FakeModule_callMe_callback.HANDLE; try(var arena$ = Arena.ofConfined()) { - var callback$ = SwiftKit.toUpcallStub(callback, arena$); - if (SwiftKit.TRACE_DOWNCALLS) { - SwiftKit.traceDowncall(callback$); - } - mh$.invokeExact(callback$); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); + swiftjava___FakeModule_callMe_callback.call(SwiftKit.toUpcallStub(callback, arena$)) } } """ diff --git a/Tests/JExtractSwiftTests/FunctionDescriptorImportTests.swift b/Tests/JExtractSwiftTests/FunctionDescriptorImportTests.swift index dea63d4e..44385b0a 100644 --- a/Tests/JExtractSwiftTests/FunctionDescriptorImportTests.swift +++ b/Tests/JExtractSwiftTests/FunctionDescriptorImportTests.swift @@ -51,9 +51,29 @@ final class FunctionDescriptorTests { output, expected: """ - public static final FunctionDescriptor DESC = FunctionDescriptor.ofVoid( - /* i: */SwiftValueLayout.SWIFT_INT - ); + /** + * {@snippet lang=c : + * void swiftjava_SwiftModule_globalTakeInt_i(ptrdiff_t i) + * } + */ + private static class swiftjava_SwiftModule_globalTakeInt_i { + public static final FunctionDescriptor DESC = FunctionDescriptor.ofVoid( + /* i: */SwiftValueLayout.SWIFT_INT + ); + public static final MemorySegment ADDR = + SwiftModule.findOrThrow("swiftjava_SwiftModule_globalTakeInt_i"); + public static final MethodHandle HANDLE = Linker.nativeLinker().downcallHandle(ADDR, DESC); + public static void call(long i) { + try { + if (SwiftKit.TRACE_DOWNCALLS) { + SwiftKit.traceDowncall(i); + } + HANDLE.invokeExact(i); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + } """ ) } @@ -66,10 +86,30 @@ final class FunctionDescriptorTests { output, expected: """ - public static final FunctionDescriptor DESC = FunctionDescriptor.ofVoid( - /* l: */SwiftValueLayout.SWIFT_INT64, - /* i32: */SwiftValueLayout.SWIFT_INT32 - ); + /** + * {@snippet lang=c : + * void swiftjava_SwiftModule_globalTakeLongInt_l_i32(int64_t l, int32_t i32) + * } + */ + private static class swiftjava_SwiftModule_globalTakeLongInt_l_i32 { + public static final FunctionDescriptor DESC = FunctionDescriptor.ofVoid( + /* l: */SwiftValueLayout.SWIFT_INT64, + /* i32: */SwiftValueLayout.SWIFT_INT32 + ); + public static final MemorySegment ADDR = + SwiftModule.findOrThrow("swiftjava_SwiftModule_globalTakeLongInt_l_i32"); + public static final MethodHandle HANDLE = Linker.nativeLinker().downcallHandle(ADDR, DESC); + public static void call(long l, int i32) { + try { + if (SwiftKit.TRACE_DOWNCALLS) { + SwiftKit.traceDowncall(l, i32); + } + HANDLE.invokeExact(l, i32); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + } """ ) } @@ -82,10 +122,30 @@ final class FunctionDescriptorTests { output, expected: """ - public static final FunctionDescriptor DESC = FunctionDescriptor.of( - /* -> */SwiftValueLayout.SWIFT_INT, - /* i: */SwiftValueLayout.SWIFT_INT - ); + /** + * {@snippet lang=c : + * ptrdiff_t swiftjava_SwiftModule_echoInt_i(ptrdiff_t i) + * } + */ + private static class swiftjava_SwiftModule_echoInt_i { + public static final FunctionDescriptor DESC = FunctionDescriptor.of( + /* -> */SwiftValueLayout.SWIFT_INT, + /* i: */SwiftValueLayout.SWIFT_INT + ); + public static final MemorySegment ADDR = + SwiftModule.findOrThrow("swiftjava_SwiftModule_echoInt_i"); + public static final MethodHandle HANDLE = Linker.nativeLinker().downcallHandle(ADDR, DESC); + public static long call(long i) { + try { + if (SwiftKit.TRACE_DOWNCALLS) { + SwiftKit.traceDowncall(i); + } + return (long) HANDLE.invokeExact(i); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + } """ ) } @@ -98,10 +158,30 @@ final class FunctionDescriptorTests { output, expected: """ - public static final FunctionDescriptor DESC = FunctionDescriptor.of( - /* -> */SwiftValueLayout.SWIFT_INT32, - /* self: */SwiftValueLayout.SWIFT_POINTER - ); + /** + * {@snippet lang=c : + * int32_t swiftjava_SwiftModule_MySwiftClass_counter$get(const void *self) + * } + */ + private static class swiftjava_SwiftModule_MySwiftClass_counter$get { + public static final FunctionDescriptor DESC = FunctionDescriptor.of( + /* -> */SwiftValueLayout.SWIFT_INT32, + /* self: */SwiftValueLayout.SWIFT_POINTER + ); + public static final MemorySegment ADDR = + SwiftModule.findOrThrow("swiftjava_SwiftModule_MySwiftClass_counter$get"); + public static final MethodHandle HANDLE = Linker.nativeLinker().downcallHandle(ADDR, DESC); + public static int call(java.lang.foreign.MemorySegment self) { + try { + if (SwiftKit.TRACE_DOWNCALLS) { + SwiftKit.traceDowncall(self); + } + return (int) HANDLE.invokeExact(self); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + } """ ) } @@ -113,10 +193,30 @@ final class FunctionDescriptorTests { output, expected: """ - public static final FunctionDescriptor DESC = FunctionDescriptor.ofVoid( - /* newValue: */SwiftValueLayout.SWIFT_INT32, - /* self: */SwiftValueLayout.SWIFT_POINTER - ); + /** + * {@snippet lang=c : + * void swiftjava_SwiftModule_MySwiftClass_counter$set(int32_t newValue, const void *self) + * } + */ + private static class swiftjava_SwiftModule_MySwiftClass_counter$set { + public static final FunctionDescriptor DESC = FunctionDescriptor.ofVoid( + /* newValue: */SwiftValueLayout.SWIFT_INT32, + /* self: */SwiftValueLayout.SWIFT_POINTER + ); + public static final MemorySegment ADDR = + SwiftModule.findOrThrow("swiftjava_SwiftModule_MySwiftClass_counter$set"); + public static final MethodHandle HANDLE = Linker.nativeLinker().downcallHandle(ADDR, DESC); + public static void call(int newValue, java.lang.foreign.MemorySegment self) { + try { + if (SwiftKit.TRACE_DOWNCALLS) { + SwiftKit.traceDowncall(newValue, self); + } + HANDLE.invokeExact(newValue, self); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + } """ ) } @@ -145,10 +245,8 @@ extension FunctionDescriptorTests { $0.name == methodIdentifier }! - let thunkName = st.thunkNameRegistry.functionThunkName(decl: funcDecl) - let cFunc = funcDecl.cFunctionDecl(cName: thunkName) let output = CodePrinter.toString { printer in - st.printFunctionDescriptorValue(&printer, cFunc) + st.printJavaBindingDescriptorClass(&printer, funcDecl) } try body(output) @@ -180,10 +278,8 @@ extension FunctionDescriptorTests { fatalError("Cannot find descriptor of: \(identifier)") } - let thunkName = st.thunkNameRegistry.functionThunkName(decl: accessorDecl) - let cFunc = accessorDecl.cFunctionDecl(cName: thunkName) let getOutput = CodePrinter.toString { printer in - st.printFunctionDescriptorValue(&printer, cFunc) + st.printJavaBindingDescriptorClass(&printer, accessorDecl) } try body(getOutput) diff --git a/Tests/JExtractSwiftTests/MethodImportTests.swift b/Tests/JExtractSwiftTests/MethodImportTests.swift index bad1025e..526faece 100644 --- a/Tests/JExtractSwiftTests/MethodImportTests.swift +++ b/Tests/JExtractSwiftTests/MethodImportTests.swift @@ -68,7 +68,7 @@ final class MethodImportTests { let funcDecl = st.importedGlobalFuncs.first { $0.name == "helloWorld" }! let output = CodePrinter.toString { printer in - st.printFuncDowncallMethod(&printer, funcDecl) + st.printJavaBindingWrapperMethod(&printer, funcDecl) } assertOutput( @@ -82,16 +82,7 @@ final class MethodImportTests { * } */ public static void helloWorld() { - var mh$ = swiftjava___FakeModule_helloWorld.HANDLE; - try { - if (SwiftKit.TRACE_DOWNCALLS) { - SwiftKit.traceDowncall(); - } - - mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } + swiftjava___FakeModule_helloWorld.call(); } """ ) @@ -112,7 +103,7 @@ final class MethodImportTests { }! let output = CodePrinter.toString { printer in - st.printFuncDowncallMethod(&printer, funcDecl) + st.printJavaBindingWrapperMethod(&printer, funcDecl) } assertOutput( @@ -126,15 +117,7 @@ final class MethodImportTests { * } */ public static void globalTakeInt(long i) { - var mh$ = swiftjava___FakeModule_globalTakeInt_i.HANDLE; - try { - if (SwiftKit.TRACE_DOWNCALLS) { - SwiftKit.traceDowncall(i); - } - mh$.invokeExact(i); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } + swiftjava___FakeModule_globalTakeInt_i.call(i); } """ ) @@ -155,7 +138,7 @@ final class MethodImportTests { }! let output = CodePrinter.toString { printer in - st.printFuncDowncallMethod(&printer, funcDecl) + st.printJavaBindingWrapperMethod(&printer, funcDecl) } assertOutput( @@ -170,15 +153,8 @@ final class MethodImportTests { * } */ public static void globalTakeIntLongString(int i32, long l, java.lang.String s) { - var mh$ = swiftjava___FakeModule_globalTakeIntLongString_i32_l_s.HANDLE; try(var arena$ = Arena.ofConfined()) { - var s$ = SwiftKit.toCString(s, arena$); - if (SwiftKit.TRACE_DOWNCALLS) { - SwiftKit.traceDowncall(i32, l, s$); - } - mh$.invokeExact(i32, l, s$); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); + swiftjava___FakeModule_globalTakeIntLongString_i32_l_s.call(i32, l, SwiftKit.toCString(s, arena$)); } } """ @@ -200,7 +176,7 @@ final class MethodImportTests { }! let output = CodePrinter.toString { printer in - st.printFuncDowncallMethod(&printer, funcDecl) + st.printJavaBindingWrapperMethod(&printer, funcDecl) } assertOutput( @@ -215,17 +191,9 @@ final class MethodImportTests { * } */ public static MySwiftClass globalReturnClass(SwiftArena swiftArena$) { - var mh$ = swiftjava___FakeModule_globalReturnClass.HANDLE; - try { - MemorySegment _result = swiftArena$.allocate(MySwiftClass.$LAYOUT); - if (SwiftKit.TRACE_DOWNCALLS) { - SwiftKit.traceDowncall(_result); - } - mh$.invokeExact(_result); - return new MySwiftClass(_result, swiftArena$); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } + MemorySegment _result = swiftArena$.allocate(MySwiftClass.$LAYOUT); + swiftjava___FakeModule_globalReturnClass.call(_result); + return new MySwiftClass(_result, swiftArena$); } """ ) @@ -246,7 +214,7 @@ final class MethodImportTests { }! let output = CodePrinter.toString { printer in - st.printFuncDowncallMethod(&printer, funcDecl) + st.printJavaBindingWrapperMethod(&printer, funcDecl) } assertOutput( @@ -261,15 +229,7 @@ final class MethodImportTests { */ public void helloMemberFunction() { $ensureAlive() - var mh$ = swiftjava___FakeModule_MySwiftClass_helloMemberFunction.HANDLE; - try { - if (SwiftKit.TRACE_DOWNCALLS) { - SwiftKit.traceDowncall(this.$memorySegment()); - } - mh$.invokeExact(this.$memorySegment()); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } + swiftjava___FakeModule_MySwiftClass_helloMemberFunction.call(this.$memorySegment()); } """ ) @@ -290,7 +250,7 @@ final class MethodImportTests { }! let output = CodePrinter.toString { printer in - st.printFuncDowncallMethod(&printer, funcDecl) + st.printJavaBindingWrapperMethod(&printer, funcDecl) } assertOutput( @@ -304,16 +264,8 @@ final class MethodImportTests { * } */ public long makeInt() { - $ensureAlive() - var mh$ = swiftjava___FakeModule_MySwiftClass_makeInt.HANDLE; - try { - if (SwiftKit.TRACE_DOWNCALLS) { - SwiftKit.traceDowncall(this.$memorySegment()); - } - return (long) mh$.invokeExact(this.$memorySegment()); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } + $ensureAlive(); + return swiftjava___FakeModule_MySwiftClass_makeInt.call(this.$memorySegment()); } """ ) @@ -334,7 +286,7 @@ final class MethodImportTests { }! let output = CodePrinter.toString { printer in - st.printFuncDowncallMethod(&printer, initDecl) + st.printJavaBindingWrapperMethod(&printer, initDecl) } assertOutput( @@ -348,17 +300,9 @@ final class MethodImportTests { * } */ public static MySwiftClass init(long len, long cap, SwiftArena swiftArena$) { - var mh$ = swiftjava___FakeModule_MySwiftClass_init_len_cap.HANDLE; - try { MemorySegment _result = swiftArena$.allocate(MySwiftClass.$LAYOUT); - if (SwiftKit.TRACE_DOWNCALLS) { - SwiftKit.traceDowncall(len, cap, _result); - } - mh$.invokeExact(len, cap, _result); + swiftjava___FakeModule_MySwiftClass_init_len_cap.call(len, cap, _result) return new MySwiftClass(_result, swiftArena$); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } } """ ) @@ -379,7 +323,7 @@ final class MethodImportTests { }! let output = CodePrinter.toString { printer in - st.printFuncDowncallMethod(&printer, initDecl) + st.printJavaBindingWrapperMethod(&printer, initDecl) } assertOutput( @@ -393,17 +337,9 @@ final class MethodImportTests { * } */ public static MySwiftStruct init(long len, long cap, SwiftArena swiftArena$) { - var mh$ = swiftjava___FakeModule_MySwiftStruct_init_len_cap.HANDLE; - try { MemorySegment _result = swiftArena$.allocate(MySwiftStruct.$LAYOUT); - if (SwiftKit.TRACE_DOWNCALLS) { - SwiftKit.traceDowncall(len, cap, _result); - } - mh$.invokeExact(len, cap, _result); + swiftjava___FakeModule_MySwiftStruct_init_len_cap.call(len, cap, _result) return new MySwiftStruct(_result, swiftArena$); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } } """ ) diff --git a/Tests/JExtractSwiftTests/StringPassingTests.swift b/Tests/JExtractSwiftTests/StringPassingTests.swift index 21f0584c..08190399 100644 --- a/Tests/JExtractSwiftTests/StringPassingTests.swift +++ b/Tests/JExtractSwiftTests/StringPassingTests.swift @@ -33,8 +33,33 @@ final class StringPassingTests { try assertOutput( st, input: class_interfaceFile, .java, - detectChunkByInitialLines: 1, expectedChunks: [ + """ + /** + * {@snippet lang=c : + * ptrdiff_t swiftjava___FakeModule_writeString_string(const int8_t *string) + * } + */ + private static class swiftjava___FakeModule_writeString_string { + public static final FunctionDescriptor DESC = FunctionDescriptor.of( + /* -> */SwiftValueLayout.SWIFT_INT, + /* string: */SwiftValueLayout.SWIFT_POINTER + ); + public static final MemorySegment ADDR = + __FakeModule.findOrThrow("swiftjava___FakeModule_writeString_string"); + public static final MethodHandle HANDLE = Linker.nativeLinker().downcallHandle(ADDR, DESC); + public static long call(java.lang.foreign.MemorySegment string) { + try { + if (SwiftKit.TRACE_DOWNCALLS) { + SwiftKit.traceDowncall(string); + } + return (long) HANDLE.invokeExact(string); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + } + """, """ /** * Downcall to Swift: @@ -43,15 +68,8 @@ final class StringPassingTests { * } */ public static long writeString(java.lang.String string) { - var mh$ = swiftjava___FakeModule_writeString_string.HANDLE; try(var arena$ = Arena.ofConfined()) { - var string$ = SwiftKit.toCString(string, arena$); - if (SwiftKit.TRACE_DOWNCALLS) { - SwiftKit.traceDowncall(string$); - } - return (long) mh$.invokeExact(string$); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); + return swiftjava___FakeModule_writeString_string.call(SwiftKit.toCString(string, arena$)); } } """ diff --git a/Tests/JExtractSwiftTests/VariableImportTests.swift b/Tests/JExtractSwiftTests/VariableImportTests.swift index e407b234..55724293 100644 --- a/Tests/JExtractSwiftTests/VariableImportTests.swift +++ b/Tests/JExtractSwiftTests/VariableImportTests.swift @@ -54,6 +54,16 @@ final class VariableImportTests { public static final MemorySegment ADDR = FakeModule.findOrThrow("swiftjava_FakeModule_MySwiftClass_counterInt$get"); public static final MethodHandle HANDLE = Linker.nativeLinker().downcallHandle(ADDR, DESC); + public static long call(java.lang.foreign.MemorySegment self) { + try { + if (SwiftKit.TRACE_DOWNCALLS) { + SwiftKit.traceDowncall(self); + } + return (long) HANDLE.invokeExact(self); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } } """, """ @@ -65,15 +75,7 @@ final class VariableImportTests { */ public long getCounterInt() { $ensureAlive(); - var mh$ = swiftjava_FakeModule_MySwiftClass_counterInt$get.HANDLE; - try { - if (SwiftKit.TRACE_DOWNCALLS) { - SwiftKit.traceDowncall(this.$memorySegment()); - } - return (long) mh$.invokeExact(this.$memorySegment()); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } + return swiftjava_FakeModule_MySwiftClass_counterInt$get.call(this.$memorySegment()); } """, """ @@ -85,6 +87,16 @@ final class VariableImportTests { public static final MemorySegment ADDR = FakeModule.findOrThrow("swiftjava_FakeModule_MySwiftClass_counterInt$set"); public static final MethodHandle HANDLE = Linker.nativeLinker().downcallHandle(ADDR, DESC); + public static void call(long newValue, java.lang.foreign.MemorySegment self) { + try { + if (SwiftKit.TRACE_DOWNCALLS) { + SwiftKit.traceDowncall(newValue, self); + } + HANDLE.invokeExact(newValue, self); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } } """, """ @@ -96,15 +108,7 @@ final class VariableImportTests { */ public void setCounterInt(long newValue) { $ensureAlive(); - var mh$ = swiftjava_FakeModule_MySwiftClass_counterInt$set.HANDLE; - try { - if (SwiftKit.TRACE_DOWNCALLS) { - SwiftKit.traceDowncall(newValue, this.$memorySegment()); - } - mh$.invokeExact(newValue, this.$memorySegment()); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } + swiftjava_FakeModule_MySwiftClass_counterInt$set.call(newValue, this.$memorySegment()) } """, ]