[JS IR BE] Support 'is Number' and 'is Comparable<>'

This commit is contained in:
Svyatoslav Kuzmich
2018-10-10 21:54:02 +03:00
parent 783f27c554
commit 5a057f8ca6
8 changed files with 47 additions and 7 deletions
@@ -115,6 +115,9 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC
// val isCharSymbol = getInternalFunction("isChar")
val isObjectSymbol = getInternalFunction("isObject")
val isNumberSymbol = getInternalFunction("isNumber")
val isComparableSymbol = getInternalFunction("isComparable")
val isPrimitiveArray = mapOf(
PrimitiveType.BOOLEAN to getInternalFunction("isBooleanArray"),
PrimitiveType.BYTE to getInternalFunction("isByteArray"),
@@ -141,7 +141,6 @@ class TypeOperatorLowering(val context: JsIrBackendContext) : FileLoweringPass {
type.isInt() ||
type.isFloat() ||
type.isDouble() ||
type.isNumber() ||
type.isBoolean() ||
type.isFunctionOrKFunction() ||
type.isString()
@@ -217,6 +216,8 @@ class TypeOperatorLowering(val context: JsIrBackendContext) : FileLoweringPass {
toType.isAny() -> generateIsObjectCheck(argument)
isTypeOfCheckingType(toType) -> generateTypeOfCheck(argument, toType)
// toType.isChar() -> generateCheckForChar(argument)
toType.isNumber() -> generateNumberCheck(argument)
toType.isComparable() -> generateComparableCheck(argument)
toType.isArray() -> generateGenericArrayCheck(argument)
toType.isPrimitiveArray() -> generatePrimitiveArrayTypeCheck(argument, toType)
toType.isTypeParameter() -> generateTypeCheckWithTypeParameter(argument, toType)
@@ -272,6 +273,12 @@ class TypeOperatorLowering(val context: JsIrBackendContext) : FileLoweringPass {
private fun generateGenericArrayCheck(argument: IrExpression) =
JsIrBuilder.buildCall(isArraySymbol).apply { putValueArgument(0, argument) }
private fun generateNumberCheck(argument: IrExpression) =
JsIrBuilder.buildCall(context.intrinsics.isNumberSymbol).apply { putValueArgument(0, argument) }
private fun generateComparableCheck(argument: IrExpression) =
JsIrBuilder.buildCall(context.intrinsics.isComparableSymbol).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) }