From 890ebb02bb5b386508d544fd27d16e639ffdc4ab Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Wed, 2 Oct 2019 19:32:20 +0300 Subject: [PATCH] Add `is64BitLong` function. Use exhaustive when in `is64BitLong` and `is64BitNSInteger` to make code a bit more robust. --- .../llvm/objcexport/BlockPointerSupport.kt | 2 +- .../objcexport/ObjCExportCodeGenerator.kt | 53 +++++++++++++++++-- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/BlockPointerSupport.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/BlockPointerSupport.kt index d382a1aa243..ceb33cfd9fb 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/BlockPointerSupport.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/BlockPointerSupport.kt @@ -188,7 +188,7 @@ internal class BlockAdapterToFunctionGenerator(val objCExportCodeGenerator: ObjC } fun org.jetbrains.kotlin.backend.konan.Context.LongInt(value: Long) = - if (is64BitNSInteger()) Int64(value) else Int32(value.toInt()) + if (is64BitLong()) Int64(value) else Int32(value.toInt()) private fun generateDescriptorForBlockAdapterToFunction(bridge: BlockPointerBridge): ConstValue { val numberOfParameters = bridge.numberOfParameters diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt index 36ba100e7d2..cde2b5d01bc 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt @@ -1325,7 +1325,54 @@ private val TypeBridge.objCEncoding: String get() = when (this) { is ValueTypeBridge -> this.objCValueType.encoding } -internal fun Context.is64BitNSInteger(): Boolean = this.config.target.let { - // We work with watchos_arm64 the same as we work with watchos_arm32. - it.architecture.bitness == 64 && it != KonanTarget.WATCHOS_ARM64 +internal fun Context.is64BitNSInteger(): Boolean = when (val target = this.config.target) { + KonanTarget.IOS_X64, + KonanTarget.IOS_ARM64, + KonanTarget.TVOS_ARM64, + KonanTarget.TVOS_X64, + KonanTarget.MACOS_X64 -> true + KonanTarget.WATCHOS_ARM64, + KonanTarget.WATCHOS_ARM32, + KonanTarget.WATCHOS_X86, + KonanTarget.IOS_ARM32 -> false + KonanTarget.ANDROID_X64, + KonanTarget.ANDROID_X86, + KonanTarget.ANDROID_ARM32, + KonanTarget.ANDROID_ARM64, + KonanTarget.LINUX_X64, + KonanTarget.MINGW_X86, + KonanTarget.MINGW_X64, + KonanTarget.LINUX_ARM64, + KonanTarget.LINUX_ARM32_HFP, + KonanTarget.LINUX_MIPS32, + KonanTarget.LINUX_MIPSEL32, + KonanTarget.WASM32, + is KonanTarget.ZEPHYR -> error("Target $target has no support for NSInteger type.") + KonanTarget.WATCHOS_X64 -> error("Target $target is not supported.") } + +internal fun Context.is64BitLong(): Boolean = when (val target = this.config.target) { + KonanTarget.IOS_X64, + KonanTarget.IOS_ARM64, + KonanTarget.TVOS_ARM64, + KonanTarget.TVOS_X64, + KonanTarget.ANDROID_X64, + KonanTarget.ANDROID_ARM64, + KonanTarget.LINUX_ARM64, + KonanTarget.MINGW_X64, + KonanTarget.LINUX_X64, + KonanTarget.MACOS_X64 -> true + KonanTarget.WATCHOS_ARM64, + KonanTarget.WATCHOS_ARM32, + KonanTarget.ANDROID_X86, + KonanTarget.ANDROID_ARM32, + KonanTarget.WATCHOS_X86, + KonanTarget.MINGW_X86, + KonanTarget.LINUX_ARM32_HFP, + KonanTarget.LINUX_MIPS32, + KonanTarget.LINUX_MIPSEL32, + KonanTarget.WASM32, + is KonanTarget.ZEPHYR, + KonanTarget.IOS_ARM32 -> false + KonanTarget.WATCHOS_X64 -> error("Target $target is not supported.") +} \ No newline at end of file