@@ -33,7 +33,7 @@ extension Swift2JavaVisitor {
33
33
cCompatibleConvention: . direct,
34
34
originalSwiftType: type,
35
35
cCompatibleSwiftType: " @convention(c) () -> Void " ,
36
- cCompatibleJavaMemoryLayout: . memorySegment ,
36
+ cCompatibleJavaMemoryLayout: . cFunction ,
37
37
javaType: . javaLangRunnable
38
38
)
39
39
}
@@ -134,7 +134,7 @@ extension Swift2JavaVisitor {
134
134
cCompatibleConvention: . direct,
135
135
originalSwiftType: type,
136
136
cCompatibleSwiftType: " UnsafeMutableRawPointer " ,
137
- cCompatibleJavaMemoryLayout: . memorySegment ,
137
+ cCompatibleJavaMemoryLayout: . heapObject ,
138
138
javaType: . javaForeignMemorySegment
139
139
)
140
140
}
@@ -155,7 +155,7 @@ extension Swift2JavaVisitor {
155
155
cCompatibleConvention: . indirect,
156
156
originalSwiftType: type,
157
157
cCompatibleSwiftType: " UnsafeMutablePointer< \( type) > " ,
158
- cCompatibleJavaMemoryLayout: . memorySegment ,
158
+ cCompatibleJavaMemoryLayout: . heapObject ,
159
159
javaType: . class( package : nil , name: name)
160
160
)
161
161
}
@@ -235,15 +235,49 @@ extension TranslatedType {
235
235
}
236
236
}
237
237
238
+ /// Describes the C-compatible layout as it should be referenced from Java.
238
239
enum CCompatibleJavaMemoryLayout {
239
- /// A primitive Java type.
240
+ /// A primitive Java type that has a direct counterpart in C .
240
241
case primitive( JavaType )
241
242
242
243
/// The Swift "Int" type, which may be either a Java int (32-bit platforms) or
243
244
/// Java long (64-bit platforms).
244
245
case int
245
246
246
- case memorySegment
247
+ /// A Swift heap object, which is treated as a pointer for interoperability
248
+ /// purposes but must be retained/released to keep it alive.
249
+ case heapObject
250
+
251
+ /// A C function pointer. In Swift, this will be a @convention(c) function.
252
+ /// In Java, a downcall handle to a function.
253
+ case cFunction
254
+ }
255
+
256
+ extension TranslatedType {
257
+ /// Determine the foreign value layout to use for the translated type with
258
+ /// the Java Foreign Function and Memory API.
259
+ var foreignValueLayout : ForeignValueLayout {
260
+ switch cCompatibleJavaMemoryLayout {
261
+ case . primitive( let javaType) :
262
+ switch javaType {
263
+ case . boolean: return . SwiftBool
264
+ case . byte: return . SwiftInt8
265
+ case . char: return . SwiftUInt16
266
+ case . short: return . SwiftInt16
267
+ case . int: return . SwiftInt32
268
+ case . long: return . SwiftInt64
269
+ case . float: return . SwiftFloat
270
+ case . double: return . SwiftDouble
271
+ case . array, . class, . void: fatalError ( " Not a primitive type " )
272
+ }
273
+
274
+ case . int:
275
+ return . SwiftInt
276
+
277
+ case . heapObject, . cFunction:
278
+ return . SwiftPointer
279
+ }
280
+ }
247
281
}
248
282
249
283
enum TypeTranslationError : Error {
0 commit comments