diff --git a/Interop/Runtime/src/native/kotlin/kotlinx/cinterop/Pinning.kt b/Interop/Runtime/src/native/kotlin/kotlinx/cinterop/Pinning.kt index eabb6b044de..2b69bbabf05 100644 --- a/Interop/Runtime/src/native/kotlin/kotlinx/cinterop/Pinning.kt +++ b/Interop/Runtime/src/native/kotlin/kotlinx/cinterop/Pinning.kt @@ -47,6 +47,12 @@ inline fun T.usePinned(block: (Pinned) -> R): R { fun Pinned.addressOf(index: Int): CPointer = this.get().addressOfElement(index) fun ByteArray.refTo(index: Int): CValuesRef = this.usingPinned { addressOf(index) } +fun Pinned.addressOf(index: Int): CPointer = this.get().addressOfElement(index) +fun String.refTo(index: Int): CValuesRef = this.usingPinned { addressOf(index) } + +fun Pinned.addressOf(index: Int): CPointer = this.get().addressOfElement(index) +fun CharArray.refTo(index: Int): CValuesRef = this.usingPinned { addressOf(index) } + fun Pinned.addressOf(index: Int): CPointer = this.get().addressOfElement(index) fun ShortArray.refTo(index: Int): CValuesRef = this.usingPinned { addressOf(index) } @@ -89,6 +95,12 @@ private inline fun T.usingPinned( @SymbolName("Kotlin_Arrays_getByteArrayAddressOfElement") private external fun ByteArray.addressOfElement(index: Int): CPointer +@SymbolName("Kotlin_Arrays_getStringAddressOfElement") +private external fun String.addressOfElement(index: Int): CPointer + +@SymbolName("Kotlin_Arrays_getCharArrayAddressOfElement") +private external fun CharArray.addressOfElement(index: Int): CPointer + @SymbolName("Kotlin_Arrays_getShortArrayAddressOfElement") private external fun ShortArray.addressOfElement(index: Int): CPointer diff --git a/runtime/src/main/cpp/Arrays.cpp b/runtime/src/main/cpp/Arrays.cpp index faf41f2daab..7d0e622d62a 100644 --- a/runtime/src/main/cpp/Arrays.cpp +++ b/runtime/src/main/cpp/Arrays.cpp @@ -661,6 +661,15 @@ KNativePtr Kotlin_Arrays_getByteArrayAddressOfElement(KRef thiz, KInt index) { return AddressOfElementAt(array, index); } +KNativePtr Kotlin_Arrays_getCharArrayAddressOfElement (KRef thiz, KInt index) { + ArrayHeader* array = thiz->array(); + return CharArrayAddressOfElementAt(array, index); +} + +KNativePtr Kotlin_Arrays_getStringAddressOfElement (KRef thiz, KInt index) { + return Kotlin_Arrays_getCharArrayAddressOfElement(thiz, index); +} + KNativePtr Kotlin_Arrays_getShortArrayAddressOfElement(KRef thiz, KInt index) { ArrayHeader* array = thiz->array(); if (index < 0 || index >= array->count_) {