Support exposing pointer types when producing framework

This commit is contained in:
Svyatoslav Scherbina
2018-08-09 14:02:24 +03:00
committed by SvyatoslavScherbina
parent 066429831e
commit d52a3f0c3d
4 changed files with 20 additions and 18 deletions
@@ -100,7 +100,7 @@ internal class ObjCExportCodeGenerator(
ObjCValueType.CHAR, ObjCValueType.SHORT, ObjCValueType.INT, ObjCValueType.LONG_LONG,
ObjCValueType.UNSIGNED_CHAR, ObjCValueType.UNSIGNED_SHORT, ObjCValueType.UNSIGNED_INT,
ObjCValueType.UNSIGNED_LONG_LONG,
ObjCValueType.FLOAT, ObjCValueType.DOUBLE -> value
ObjCValueType.FLOAT, ObjCValueType.DOUBLE, ObjCValueType.POINTER -> value
}
private fun FunctionGenerationContext.objCToKotlin(
@@ -113,7 +113,7 @@ internal class ObjCExportCodeGenerator(
ObjCValueType.CHAR, ObjCValueType.SHORT, ObjCValueType.INT, ObjCValueType.LONG_LONG,
ObjCValueType.UNSIGNED_CHAR, ObjCValueType.UNSIGNED_SHORT, ObjCValueType.UNSIGNED_INT,
ObjCValueType.UNSIGNED_LONG_LONG,
ObjCValueType.FLOAT, ObjCValueType.DOUBLE -> value
ObjCValueType.FLOAT, ObjCValueType.DOUBLE, ObjCValueType.POINTER -> value
}
fun FunctionGenerationContext.kotlinReferenceToObjC(value: LLVMValueRef) =
@@ -1115,6 +1115,7 @@ private val ObjCValueType.llvmType: LLVMTypeRef get() = when (this) {
ObjCValueType.UNSIGNED_LONG_LONG -> int64Type
ObjCValueType.FLOAT -> LLVMFloatType()!!
ObjCValueType.DOUBLE -> LLVMDoubleType()!!
ObjCValueType.POINTER -> kInt8Ptr
}
private val MethodBridgeParameter.objCType: LLVMTypeRef get() = when (this) {
@@ -741,22 +741,22 @@ abstract class ObjCExportHeaderGenerator(
private fun mapType(kotlinType: KotlinType, typeBridge: TypeBridge): ObjCType = when (typeBridge) {
ReferenceBridge -> mapReferenceType(kotlinType)
is ValueTypeBridge -> {
val cName = when (typeBridge.objCValueType) {
ObjCValueType.BOOL -> "BOOL"
ObjCValueType.UNICHAR -> "unichar"
ObjCValueType.CHAR -> "int8_t"
ObjCValueType.SHORT -> "int16_t"
ObjCValueType.INT -> "int32_t"
ObjCValueType.LONG_LONG -> "int64_t"
ObjCValueType.UNSIGNED_CHAR -> "uint8_t"
ObjCValueType.UNSIGNED_SHORT -> "uint16_t"
ObjCValueType.UNSIGNED_INT -> "uint32_t"
ObjCValueType.UNSIGNED_LONG_LONG -> "uint64_t"
ObjCValueType.FLOAT -> "float"
ObjCValueType.DOUBLE -> "double"
when (typeBridge.objCValueType) {
ObjCValueType.BOOL -> ObjCPrimitiveType("BOOL")
ObjCValueType.UNICHAR -> ObjCPrimitiveType("unichar")
ObjCValueType.CHAR -> ObjCPrimitiveType("int8_t")
ObjCValueType.SHORT -> ObjCPrimitiveType("int16_t")
ObjCValueType.INT -> ObjCPrimitiveType("int32_t")
ObjCValueType.LONG_LONG -> ObjCPrimitiveType("int64_t")
ObjCValueType.UNSIGNED_CHAR -> ObjCPrimitiveType("uint8_t")
ObjCValueType.UNSIGNED_SHORT -> ObjCPrimitiveType("uint16_t")
ObjCValueType.UNSIGNED_INT -> ObjCPrimitiveType("uint32_t")
ObjCValueType.UNSIGNED_LONG_LONG -> ObjCPrimitiveType("uint64_t")
ObjCValueType.FLOAT -> ObjCPrimitiveType("float")
ObjCValueType.DOUBLE -> ObjCPrimitiveType("double")
ObjCValueType.POINTER -> ObjCPointerType(ObjCVoidType)
}
// TODO: consider other namings.
ObjCPrimitiveType(cName)
}
}
}
@@ -130,7 +130,7 @@ private fun ObjCExportMapper.bridgeType(kotlinType: KotlinType): TypeBridge = ko
KonanPrimitiveType.LONG -> ObjCValueType.LONG_LONG
KonanPrimitiveType.FLOAT -> ObjCValueType.FLOAT
KonanPrimitiveType.DOUBLE -> ObjCValueType.DOUBLE
KonanPrimitiveType.NON_NULL_NATIVE_PTR -> error("Can't produce pointer type to framework API") // TODO
KonanPrimitiveType.NON_NULL_NATIVE_PTR -> ObjCValueType.POINTER
}
ValueTypeBridge(objCValueType)
},
@@ -123,5 +123,6 @@ internal enum class ObjCValueType(val encoding: String) {
UNSIGNED_INT("I"),
UNSIGNED_LONG_LONG("Q"),
FLOAT("f"),
DOUBLE("d")
DOUBLE("d"),
POINTER("^v")
}