diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/builtins/IrBuiltInsMapGenerated.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/builtins/IrBuiltInsMapGenerated.kt index bcf6d3358f1..09d2cdf5e7e 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/builtins/IrBuiltInsMapGenerated.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/builtins/IrBuiltInsMapGenerated.kt @@ -134,8 +134,8 @@ val unaryFunctions = mapOf>( unaryOperation("iterator", "LongArray") { a -> a.iterator() }, unaryOperation("size", "DoubleArray") { a -> a.size }, unaryOperation("iterator", "DoubleArray") { a -> a.iterator() }, - unaryOperation>("size", "Array") { a -> a.size }, - unaryOperation>("iterator", "Array") { a -> a.iterator() }, + unaryOperation>("size", "Array") { a -> a.size }, + unaryOperation>("iterator", "Array") { a -> a.iterator() }, unaryOperation("hashCode", "Any") { a -> a.hashCode() }, unaryOperation("toString", "Any") { a -> a.defaultToString() }, unaryOperation("CHECK_NOT_NULL", "T0?") { a -> a!! }, @@ -417,7 +417,7 @@ val binaryFunctions = mapOf>( binaryOperation("get", "FloatArray", "Int") { a, b -> a.get(b) }, binaryOperation("get", "LongArray", "Int") { a, b -> a.get(b) }, binaryOperation("get", "DoubleArray", "Int") { a, b -> a.get(b) }, - binaryOperation, Int>("get", "Array", "Int") { a, b -> a.get(b) }, + binaryOperation, Int>("get", "Array", "Int") { a, b -> a.get(b) }, binaryOperation("equals", "Any", "Any?") { a, b -> a.equals(b) }, binaryOperation("less", "Char", "Char") { a, b -> a < b }, binaryOperation("less", "Byte", "Byte") { a, b -> a < b }, @@ -465,7 +465,7 @@ val ternaryFunctions = mapOf("set", "FloatArray", "Int", "Float") { a, b, c -> a.set(b, c) }, ternaryOperation("set", "LongArray", "Int", "Long") { a, b, c -> a.set(b, c) }, ternaryOperation("set", "DoubleArray", "Int", "Double") { a, b, c -> a.set(b, c) }, - ternaryOperation, Int, Any?>("set", "Array", "Int", "T") { a, b, c -> a.set(b, c) } + ternaryOperation, Int, Any?>("set", "Array", "Int", "T") { a, b, c -> a.set(b, c) } ) private fun Any.defaultToString(): String { diff --git a/generators/evaluate/GenerateBuiltInsMap.kt b/generators/evaluate/GenerateBuiltInsMap.kt index 19d2d8c1b47..8f6734474ac 100644 --- a/generators/evaluate/GenerateBuiltInsMap.kt +++ b/generators/evaluate/GenerateBuiltInsMap.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.generators.evaluate -import org.jetbrains.kotlin.backend.common.interpreter.builtins.compileTimeAnnotation import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.PrimitiveType @@ -13,7 +12,9 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns +import org.jetbrains.kotlin.ir.types.impl.originalKotlinType import org.jetbrains.kotlin.utils.Printer import java.io.File @@ -74,14 +75,12 @@ private fun getOperationMap(argumentsCount: Int): MutableMap thisIsCompileTime || classIsCompileTime - else -> !isFakeOverridden && (thisIsCompileTime || classIsCompileTime) + isPrimitive -> false + else -> isFakeOverridden } } @@ -89,16 +88,16 @@ private fun getOperationMap(argumentsCount: Int): MutableMap() - .filter { it.isCompileTime(classDescriptor) } + .filter { !it.isFakeOverride(classDescriptor) } for (function in compileTimeFunctions) { val operationArguments = (listOf(classType) + function.valueParameters.map { it.type }).joinToString { "\"" + it + "\"" } - val typeParametersOfFun = listOf(classType.constructor.toString() + typeParametersReplacedToAny) + + val typeParametersOfFun = listOf(classType + typeParametersReplacedToAny) + function.valueParameters.map { if (classTypeParameters.contains(it.type.toString())) "Any?" else it.type.toString() } if (function.valueParameters.size + 1 == argumentsCount) { // +1 for receiver @@ -110,18 +109,17 @@ private fun getOperationMap(argumentsCount: Int): MutableMap> { - val operationMap = mutableMapOf>() +private fun getBinaryIrOperationMap(irBuiltIns: IrBuiltIns): MutableMap> { + val operationMap = mutableMapOf>() val irFunSymbols = (irBuiltIns.lessFunByOperandType.values + irBuiltIns.lessOrEqualFunByOperandType.values + irBuiltIns.greaterFunByOperandType.values + irBuiltIns.greaterOrEqualFunByOperandType.values + irBuiltIns.eqeqSymbol + irBuiltIns.eqeqeqSymbol + irBuiltIns.ieee754equalsFunByOperandType.values + irBuiltIns.andandSymbol + irBuiltIns.ororSymbol) - .map { it.descriptor } - .filter { it.annotations.hasAnnotation(compileTimeAnnotation) } + .map { it.owner } for (function in irFunSymbols) { - val parametersTypes = function.valueParameters.map { it.type } + val parametersTypes = function.valueParameters.map { it.type.originalKotlinType!!.toString() } val operationArguments = parametersTypes.joinToString { "\"" + it + "\"" } val functionTypeParameters = parametersTypes.joinToString(prefix = "<", postfix = ">") @@ -133,7 +131,7 @@ private fun getBinaryIrOperationMap(irBuiltIns: IrBuiltIns): MutableMap>, irBuiltIns: IrBuiltIns): String { - val irNullCheck = irBuiltIns.checkNotNullSymbol.descriptor + val irNullCheck = irBuiltIns.checkNotNullSymbol.owner return unaryOperationsMap.entries.joinToString(separator = ",\n", postfix = ",\n") { (function, parameters) -> val methodName = "${function.name}" val parentheses = if (function is FunctionDescriptor) "()" else "" @@ -142,13 +140,13 @@ private fun generateUnaryBody(unaryOperationsMap: Map $body }" } + - " unaryOperation(\"${irNullCheck.name}\", \"${irNullCheck.valueParameters.first().type}\") { a -> a!! },\n" + + " unaryOperation(\"${irNullCheck.name}\", \"${irNullCheck.valueParameters.first().type.originalKotlinType}\") { a -> a!! },\n" + " unaryOperation(\"message\", \"Throwable\") { a -> a.getMessage() },\n" + " unaryOperation(\"cause\", \"Throwable\") { a -> a.getCause() }" } private fun generateBinaryBody( - binaryOperationsMap: Map>, binaryIrOperationsMap: Map> + binaryOperationsMap: Map>, binaryIrOperationsMap: Map> ): String { return binaryOperationsMap.entries.joinToString(separator = ",\n", postfix = ",\n") { (function, parameters) -> val methodName = "${function.name}"