From 334c776b920fd3ab84d0d2f450a2c26b70062261 Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Mon, 24 Sep 2018 20:24:28 +0300 Subject: [PATCH] [JS IR BE] Fix @DoNotIntrinsify processing. Reuse it for compareTo --- .../jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt | 2 -- .../ir/backend/js/lower/IntrinsicifyCallsLowering.kt | 6 +----- .../src/org/jetbrains/kotlin/ir/util/IrUtils.kt | 6 ++++++ .../box/controlStructures/forInCharSequence.kt | 1 - libraries/stdlib/js/irRuntime/charSequence.kt | 11 +++++++---- libraries/stdlib/js/irRuntime/compareTo.kt | 2 +- 6 files changed, 15 insertions(+), 13 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt index 41584bd3b08..fc5b964e53d 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt @@ -134,8 +134,6 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC val jsToString = getInternalFunction("toString") val jsAnyToString = getInternalFunction("anyToString") val jsCompareTo = getInternalFunction("compareTo") - // TODO: Use annotations - val compareToDoNotIntrinsicify = getInternalFunction("compareToDoNotIntrinsicify") val jsEquals = getInternalFunction("equals") // Coroutines diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/IntrinsicifyCallsLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/IntrinsicifyCallsLowering.kt index a420f1d060b..4c292ae63a9 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/IntrinsicifyCallsLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/IntrinsicifyCallsLowering.kt @@ -343,7 +343,7 @@ class IntrinsicifyCallsLowering(private val context: JsIrBackendContext) : FileL } override fun visitFunction(declaration: IrFunction): IrStatement { - if (declaration.symbol == intrinsics.compareToDoNotIntrinsicify) + if (declaration.hasAnnotation(intrinsics.doNotIntrinsifyAnnotationSymbol)) return declaration return super.visitFunction(declaration) } @@ -355,10 +355,6 @@ class IntrinsicifyCallsLowering(private val context: JsIrBackendContext) : FileL val symbol = call.symbol val declaration = symbol.owner - if (declaration.annotations.any { it.superQualifierSymbol == intrinsics.doNotIntrinsifyAnnotationSymbol }) { - return call - } - if (declaration.isDynamic() || declaration.isEffectivelyExternal()) { when (call.origin) { IrStatementOrigin.GET_PROPERTY -> { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index fb3a577cdbc..efe776eab5f 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -336,6 +336,12 @@ fun IrAnnotationContainer.hasAnnotation(name: FqName) = it.symbol.owner.parentAsClass.descriptor.fqNameSafe == name } +fun IrAnnotationContainer.hasAnnotation(symbol: IrClassSymbol) = + annotations.any { + it.symbol.owner.parentAsClass.symbol == symbol + } + + val IrConstructor.constructedClassType get() = (parent as IrClass).thisReceiver?.type!! fun IrFunction.isFakeOverriddenFromAny(): Boolean { diff --git a/compiler/testData/codegen/box/controlStructures/forInCharSequence.kt b/compiler/testData/codegen/box/controlStructures/forInCharSequence.kt index e3a8ffaa2f0..f4df7137f60 100644 --- a/compiler/testData/codegen/box/controlStructures/forInCharSequence.kt +++ b/compiler/testData/codegen/box/controlStructures/forInCharSequence.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // WITH_RUNTIME fun box(): String { diff --git a/libraries/stdlib/js/irRuntime/charSequence.kt b/libraries/stdlib/js/irRuntime/charSequence.kt index ca815d184ff..bd0b3f51b16 100644 --- a/libraries/stdlib/js/irRuntime/charSequence.kt +++ b/libraries/stdlib/js/irRuntime/charSequence.kt @@ -10,7 +10,7 @@ internal annotation class DoNotIntrinsify @PublishedApi @DoNotIntrinsify internal fun charSequenceGet(a: CharSequence, index: Int): Char { - return if (a is String) { + return if (isString(a)) { Char(a.asDynamic().charCodeAt(index).unsafeCast()) } else { a[index] @@ -20,8 +20,8 @@ internal fun charSequenceGet(a: CharSequence, index: Int): Char { @PublishedApi @DoNotIntrinsify internal fun charSequenceLength(a: CharSequence): Int { - return if (a is String) { - a.asDynamic().length.unsafeCast() + return if (isString(a)) { + js("a.length").unsafeCast() } else { a.length } @@ -30,9 +30,12 @@ internal fun charSequenceLength(a: CharSequence): Int { @PublishedApi @DoNotIntrinsify internal fun charSequenceSubSequence(a: CharSequence, startIndex: Int, endIndex: Int): CharSequence { - return if (a is String) { + return if (isString(a)) { a.asDynamic().substring(startIndex, endIndex).unsafeCast() } else { a.subSequence(startIndex, endIndex) } } + +// Keeping this function as separate non-inline to intrincify `is` operator +internal fun isString(a: CharSequence) = a is String diff --git a/libraries/stdlib/js/irRuntime/compareTo.kt b/libraries/stdlib/js/irRuntime/compareTo.kt index a3b5c3eceb0..d28d81deb82 100644 --- a/libraries/stdlib/js/irRuntime/compareTo.kt +++ b/libraries/stdlib/js/irRuntime/compareTo.kt @@ -23,7 +23,7 @@ fun compareTo(a: dynamic, b: dynamic): Int { return compareToDoNotIntrinsicify(a, b) } -// TODO: Use @DoNotIntrincify annotation +@DoNotIntrinsify private fun > compareToDoNotIntrinsicify(a: Comparable, b: T) = a.compareTo(b)