JVM_IR: remove descriptor usage in CompareTo intrinsic
This commit is contained in:
+3
-4
@@ -20,7 +20,7 @@ import com.intellij.psi.tree.IElementType
|
|||||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||||
import org.jetbrains.kotlin.backend.jvm.codegen.*
|
import org.jetbrains.kotlin.backend.jvm.codegen.*
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.isSmartcastFromHigherThanNullable
|
import org.jetbrains.kotlin.backend.jvm.ir.isSmartcastFromHigherThanNullable
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.PrimitiveType
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
import org.jetbrains.kotlin.codegen.AsmUtil
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.comparisonOperandType
|
import org.jetbrains.kotlin.codegen.AsmUtil.comparisonOperandType
|
||||||
import org.jetbrains.kotlin.codegen.BranchedValue
|
import org.jetbrains.kotlin.codegen.BranchedValue
|
||||||
@@ -31,7 +31,6 @@ import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
|
|||||||
import org.jetbrains.kotlin.lexer.KtSingleValueToken
|
import org.jetbrains.kotlin.lexer.KtSingleValueToken
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
||||||
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
|
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
|
||||||
import org.jetbrains.org.objectweb.asm.Label
|
import org.jetbrains.org.objectweb.asm.Label
|
||||||
import org.jetbrains.org.objectweb.asm.Opcodes
|
import org.jetbrains.org.objectweb.asm.Opcodes
|
||||||
import org.jetbrains.org.objectweb.asm.Type
|
import org.jetbrains.org.objectweb.asm.Type
|
||||||
@@ -183,11 +182,11 @@ class PrimitiveToObjectComparison(
|
|||||||
}
|
}
|
||||||
|
|
||||||
class PrimitiveComparison(
|
class PrimitiveComparison(
|
||||||
private val primitiveNumberType: KotlinType,
|
private val primitiveNumberType: PrimitiveType,
|
||||||
private val operatorToken: KtSingleValueToken
|
private val operatorToken: KtSingleValueToken
|
||||||
) : IntrinsicMethod() {
|
) : IntrinsicMethod() {
|
||||||
override fun invoke(expression: IrFunctionAccessExpression, codegen: ExpressionCodegen, data: BlockInfo): PromisedValue? {
|
override fun invoke(expression: IrFunctionAccessExpression, codegen: ExpressionCodegen, data: BlockInfo): PromisedValue? {
|
||||||
val parameterType = Type.getType(JvmPrimitiveType.get(KotlinBuiltIns.getPrimitiveType(primitiveNumberType)!!).desc)
|
val parameterType = Type.getType(JvmPrimitiveType.get(primitiveNumberType).desc)
|
||||||
val (left, right) = expression.receiverAndArgs()
|
val (left, right) = expression.receiverAndArgs()
|
||||||
val a = left.accept(codegen, data).materializedAt(parameterType, left.type)
|
val a = left.accept(codegen, data).materializedAt(parameterType, left.type)
|
||||||
val b = right.accept(codegen, data).materializedAt(parameterType, right.type)
|
val b = right.accept(codegen, data).materializedAt(parameterType, right.type)
|
||||||
|
|||||||
+12
-8
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
|
|||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.types.classOrNull
|
import org.jetbrains.kotlin.ir.types.classOrNull
|
||||||
|
import org.jetbrains.kotlin.ir.types.classifierOrFail
|
||||||
import org.jetbrains.kotlin.ir.types.classifierOrNull
|
import org.jetbrains.kotlin.ir.types.classifierOrNull
|
||||||
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
|
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
|
||||||
import org.jetbrains.kotlin.ir.util.isFileClass
|
import org.jetbrains.kotlin.ir.util.isFileClass
|
||||||
@@ -212,11 +213,21 @@ class IrIntrinsicMethods(val irBuiltIns: IrBuiltIns, val symbols: JvmSymbols) {
|
|||||||
createKeyMapping(ArrayIterator, arrayClass, "iterator")
|
createKeyMapping(ArrayIterator, arrayClass, "iterator")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private fun primitiveComparisonIntrinsics(
|
||||||
|
typeToIrFun: Map<IrClassifierSymbol, IrSimpleFunctionSymbol>,
|
||||||
|
operator: KtSingleValueToken
|
||||||
|
): List<Pair<Key, PrimitiveComparison>> =
|
||||||
|
PrimitiveType.values().mapNotNull { primitiveType ->
|
||||||
|
val irPrimitiveClassifier = irBuiltIns.primitiveTypeToIrType[primitiveType]!!.classifierOrFail
|
||||||
|
val irFunSymbol = typeToIrFun[irPrimitiveClassifier] ?: return@mapNotNull null
|
||||||
|
irFunSymbol.toKey()!! to PrimitiveComparison(primitiveType, operator)
|
||||||
|
}
|
||||||
|
|
||||||
data class Key(val owner: FqName, val receiverParameterTypeName: FqName?, val name: String, val valueParameterTypeNames: List<FqName?>)
|
data class Key(val owner: FqName, val receiverParameterTypeName: FqName?, val name: String, val valueParameterTypeNames: List<FqName?>)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
internal val INTRINSICS_CLASS_NAME = "kotlin/jvm/internal/Intrinsics"
|
internal const val INTRINSICS_CLASS_NAME = "kotlin/jvm/internal/Intrinsics"
|
||||||
private val INC = Increment(1)
|
private val INC = Increment(1)
|
||||||
|
|
||||||
private val DEC = Increment(-1)
|
private val DEC = Increment(-1)
|
||||||
@@ -267,12 +278,5 @@ class IrIntrinsicMethods(val irBuiltIns: IrBuiltIns, val symbols: JvmSymbols) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun primitiveComparisonIntrinsics(
|
|
||||||
typeToIrFun: Map<IrClassifierSymbol, IrSimpleFunctionSymbol>,
|
|
||||||
operator: KtSingleValueToken
|
|
||||||
): List<Pair<Key, PrimitiveComparison>> =
|
|
||||||
typeToIrFun.map { (type, irFunSymbol) ->
|
|
||||||
irFunSymbol.toKey()!! to PrimitiveComparison(type.descriptor.defaultType, operator)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user