379cb08226
Function 'kotlin.js.js' is to be redesigned in JS IR backend, partially because it is a hard feature to support. Current implementation is unstable and can cause problems around inlining and name generator. Luckily most of its use-cases can be covered by simpler features like dynamic expressions and external declarations. Thus we are reducing it's usage in stdlib to make IR backend more stable in current state. JavaScript features that can't be covered by dynamic expression are implemented in 'jsOperators.kt' file respectively for each backend: - 'internal inline' function which calls 'js' function inside for current pre-IR backend - 'internal' function with '_hack' parameters for JS IR backend which will be later intinsicified in a compiler
57 lines
1.5 KiB
Kotlin
57 lines
1.5 KiB
Kotlin
/*
|
|
* Copyright 2010-2018 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 kotlin.collections
|
|
|
|
import kotlin.js.*
|
|
|
|
internal fun arrayToString(array: Array<*>) = array.joinToString(", ", "[", "]") { toString(it) }
|
|
|
|
internal fun <T> Array<out T>.contentDeepHashCodeInternal(): Int {
|
|
var result = 1
|
|
for (element in this) {
|
|
val elementHash = when {
|
|
element == null -> 0
|
|
isArrayish(element) -> (element.unsafeCast<Array<*>>()).contentDeepHashCodeInternal()
|
|
|
|
element is UByteArray -> element.contentHashCode()
|
|
element is UShortArray -> element.contentHashCode()
|
|
element is UIntArray -> element.contentHashCode()
|
|
element is ULongArray -> element.contentHashCode()
|
|
|
|
else -> element.hashCode()
|
|
}
|
|
|
|
result = 31 * result + elementHash
|
|
}
|
|
return result
|
|
}
|
|
|
|
internal fun <T> T.contentEqualsInternal(other: T): Boolean {
|
|
val a = this.asDynamic()
|
|
val b = other.asDynamic()
|
|
|
|
if (a === b) return true
|
|
|
|
if (!isArrayish(b) || a.length != b.length) return false
|
|
|
|
for (i in 0 until a.length) {
|
|
if (a[i] != b[i]) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
internal fun <T> T.contentHashCodeInternal(): Int {
|
|
val a = this.asDynamic()
|
|
var result = 1
|
|
|
|
for (i in 0 until a.length) {
|
|
result = result * 31 + hashCode(a[i])
|
|
}
|
|
|
|
return result
|
|
} |