[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 isNumberSymbol = getInternalFunction("isNumber")
|
||||||
val isComparableSymbol = getInternalFunction("isComparable")
|
val isComparableSymbol = getInternalFunction("isComparable")
|
||||||
|
val isCharSequenceSymbol = getInternalFunction("isCharSequence")
|
||||||
|
|
||||||
val isPrimitiveArray = mapOf(
|
val isPrimitiveArray = mapOf(
|
||||||
PrimitiveType.BOOLEAN to getInternalFunction("isBooleanArray"),
|
PrimitiveType.BOOLEAN to getInternalFunction("isBooleanArray"),
|
||||||
|
|||||||
+4
@@ -215,6 +215,7 @@ class TypeOperatorLowering(val context: JsIrBackendContext) : FileLoweringPass {
|
|||||||
// toType.isChar() -> generateCheckForChar(argument)
|
// toType.isChar() -> generateCheckForChar(argument)
|
||||||
toType.isNumber() -> generateNumberCheck(argument)
|
toType.isNumber() -> generateNumberCheck(argument)
|
||||||
toType.isComparable() -> generateComparableCheck(argument)
|
toType.isComparable() -> generateComparableCheck(argument)
|
||||||
|
toType.isCharSequence() -> generateCharSequenceCheck(argument)
|
||||||
toType.isArray() -> generateGenericArrayCheck(argument)
|
toType.isArray() -> generateGenericArrayCheck(argument)
|
||||||
toType.isPrimitiveArray() -> generatePrimitiveArrayTypeCheck(argument, toType)
|
toType.isPrimitiveArray() -> generatePrimitiveArrayTypeCheck(argument, toType)
|
||||||
toType.isTypeParameter() -> generateTypeCheckWithTypeParameter(argument, toType)
|
toType.isTypeParameter() -> generateTypeCheckWithTypeParameter(argument, toType)
|
||||||
@@ -281,6 +282,9 @@ class TypeOperatorLowering(val context: JsIrBackendContext) : FileLoweringPass {
|
|||||||
private fun generateComparableCheck(argument: IrExpression) =
|
private fun generateComparableCheck(argument: IrExpression) =
|
||||||
JsIrBuilder.buildCall(context.intrinsics.isComparableSymbol).apply { putValueArgument(0, argument) }
|
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 {
|
private fun generatePrimitiveArrayTypeCheck(argument: IrExpression, toType: IrType): IrExpression {
|
||||||
val f = context.intrinsics.isPrimitiveArray[toType.getPrimitiveArrayElementType()]!!
|
val f = context.intrinsics.isPrimitiveArray[toType.getPrimitiveArrayElementType()]!!
|
||||||
return JsIrBuilder.buildCall(f).apply { putValueArgument(0, argument) }
|
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.isNumber(): Boolean = isNotNullClassType(KotlinBuiltIns.FQ_NAMES.number)
|
||||||
|
|
||||||
fun IrType.isComparable(): Boolean = isNotNullClassType(KotlinBuiltIns.FQ_NAMES.comparable.toUnsafe())
|
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.isNullableBoolean(): Boolean = isNullableClassType(KotlinBuiltIns.FQ_NAMES._boolean)
|
||||||
fun IrType.isNullableLong(): Boolean = isNullableClassType(KotlinBuiltIns.FQ_NAMES._long)
|
fun IrType.isNullableLong(): Boolean = isNullableClassType(KotlinBuiltIns.FQ_NAMES._long)
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JS_IR
|
|
||||||
// EXPECTED_REACHABLE_NODES: 1289
|
// EXPECTED_REACHABLE_NODES: 1289
|
||||||
package foo
|
package foo
|
||||||
|
|
||||||
|
|||||||
@@ -167,3 +167,5 @@ fun isComparable(value: dynamic): Boolean {
|
|||||||
isInterface(value, Comparable::class.js)
|
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