From c4ffe36a21b5a9f1799f108f1907033e985d6425 Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Wed, 13 Feb 2019 20:32:51 +0300 Subject: [PATCH] [JS IR BE] Add CharSequence type check --- .../src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt | 1 + .../kotlin/ir/backend/js/lower/TypeOperatorLowering.kt | 4 ++++ .../src/org/jetbrains/kotlin/ir/types/irTypePredicates.kt | 1 + .../testData/box/expression/stringClass/subSequence.kt | 1 - libraries/stdlib/js/irRuntime/typeCheckUtils.kt | 2 ++ 5 files changed, 8 insertions(+), 1 deletion(-) 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 f999136c308..3f83bfb4098 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 @@ -117,6 +117,7 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC val isNumberSymbol = getInternalFunction("isNumber") val isComparableSymbol = getInternalFunction("isComparable") + val isCharSequenceSymbol = getInternalFunction("isCharSequence") val isPrimitiveArray = mapOf( PrimitiveType.BOOLEAN to getInternalFunction("isBooleanArray"), diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TypeOperatorLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TypeOperatorLowering.kt index bd79131bfe9..a3b08e1cbd4 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TypeOperatorLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TypeOperatorLowering.kt @@ -215,6 +215,7 @@ class TypeOperatorLowering(val context: JsIrBackendContext) : FileLoweringPass { // toType.isChar() -> generateCheckForChar(argument) toType.isNumber() -> generateNumberCheck(argument) toType.isComparable() -> generateComparableCheck(argument) + toType.isCharSequence() -> generateCharSequenceCheck(argument) toType.isArray() -> generateGenericArrayCheck(argument) toType.isPrimitiveArray() -> generatePrimitiveArrayTypeCheck(argument, toType) toType.isTypeParameter() -> generateTypeCheckWithTypeParameter(argument, toType) @@ -281,6 +282,9 @@ class TypeOperatorLowering(val context: JsIrBackendContext) : FileLoweringPass { private fun generateComparableCheck(argument: IrExpression) = JsIrBuilder.buildCall(context.intrinsics.isComparableSymbol).apply { putValueArgument(0, argument) } + private fun generateCharSequenceCheck(argument: IrExpression) = + JsIrBuilder.buildCall(context.intrinsics.isCharSequenceSymbol).apply { putValueArgument(0, argument) } + private fun generatePrimitiveArrayTypeCheck(argument: IrExpression, toType: IrType): IrExpression { val f = context.intrinsics.isPrimitiveArray[toType.getPrimitiveArrayElementType()]!! return JsIrBuilder.buildCall(f).apply { putValueArgument(0, argument) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypePredicates.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypePredicates.kt index cf0d8e90293..4efb0d05814 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypePredicates.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypePredicates.kt @@ -62,6 +62,7 @@ fun IrType.isDouble(): Boolean = isNotNullClassType(KotlinBuiltIns.FQ_NAMES._dou fun IrType.isNumber(): Boolean = isNotNullClassType(KotlinBuiltIns.FQ_NAMES.number) fun IrType.isComparable(): Boolean = isNotNullClassType(KotlinBuiltIns.FQ_NAMES.comparable.toUnsafe()) +fun IrType.isCharSequence(): Boolean = isNotNullClassType(KotlinBuiltIns.FQ_NAMES.charSequence) fun IrType.isNullableBoolean(): Boolean = isNullableClassType(KotlinBuiltIns.FQ_NAMES._boolean) fun IrType.isNullableLong(): Boolean = isNullableClassType(KotlinBuiltIns.FQ_NAMES._long) diff --git a/js/js.translator/testData/box/expression/stringClass/subSequence.kt b/js/js.translator/testData/box/expression/stringClass/subSequence.kt index 6f62012c72c..502247e19c9 100644 --- a/js/js.translator/testData/box/expression/stringClass/subSequence.kt +++ b/js/js.translator/testData/box/expression/stringClass/subSequence.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1289 package foo diff --git a/libraries/stdlib/js/irRuntime/typeCheckUtils.kt b/libraries/stdlib/js/irRuntime/typeCheckUtils.kt index 435c8cfcf07..b0263b2df3b 100644 --- a/libraries/stdlib/js/irRuntime/typeCheckUtils.kt +++ b/libraries/stdlib/js/irRuntime/typeCheckUtils.kt @@ -167,3 +167,5 @@ fun isComparable(value: dynamic): Boolean { isInterface(value, Comparable::class.js) } +fun isCharSequence(value: dynamic): Boolean = + jsTypeOf(value) == "string" || isInterface(value, CharSequence::class.js)