[ObjCExport] Fix emission of 'ValueTypeBridge' for 'non primitive' types

^KT-65167
This commit is contained in:
Sebastian Sellmair
2024-01-23 16:50:33 +01:00
parent 8fbf0f21c8
commit a6a27466fc
2 changed files with 39 additions and 43 deletions
@@ -68,32 +68,32 @@ private fun bridgeType(
type: KtType,
): TypeBridge {
return if (type.isPrimitive) {
val objCType = when {
type.isBoolean -> ObjCValueType.BOOL
type.isChar -> ObjCValueType.UNICHAR
type.isByte -> ObjCValueType.CHAR
type.isShort -> ObjCValueType.SHORT
type.isInt -> ObjCValueType.INT
type.isLong -> ObjCValueType.LONG_LONG
type.isFloat -> ObjCValueType.FLOAT
type.isDouble -> ObjCValueType.DOUBLE
type.isUByte -> ObjCValueType.UNSIGNED_CHAR
type.isUShort -> ObjCValueType.UNSIGNED_SHORT
type.isUInt -> ObjCValueType.UNSIGNED_INT
type.isULong -> ObjCValueType.UNSIGNED_LONG_LONG
else ->
/**
* Handle [KonanPrimitiveType.NON_NULL_NATIVE_PTR] and [KonanPrimitiveType.VECTOR128]
*/
TODO()
}
ValueTypeBridge(objCType)
} else if (type.isFunctionType) {
bridgeFunctionType(type)
} else {
ReferenceBridge
val primitiveObjCValueType = when {
type.isBoolean -> ObjCValueType.BOOL
type.isChar -> ObjCValueType.UNICHAR
type.isByte -> ObjCValueType.CHAR
type.isShort -> ObjCValueType.SHORT
type.isInt -> ObjCValueType.INT
type.isLong -> ObjCValueType.LONG_LONG
type.isFloat -> ObjCValueType.FLOAT
type.isDouble -> ObjCValueType.DOUBLE
type.isUByte -> ObjCValueType.UNSIGNED_CHAR
type.isUShort -> ObjCValueType.UNSIGNED_SHORT
type.isUInt -> ObjCValueType.UNSIGNED_INT
type.isULong -> ObjCValueType.UNSIGNED_LONG_LONG
type.isClassTypeWithClassId(KonanPrimitiveType.NON_NULL_NATIVE_PTR.classId) -> ObjCValueType.POINTER
else -> null
}
if (primitiveObjCValueType != null) {
return ValueTypeBridge(primitiveObjCValueType)
}
if (type.isFunctionType) {
return bridgeFunctionType(type)
}
return ReferenceBridge
}
/**
@@ -361,24 +361,20 @@ private fun KtType.mapType(typeBridge: TypeBridge): ObjCType {
return when (typeBridge) {
is ReferenceBridge -> this.translateToObjCReferenceType()
is BlockPointerBridge -> this.translateToObjCFunctionType(typeBridge)
is ValueTypeBridge -> {
when {
isBoolean -> ObjCPrimitiveType.BOOL
isChar -> ObjCPrimitiveType.int8_t
isByte -> ObjCPrimitiveType.char
isShort -> ObjCPrimitiveType.int16_t
isInt -> ObjCPrimitiveType.int32_t
isLong -> ObjCPrimitiveType.long_long
isFloat -> ObjCPrimitiveType.float
isDouble -> ObjCPrimitiveType.double
isUByte -> ObjCPrimitiveType.unsigned_char
isUShort -> ObjCPrimitiveType.unsigned_short
isUInt -> ObjCPrimitiveType.unsigned_int
isULong -> ObjCPrimitiveType.unsigned_long_long
else -> TODO("Handle primitive KtType mapping to ObjCType: $this")
}
is ValueTypeBridge -> 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, this.isMarkedNullable)
}
}
}