[JS IR BE] Add CharSequence type check
This commit is contained in:
@@ -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"),
|
||||
|
||||
+4
@@ -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) }
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND: JS_IR
|
||||
// EXPECTED_REACHABLE_NODES: 1289
|
||||
package foo
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user