From b0bcd78e38086f95dbc0efaeaf4a5d134b9c8e5d Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Thu, 23 Aug 2018 23:56:48 +0300 Subject: [PATCH] Optimize copying for typed arrays in JS --- libraries/stdlib/js/src/kotlin/collections.kt | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) 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] + } } } }