Migrate Vector128 from kotlin.native to kotlinx.cinterop #KT-58402

Make kotlin.native.Vector128 a typealias for kotlinx.cinterop.Vector128
Choose source compatibility over binary compatibility.
This commit is contained in:
Abduqodiri Qurbonzoda
2023-07-26 12:09:35 +03:00
committed by Space Team
parent 2823fff63d
commit 0f33d71de3
9 changed files with 104 additions and 70 deletions
@@ -54,23 +54,6 @@ external fun CPointer<*>.getRawValue(): NativePtr
@ExperimentalForeignApi @ExperimentalForeignApi
internal fun CPointer<*>.cPointerToString() = "CPointer(raw=$rawValue)" internal fun CPointer<*>.cPointerToString() = "CPointer(raw=$rawValue)"
@ExperimentalForeignApi
@Suppress("FINAL_UPPER_BOUND")
public class Vector128VarOf<T : Vector128>(rawPtr: NativePtr) : CVariable(rawPtr) {
@Deprecated("Use sizeOf<T>() or alignOf<T>() instead.")
@Suppress("DEPRECATION")
companion object : Type(size = 16, align = 16)
}
@ExperimentalForeignApi
public typealias Vector128Var = Vector128VarOf<Vector128>
@ExperimentalForeignApi
@Suppress("FINAL_UPPER_BOUND", "UNCHECKED_CAST")
public var <T : Vector128> Vector128VarOf<T>.value: T
get() = nativeMemUtils.getVector(this) as T
set(value) = nativeMemUtils.putVector(this, value)
/** /**
* Returns a pointer to C function which calls given Kotlin *static* function. * Returns a pointer to C function which calls given Kotlin *static* function.
* *
@@ -0,0 +1,85 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package kotlinx.cinterop
import kotlin.native.internal.GCUnsafeCall
import kotlin.native.internal.TypedIntrinsic
import kotlin.native.internal.IntrinsicType
import kotlinx.cinterop.ExperimentalForeignApi
@SinceKotlin("1.9")
@ExperimentalForeignApi
public final class Vector128 private constructor() {
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getByteAt(index: Int): Byte
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getIntAt(index: Int): Int
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getLongAt(index: Int): Long
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getFloatAt(index: Int): Float
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getDoubleAt(index: Int): Double
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getUByteAt(index: Int): UByte
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getUIntAt(index: Int): UInt
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getULongAt(index: Int): ULong
public override fun toString() =
"(0x${getUIntAt(0).toString(16)}, 0x${getUIntAt(1).toString(16)}, 0x${getUIntAt(2).toString(16)}, 0x${getUIntAt(3).toString(16)})"
// Not as good for floating types
public override fun equals(other: Any?): Boolean =
other is Vector128 && getLongAt(0) == other.getLongAt(0) && getLongAt(1) == other.getLongAt(1)
override fun hashCode(): Int {
val x0 = getLongAt(0)
val x1 = getLongAt(1)
return 31 * (x0 xor (x0 shr 32)).toInt() + (x1 xor (x1 shr 32)).toInt()
}
}
@SinceKotlin("1.9")
@ExperimentalForeignApi
@GCUnsafeCall("Kotlin_Interop_Vector4f_of")
public external fun vectorOf(f0: Float, f1: Float, f2: Float, f3: Float): Vector128
@SinceKotlin("1.9")
@ExperimentalForeignApi
@GCUnsafeCall("Kotlin_Interop_Vector4i32_of")
public external fun vectorOf(f0: Int, f1: Int, f2: Int, f3: Int): Vector128
@SinceKotlin("1.9")
@ExperimentalForeignApi
@Suppress("FINAL_UPPER_BOUND")
public class Vector128VarOf<T : Vector128>(rawPtr: NativePtr) : CVariable(rawPtr) {
@Deprecated("Use sizeOf<T>() or alignOf<T>() instead.")
@Suppress("DEPRECATION")
companion object : Type(size = 16, align = 16)
}
@SinceKotlin("1.9")
@ExperimentalForeignApi
public typealias Vector128Var = Vector128VarOf<Vector128>
@SinceKotlin("1.9")
@ExperimentalForeignApi
@Suppress("FINAL_UPPER_BOUND", "UNCHECKED_CAST")
public var <T : Vector128> Vector128VarOf<T>.value: T
get() = nativeMemUtils.getVector(this) as T
set(value) = nativeMemUtils.putVector(this, value)
@@ -189,7 +189,7 @@ object KotlinTypes {
val map by CollectionClassifier val map by CollectionClassifier
val nativePtr by InteropType val nativePtr by InteropType
val vector128 by KotlinNativeType val vector128 by InteropType
val cOpaque by InteropType val cOpaque by InteropType
val cOpaquePointer by InteropType val cOpaquePointer by InteropType
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.name.Name
internal const val NATIVE_PTR_NAME = "NativePtr" internal const val NATIVE_PTR_NAME = "NativePtr"
internal const val NON_NULL_NATIVE_PTR_NAME = "NonNullNativePtr" internal const val NON_NULL_NATIVE_PTR_NAME = "NonNullNativePtr"
internal const val VECTOR128 = "Vector128"
internal const val IMMUTABLE_BLOB_OF = "immutableBlobOf" internal const val IMMUTABLE_BLOB_OF = "immutableBlobOf"
object KonanFqNames { object KonanFqNames {
@@ -20,7 +19,7 @@ object KonanFqNames {
val internalPackageName = FqName("kotlin.native.internal") val internalPackageName = FqName("kotlin.native.internal")
val nativePtr = internalPackageName.child(Name.identifier(NATIVE_PTR_NAME)).toUnsafe() val nativePtr = internalPackageName.child(Name.identifier(NATIVE_PTR_NAME)).toUnsafe()
val nonNullNativePtr = internalPackageName.child(Name.identifier(NON_NULL_NATIVE_PTR_NAME)).toUnsafe() val nonNullNativePtr = internalPackageName.child(Name.identifier(NON_NULL_NATIVE_PTR_NAME)).toUnsafe()
val Vector128 = packageName.child(Name.identifier(VECTOR128)) val Vector128 = FqName("kotlinx.cinterop.Vector128")
val throws = FqName("kotlin.Throws") val throws = FqName("kotlin.Throws")
val cancellationException = FqName("kotlin.coroutines.cancellation.CancellationException") val cancellationException = FqName("kotlin.coroutines.cancellation.CancellationException")
val threadLocal = FqName("kotlin.native.concurrent.ThreadLocal") val threadLocal = FqName("kotlin.native.concurrent.ThreadLocal")
@@ -1,6 +1,7 @@
@file:OptIn(kotlinx.cinterop.ExperimentalForeignApi::class, kotlin.experimental.ExperimentalNativeApi::class) @file:OptIn(kotlinx.cinterop.ExperimentalForeignApi::class, kotlin.experimental.ExperimentalNativeApi::class)
import kotlinx.cinterop.* import kotlinx.cinterop.*
import kotlinx.cinterop.vectorOf
import kotlin.native.* import kotlin.native.*
import kotlin.test.* import kotlin.test.*
import cvectors.* import cvectors.*
@@ -7,6 +7,8 @@
package runtime.basic.simd package runtime.basic.simd
import kotlin.test.* import kotlin.test.*
import kotlinx.cinterop.Vector128
import kotlinx.cinterop.vectorOf
@Test fun runTest() { @Test fun runTest() {
+2 -2
View File
@@ -93,7 +93,7 @@ bool IsSubInterface(const TypeInfo* thiz, const TypeInfo* other) {
return false; return false;
} }
KVector4f Kotlin_Vector4f_of(KFloat f0, KFloat f1, KFloat f2, KFloat f3) { KVector4f Kotlin_Interop_Vector4f_of(KFloat f0, KFloat f1, KFloat f2, KFloat f3) {
return {f0, f1, f2, f3}; return {f0, f1, f2, f3};
} }
@@ -103,7 +103,7 @@ KVector4f Kotlin_Vector4f_of(KFloat f0, KFloat f1, KFloat f2, KFloat f3) {
* To avoid illegal bitcast from/to function types the following function * To avoid illegal bitcast from/to function types the following function
* return type MUST be <4 x float> and explicit type cast is done on the variable type. * return type MUST be <4 x float> and explicit type cast is done on the variable type.
*/ */
KVector4f Kotlin_Vector4i32_of(KInt f0, KInt f1, KInt f2, KInt f3) { KVector4f Kotlin_Interop_Vector4i32_of(KInt f0, KInt f1, KInt f2, KInt f3) {
KInt __attribute__ ((__vector_size__(16))) v4i = {f0, f1, f2, f3}; KInt __attribute__ ((__vector_size__(16))) v4i = {f0, f1, f2, f3};
return (KVector4f)v4i; return (KVector4f)v4i;
} }
@@ -6,10 +6,7 @@
package kotlin.native.internal package kotlin.native.internal
import kotlinx.cinterop.CPointer import kotlinx.cinterop.*
import kotlinx.cinterop.NativePointed
import kotlinx.cinterop.NativePtr
import kotlinx.cinterop.ExperimentalForeignApi
import kotlin.native.internal.TypedIntrinsic import kotlin.native.internal.TypedIntrinsic
import kotlin.native.internal.IntrinsicType import kotlin.native.internal.IntrinsicType
@@ -10,54 +10,21 @@ import kotlin.native.internal.IntrinsicType
import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.cinterop.ExperimentalForeignApi
@Deprecated("Use kotlinx.cinterop.Vector128 instead.", ReplaceWith("kotlinx.cinterop.Vector128"))
@DeprecatedSinceKotlin(warningSince = "1.9")
@ExperimentalForeignApi @ExperimentalForeignApi
public final class Vector128 private constructor() { public typealias Vector128 = kotlinx.cinterop.Vector128
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getByteAt(index: Int): Byte
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getIntAt(index: Int): Int
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getLongAt(index: Int): Long
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getFloatAt(index: Int): Float
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getDoubleAt(index: Int): Double
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getUByteAt(index: Int): UByte
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getUIntAt(index: Int): UInt
@TypedIntrinsic(IntrinsicType.EXTRACT_ELEMENT)
external fun getULongAt(index: Int): ULong
public override fun toString() =
"(0x${getUIntAt(0).toString(16)}, 0x${getUIntAt(1).toString(16)}, 0x${getUIntAt(2).toString(16)}, 0x${getUIntAt(3).toString(16)})"
@Deprecated("Provided for binary compatibility", level = DeprecationLevel.HIDDEN)
public fun equals(other: Vector128): Boolean =
getLongAt(0) == other.getLongAt(0) && getLongAt(1) == other.getLongAt(1)
// Not as good for floating types
public override fun equals(other: Any?): Boolean =
other is Vector128 && getLongAt(0) == other.getLongAt(0) && getLongAt(1) == other.getLongAt(1)
override fun hashCode(): Int {
val x0 = getLongAt(0)
val x1 = getLongAt(1)
return 31 * (x0 xor (x0 shr 32)).toInt() + (x1 xor (x1 shr 32)).toInt()
}
}
@Suppress("DEPRECATION")
@Deprecated("Use kotlinx.cinterop.vectorOf instead.", ReplaceWith("kotlinx.cinterop.vectorOf(f0, f1, f2, f3)"))
@DeprecatedSinceKotlin(warningSince = "1.9")
@ExperimentalForeignApi @ExperimentalForeignApi
@GCUnsafeCall("Kotlin_Vector4f_of") @GCUnsafeCall("Kotlin_Interop_Vector4f_of")
external fun vectorOf(f0: Float, f1: Float, f2: Float, f3: Float): Vector128 external fun vectorOf(f0: Float, f1: Float, f2: Float, f3: Float): Vector128
@Suppress("DEPRECATION")
@Deprecated("Use kotlinx.cinterop.vectorOf instead.", ReplaceWith("kotlinx.cinterop.vectorOf(f0, f1, f2, f3)"))
@DeprecatedSinceKotlin(warningSince = "1.9")
@ExperimentalForeignApi @ExperimentalForeignApi
@GCUnsafeCall("Kotlin_Vector4i32_of") @GCUnsafeCall("Kotlin_Interop_Vector4i32_of")
external fun vectorOf(f0: Int, f1: Int, f2: Int, f3: Int): Vector128 external fun vectorOf(f0: Int, f1: Int, f2: Int, f3: Int): Vector128