diff --git a/libraries/stdlib/js/src/kotlin/collections.kt b/libraries/stdlib/js/src/kotlin/collections.kt index fa9c69c59cd..33178bcae3f 100644 --- a/libraries/stdlib/js/src/kotlin/collections.kt +++ b/libraries/stdlib/js/src/kotlin/collections.kt @@ -136,13 +136,18 @@ internal fun arrayCopy(source: Array, destination: Array, desti val rangeSize = endIndex - startIndex AbstractList.checkRangeIndexes(destinationOffset, destinationOffset + rangeSize, destination.size) - if (source !== destination || destinationOffset <= startIndex) { - for (index in 0 until rangeSize) { - destination[destinationOffset + index] = source[startIndex + index] - } + if (js("ArrayBuffer").isView(destination) && js("ArrayBuffer").isView(source)) { + val subrange = source.asDynamic().subarray(startIndex, endIndex) + destination.asDynamic().set(subrange, destinationOffset) } else { - for (index in rangeSize - 1 downTo 0) { - destination[destinationOffset + index] = source[startIndex + index] + if (source !== destination || destinationOffset <= startIndex) { + for (index in 0 until rangeSize) { + destination[destinationOffset + index] = source[startIndex + index] + } + } else { + for (index in rangeSize - 1 downTo 0) { + destination[destinationOffset + index] = source[startIndex + index] + } } } }