@@ -33,7 +33,7 @@ extension Swift2JavaVisitor {
3333 cCompatibleConvention: . direct,
3434 originalSwiftType: type,
3535 cCompatibleSwiftType: " @convention(c) () -> Void " ,
36- cCompatibleJavaMemoryLayout: . memorySegment ,
36+ cCompatibleJavaMemoryLayout: . cFunction ,
3737 javaType: . javaLangRunnable
3838 )
3939 }
@@ -134,7 +134,7 @@ extension Swift2JavaVisitor {
134134 cCompatibleConvention: . direct,
135135 originalSwiftType: type,
136136 cCompatibleSwiftType: " UnsafeMutableRawPointer " ,
137- cCompatibleJavaMemoryLayout: . memorySegment ,
137+ cCompatibleJavaMemoryLayout: . heapObject ,
138138 javaType: . javaForeignMemorySegment
139139 )
140140 }
@@ -155,7 +155,7 @@ extension Swift2JavaVisitor {
155155 cCompatibleConvention: . indirect,
156156 originalSwiftType: type,
157157 cCompatibleSwiftType: " UnsafeMutablePointer< \( type) > " ,
158- cCompatibleJavaMemoryLayout: . memorySegment ,
158+ cCompatibleJavaMemoryLayout: . heapObject ,
159159 javaType: . class( package : nil , name: name)
160160 )
161161 }
@@ -235,15 +235,49 @@ extension TranslatedType {
235235 }
236236}
237237
238+ /// Describes the C-compatible layout as it should be referenced from Java.
238239enum CCompatibleJavaMemoryLayout {
239- /// A primitive Java type.
240+ /// A primitive Java type that has a direct counterpart in C .
240241 case primitive( JavaType )
241242
242243 /// The Swift "Int" type, which may be either a Java int (32-bit platforms) or
243244 /// Java long (64-bit platforms).
244245 case int
245246
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+ }
247281}
248282
249283enum TypeTranslationError : Error {
0 commit comments