[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, type: KtType,
): TypeBridge { ): TypeBridge {
return if (type.isPrimitive) { val primitiveObjCValueType = when {
val objCType = when { type.isBoolean -> ObjCValueType.BOOL
type.isBoolean -> ObjCValueType.BOOL type.isChar -> ObjCValueType.UNICHAR
type.isChar -> ObjCValueType.UNICHAR type.isByte -> ObjCValueType.CHAR
type.isByte -> ObjCValueType.CHAR type.isShort -> ObjCValueType.SHORT
type.isShort -> ObjCValueType.SHORT type.isInt -> ObjCValueType.INT
type.isInt -> ObjCValueType.INT type.isLong -> ObjCValueType.LONG_LONG
type.isLong -> ObjCValueType.LONG_LONG type.isFloat -> ObjCValueType.FLOAT
type.isFloat -> ObjCValueType.FLOAT type.isDouble -> ObjCValueType.DOUBLE
type.isDouble -> ObjCValueType.DOUBLE type.isUByte -> ObjCValueType.UNSIGNED_CHAR
type.isUByte -> ObjCValueType.UNSIGNED_CHAR type.isUShort -> ObjCValueType.UNSIGNED_SHORT
type.isUShort -> ObjCValueType.UNSIGNED_SHORT type.isUInt -> ObjCValueType.UNSIGNED_INT
type.isUInt -> ObjCValueType.UNSIGNED_INT type.isULong -> ObjCValueType.UNSIGNED_LONG_LONG
type.isULong -> ObjCValueType.UNSIGNED_LONG_LONG type.isClassTypeWithClassId(KonanPrimitiveType.NON_NULL_NATIVE_PTR.classId) -> ObjCValueType.POINTER
else -> else -> null
/**
* Handle [KonanPrimitiveType.NON_NULL_NATIVE_PTR] and [KonanPrimitiveType.VECTOR128]
*/
TODO()
}
ValueTypeBridge(objCType)
} else if (type.isFunctionType) {
bridgeFunctionType(type)
} else {
ReferenceBridge
} }
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) { return when (typeBridge) {
is ReferenceBridge -> this.translateToObjCReferenceType() is ReferenceBridge -> this.translateToObjCReferenceType()
is BlockPointerBridge -> this.translateToObjCFunctionType(typeBridge) is BlockPointerBridge -> this.translateToObjCFunctionType(typeBridge)
is ValueTypeBridge -> { is ValueTypeBridge -> when (typeBridge.objCValueType) {
when { ObjCValueType.BOOL -> ObjCPrimitiveType.BOOL
isBoolean -> ObjCPrimitiveType.BOOL ObjCValueType.UNICHAR -> ObjCPrimitiveType.unichar
isChar -> ObjCPrimitiveType.int8_t ObjCValueType.CHAR -> ObjCPrimitiveType.int8_t
isByte -> ObjCPrimitiveType.char ObjCValueType.SHORT -> ObjCPrimitiveType.int16_t
isShort -> ObjCPrimitiveType.int16_t ObjCValueType.INT -> ObjCPrimitiveType.int32_t
isInt -> ObjCPrimitiveType.int32_t ObjCValueType.LONG_LONG -> ObjCPrimitiveType.int64_t
isLong -> ObjCPrimitiveType.long_long ObjCValueType.UNSIGNED_CHAR -> ObjCPrimitiveType.uint8_t
isFloat -> ObjCPrimitiveType.float ObjCValueType.UNSIGNED_SHORT -> ObjCPrimitiveType.uint16_t
isDouble -> ObjCPrimitiveType.double ObjCValueType.UNSIGNED_INT -> ObjCPrimitiveType.uint32_t
isUByte -> ObjCPrimitiveType.unsigned_char ObjCValueType.UNSIGNED_LONG_LONG -> ObjCPrimitiveType.uint64_t
isUShort -> ObjCPrimitiveType.unsigned_short ObjCValueType.FLOAT -> ObjCPrimitiveType.float
isUInt -> ObjCPrimitiveType.unsigned_int ObjCValueType.DOUBLE -> ObjCPrimitiveType.double
isULong -> ObjCPrimitiveType.unsigned_long_long ObjCValueType.POINTER -> ObjCPointerType(ObjCVoidType, this.isMarkedNullable)
else -> TODO("Handle primitive KtType mapping to ObjCType: $this")
}
} }
} }
} }