Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Sources/JExtractSwiftLib/FFM/ConversionStep.swift
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ enum ConversionStep: Equatable {
// of splatting out text.
let renderedArgumentList = renderedArguments.joined(separator: ", ")
return "\(raw: type.description)(\(raw: renderedArgumentList))"

case .tuplify(let elements):
let renderedElements: [String] = elements.enumerated().map { (index, element) in
element.asExprSyntax(placeholder: "\(placeholder)_\(index)", bodyItems: &bodyItems)!.description
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,7 @@ extension FFMSwift2JavaGenerator {
"arena$"
}

// FIXME: use trailing$ convention
let varName = outParameter.name.isEmpty ? "_result" : "_result_" + outParameter.name

printer.print(
Expand Down Expand Up @@ -463,7 +464,7 @@ extension FFMSwift2JavaGenerator.JavaConversionStep {
switch self {
case .placeholder, .explodedName, .constant, .readMemorySegment:
return false
case .constructSwiftValue:
case .constructSwiftValue, .wrapMemoryAddressUnsafe:
return true

case .call(let inner, _, _), .cast(let inner, _), .construct(let inner, _),
Expand All @@ -482,7 +483,11 @@ extension FFMSwift2JavaGenerator.JavaConversionStep {
return false
case .readMemorySegment:
return true
case .cast(let inner, _), .construct(let inner, _), .constructSwiftValue(let inner, _), .swiftValueSelfSegment(let inner):
case .cast(let inner, _),
.construct(let inner, _),
.constructSwiftValue(let inner, _),
.swiftValueSelfSegment(let inner),
.wrapMemoryAddressUnsafe(let inner, _):
return inner.requiresSwiftArena
case .call(let inner, _, let withArena):
return withArena || inner.requiresTemporaryArena
Expand Down Expand Up @@ -522,6 +527,10 @@ extension FFMSwift2JavaGenerator.JavaConversionStep {
let inner = inner.render(&printer, placeholder)
return "new \(javaType.className!)(\(inner), swiftArena$)"

case .wrapMemoryAddressUnsafe(let inner, let javaType):
let inner = inner.render(&printer, placeholder)
return "\(javaType.className!).wrapMemoryAddressUnsafe(\(inner), swiftArena$)"

case .construct(let inner, let javaType):
let inner = inner.render(&printer, placeholder)
return "new \(javaType)(\(inner))"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -684,7 +684,7 @@ extension FFMSwift2JavaGenerator {
outParameters: [
JavaParameter(name: "", type: javaType)
],
conversion: .constructSwiftValue(.placeholder, javaType)
conversion: .wrapMemoryAddressUnsafe(.placeholder, javaType)
)

case .tuple:
Expand Down Expand Up @@ -732,6 +732,9 @@ extension FFMSwift2JavaGenerator {
// Call 'new \(Type)(\(placeholder), swiftArena$)'.
indirect case constructSwiftValue(JavaConversionStep, JavaType)

/// Call the `MyType.wrapMemoryAddressUnsafe` in order to wrap a memory address using the Java binding type
indirect case wrapMemoryAddressUnsafe(JavaConversionStep, JavaType)

// Construct the type using the placeholder as arguments.
indirect case construct(JavaConversionStep, JavaType)

Expand Down
15 changes: 14 additions & 1 deletion Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -216,9 +216,22 @@ extension FFMSwift2JavaGenerator {

printer.print(
"""
public \(decl.swiftNominal.name)(MemorySegment segment, AllocatingSwiftArena arena) {
private \(decl.swiftNominal.name)(MemorySegment segment, AllocatingSwiftArena arena) {
super(segment, arena);
}

/**
* Assume that the passed {@code MemorySegment} represents a memory address of a {@link \(decl.swiftNominal.name)}.
* <p/>
* Warnings:
* <ul>
* <li>No checks are performed about the compatibility of the pointed at memory and the actual \(decl.swiftNominal.name) types.</li>
* <li>This operation does not copy, or retain, the pointed at pointer, so its lifetime must be ensured manually to be valid when wrapping.</li>
* </ul>
*/
public static \(decl.swiftNominal.name) wrapMemoryAddressUnsafe(MemorySegment selfPointer, AllocatingSwiftArena swiftArena) {
return new \(decl.swiftNominal.name)(selfPointer, swiftArena);
}
"""
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,22 @@ extension JNISwift2JavaGenerator {

printer.print(
"""
public \(decl.swiftNominal.name)(long selfPointer, SwiftArena swiftArena) {
private \(decl.swiftNominal.name)(long selfPointer, SwiftArena swiftArena) {
super(selfPointer, swiftArena);
}

/**
* Assume that the passed {@code long} represents a memory address of a {@link \(decl.swiftNominal.name)}.
* <p/>
* Warnings:
* <ul>
* <li>No checks are performed about the compatibility of the pointed at memory and the actual \(decl.swiftNominal.name) types.</li>
* <li>This operation does not copy, or retain, the pointed at pointer, so its lifetime must be ensured manually to be valid when wrapping.</li>
* </ul>
*/
public static \(decl.swiftNominal.name) wrapMemoryAddressUnsafe(long selfPointer, SwiftArena swiftArena) {
return new \(decl.swiftNominal.name)(selfPointer, swiftArena);
}
"""
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ extension JNISwift2JavaGenerator {
javaType: javaType,
annotations: resultAnnotations,
outParameters: [],
conversion: .constructSwiftValue(.placeholder, javaType)
conversion: .wrapMemoryAddressUnsafe(.placeholder, javaType)
)

case .tuple([]):
Expand Down Expand Up @@ -465,7 +465,7 @@ extension JNISwift2JavaGenerator {
discriminatorName: "result_discriminator$",
optionalClass: "Optional",
javaType: .long,
toValue: .constructSwiftValue(.placeholder, .class(package: nil, name: nominalTypeName))
toValue: .wrapMemoryAddressUnsafe(.placeholder, .class(package: nil, name: nominalTypeName))
)
)

Expand Down Expand Up @@ -582,6 +582,9 @@ extension JNISwift2JavaGenerator {
/// Call `new \(Type)(\(placeholder), swiftArena$)`
indirect case constructSwiftValue(JavaNativeConversionStep, JavaType)

/// Call the `MyType.wrapMemoryAddressUnsafe` in order to wrap a memory address using the Java binding type
indirect case wrapMemoryAddressUnsafe(JavaNativeConversionStep, JavaType)

indirect case call(JavaNativeConversionStep, function: String)

indirect case method(JavaNativeConversionStep, function: String, arguments: [JavaNativeConversionStep] = [])
Expand Down Expand Up @@ -641,6 +644,10 @@ extension JNISwift2JavaGenerator {
case .constructSwiftValue(let inner, let javaType):
let inner = inner.render(&printer, placeholder)
return "new \(javaType.className!)(\(inner), swiftArena$)"

case .wrapMemoryAddressUnsafe(let inner, let javaType):
let inner = inner.render(&printer, placeholder)
return "\(javaType.className!).wrapMemoryAddressUnsafe(\(inner), swiftArena$)"

case .call(let inner, let function):
let inner = inner.render(&printer, placeholder)
Expand Down Expand Up @@ -705,7 +712,7 @@ extension JNISwift2JavaGenerator {
case .placeholder, .constant, .isOptionalPresent:
return false

case .constructSwiftValue:
case .constructSwiftValue, .wrapMemoryAddressUnsafe:
return true

case .valueMemoryAddress(let inner):
Expand Down
7 changes: 4 additions & 3 deletions Tests/JExtractSwiftTests/DataImportTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ final class DataImportTests {
]
)
}

@Test("Import Data: JavaBindings")
func data_javaBindings() throws {

Expand Down Expand Up @@ -167,7 +167,7 @@ final class DataImportTests {
public static Data returnData(AllocatingSwiftArena swiftArena$) {
MemorySegment _result = swiftArena$.allocate(Data.$LAYOUT);
swiftjava_SwiftModule_returnData.call(_result);
return new Data(_result, swiftArena$);
return Data.wrapMemoryAddressUnsafe(_result, swiftArena$);
}
""",

Expand Down Expand Up @@ -210,7 +210,7 @@ final class DataImportTests {
public static Data init(java.lang.foreign.MemorySegment bytes, long count, AllocatingSwiftArena swiftArena$) {
MemorySegment _result = swiftArena$.allocate(Data.$LAYOUT);
swiftjava_SwiftModule_Data_init_bytes_count.call(bytes, count, _result);
return new Data(_result, swiftArena$);
return Data.wrapMemoryAddressUnsafe(_result, swiftArena$);
}
""",

Expand Down Expand Up @@ -408,4 +408,5 @@ final class DataImportTests {
]
)
}

}
16 changes: 11 additions & 5 deletions Tests/JExtractSwiftTests/JNI/JNIClassTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,17 @@ struct JNIClassTests {
System.loadLibrary(LIB_NAME);
return true;
}

public MyClass(long selfPointer, SwiftArena swiftArena) {
""",
"""
private MyClass(long selfPointer, SwiftArena swiftArena) {
super(selfPointer, swiftArena);
}
""",
"""
public static MyClass wrapMemoryAddressUnsafe(long selfPointer, SwiftArena swiftArena) {
return new MyClass(selfPointer, swiftArena);
}
"""
])
try assertOutput(
input: source,
Expand Down Expand Up @@ -164,7 +170,7 @@ struct JNIClassTests {
* }
*/
public static MyClass init(long x, long y, SwiftArena swiftArena$) {
return new MyClass(MyClass.$init(x, y), swiftArena$);
return MyClass.wrapMemoryAddressUnsafe(MyClass.$init(x, y), swiftArena$);
}
""",
"""
Expand All @@ -175,7 +181,7 @@ struct JNIClassTests {
* }
*/
public static MyClass init(SwiftArena swiftArena$) {
return new MyClass(MyClass.$init(), swiftArena$);
return MyClass.wrapMemoryAddressUnsafe(MyClass.$init(), swiftArena$);
}
""",
"""
Expand Down Expand Up @@ -309,7 +315,7 @@ struct JNIClassTests {
* }
*/
public MyClass copy(SwiftArena swiftArena$) {
return new MyClass(MyClass.$copy(this.$memoryAddress()), swiftArena$);
return MyClass.wrapMemoryAddressUnsafe(MyClass.$copy(this.$memoryAddress()), swiftArena$);
}
""",
"""
Expand Down
2 changes: 1 addition & 1 deletion Tests/JExtractSwiftTests/JNI/JNIOptionalTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ struct JNIOptionalTests {
public static Optional<MyClass> optionalClass(Optional<MyClass> arg, SwiftArena swiftArena$) {
byte[] result_discriminator$ = new byte[1];
long result$ = SwiftModule.$optionalClass(arg.map(MyClass::$memoryAddress).orElse(0L), result_discriminator$);
return (result_discriminator$[0] == 1) ? Optional.of(new MyClass(result$, swiftArena$)) : Optional.empty();
return (result_discriminator$[0] == 1) ? Optional.of(MyClass.wrapMemoryAddressUnsafe(result$, swiftArena$)) : Optional.empty();
}
""",
"""
Expand Down
12 changes: 9 additions & 3 deletions Tests/JExtractSwiftTests/JNI/JNIStructTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,16 @@ struct JNIStructTests {
System.loadLibrary(LIB_NAME);
return true;
}

public MyStruct(long selfPointer, SwiftArena swiftArena) {
""",
"""
private MyStruct(long selfPointer, SwiftArena swiftArena) {
super(selfPointer, swiftArena);
}
""",
"""
public static MyStruct wrapMemoryAddressUnsafe(long selfPointer, SwiftArena swiftArena) {
return new MyStruct(selfPointer, swiftArena);
}
"""
])
try assertOutput(
Expand Down Expand Up @@ -110,7 +116,7 @@ struct JNIStructTests {
* }
*/
public static MyStruct init(long x, long y, SwiftArena swiftArena$) {
return new MyStruct(MyStruct.$init(x, y), swiftArena$);
return MyStruct.wrapMemoryAddressUnsafe(MyStruct.$init(x, y), swiftArena$);
}
""",
"""
Expand Down
4 changes: 2 additions & 2 deletions Tests/JExtractSwiftTests/MemoryManagementModeTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ struct MemoryManagementModeTests {
* }
*/
public static MyClass f(SwiftArena swiftArena$) {
return new MyClass(SwiftModule.$f(), swiftArena$);
return MyClass.wrapMemoryAddressUnsafe(SwiftModule.$f(), swiftArena$);
}
""",
]
Expand All @@ -68,7 +68,7 @@ struct MemoryManagementModeTests {
""",
"""
public static MyClass f(SwiftArena swiftArena$) {
return new MyClass(SwiftModule.$f(), swiftArena$);
return MyClass.wrapMemoryAddressUnsafe(SwiftModule.$f(), swiftArena$);
}
""",
]
Expand Down
6 changes: 3 additions & 3 deletions Tests/JExtractSwiftTests/MethodImportTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ final class MethodImportTests {
public static MySwiftClass globalReturnClass(AllocatingSwiftArena swiftArena$) {
MemorySegment _result = swiftArena$.allocate(MySwiftClass.$LAYOUT);
swiftjava___FakeModule_globalReturnClass.call(_result);
return new MySwiftClass(_result, swiftArena$);
return MySwiftClass.wrapMemoryAddressUnsafe(_result, swiftArena$);
}
"""
)
Expand Down Expand Up @@ -404,7 +404,7 @@ final class MethodImportTests {
public static MySwiftClass init(long len, long cap, AllocatingSwiftArena swiftArena$) {
MemorySegment _result = swiftArena$.allocate(MySwiftClass.$LAYOUT);
swiftjava___FakeModule_MySwiftClass_init_len_cap.call(len, cap, _result)
return new MySwiftClass(_result, swiftArena$);
return MySwiftClass.wrapMemoryAddressUnsafe(_result, swiftArena$);
}
"""
)
Expand Down Expand Up @@ -449,7 +449,7 @@ final class MethodImportTests {
public static MySwiftStruct init(long len, long cap, AllocatingSwiftArena swiftArena$) {
MemorySegment _result = swiftArena$.allocate(MySwiftStruct.$LAYOUT);
swiftjava___FakeModule_MySwiftStruct_init_len_cap.call(len, cap, _result)
return new MySwiftStruct(_result, swiftArena$);
return MySwiftStruct.wrapMemoryAddressUnsafe(_result, swiftArena$);
}
"""
)
Expand Down
Loading