[WASM] Replace String storage type from CharArray to WasmCharArray

This commit is contained in:
Igor Yakovlev
2022-03-02 20:50:19 +01:00
committed by teamcity
parent fb0819d490
commit d881f0d2a6
8 changed files with 113 additions and 55 deletions
@@ -5,6 +5,8 @@
package kotlin.text
import kotlin.wasm.internal.*
internal fun insertString(array: CharArray, distIndex: Int, value: String, sourceIndex: Int, count: Int): Int {
var arrayIdx = distIndex
var stringIdx = sourceIndex
@@ -14,8 +16,11 @@ internal fun insertString(array: CharArray, distIndex: Int, value: String, sourc
return count
}
internal fun unsafeStringFromCharArray(array: CharArray, start: Int, size: Int): String =
String.unsafeFromCharArray(array.copyOfRange(start, start + size))
internal fun unsafeStringFromCharArray(array: CharArray, start: Int, size: Int): String {
val copy = WasmCharArray(size)
copy.fill(size) { array[it + start] }
return String.unsafeFromCharArray(copy)
}
internal fun insertInt(array: CharArray, start: Int, value: Int): Int {
val valueString = value.toString()
@@ -5,6 +5,8 @@
package kotlin.text
import kotlin.wasm.internal.*
/**
* Returns the index within this string of the first occurrence of the specified character, starting from the specified offset.
*/
@@ -70,7 +72,10 @@ public actual fun String(chars: CharArray): String =
public actual fun String(chars: CharArray, offset: Int, length: Int): String {
if (offset < 0 || length < 0 || offset + length > chars.size)
throw IndexOutOfBoundsException()
return String.unsafeFromCharArray(chars.copyOfRange(offset, offset + length))
val copy = WasmCharArray(length)
copy.fill(length) { chars[it + offset] }
return String.unsafeFromCharArray(copy)
}
/**
@@ -78,8 +83,11 @@ public actual fun String(chars: CharArray, offset: Int, length: Int): String {
*/
@SinceKotlin("1.4")
@WasExperimental(ExperimentalStdlibApi::class)
public actual fun CharArray.concatToString(): String =
String.unsafeFromCharArray(this.copyOf())
public actual fun CharArray.concatToString(): String {
val copy = WasmCharArray(this.size)
copy.fill(this.size) { this[it] }
return String.unsafeFromCharArray(copy)
}
/**
* Concatenates characters in this [CharArray] or its subrange into a String.
@@ -95,7 +103,11 @@ public actual fun CharArray.concatToString(): String =
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
public actual fun CharArray.concatToString(startIndex: Int = 0, endIndex: Int = this.size): String {
AbstractList.checkBoundsIndexes(startIndex, endIndex, this.size)
return String.unsafeFromCharArray(this.copyOfRange(startIndex, endIndex))
val length = endIndex - startIndex
val copy = WasmCharArray(length)
copy.fill(length) { this[it + startIndex] }
return String.unsafeFromCharArray(copy)
}
/**