From a1b45755f12de0803a966a040fdbe3bd7a389d9e Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Thu, 12 Aug 2021 17:02:20 +0300 Subject: [PATCH] Evaluate range classes in interpreter if constructor's body is missing --- .../ir/interpreter/builtins/IrBuiltInsMapGenerated.kt | 1 + .../jetbrains/kotlin/ir/interpreter/state/Wrapper.kt | 11 +++++++---- compiler/testData/ir/interpreter/helpers/Strings.kt | 4 ++-- .../IrInterpreterHelpersSourceFilesProvider.kt | 8 ++++++-- generators/interpreter/GenerateInterpreterMap.kt | 2 ++ 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/builtins/IrBuiltInsMapGenerated.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/builtins/IrBuiltInsMapGenerated.kt index 315366e52dc..26a6ae0481a 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/builtins/IrBuiltInsMapGenerated.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/builtins/IrBuiltInsMapGenerated.kt @@ -52,6 +52,7 @@ internal fun interpretUnaryFunction(name: String, type: String, a: Any?): Any? { "String" -> return (a as String).toString() "Any" -> return (a as Any).toString() "Any?" -> return a?.toString() ?: "null" + "Unit" -> return Unit.toString() } "dec" -> when (type) { "Char" -> return (a as Char).dec() diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt index 15f65c5bcae..d9e257dfdcb 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.ir.interpreter.* import org.jetbrains.kotlin.ir.interpreter.stack.Field import org.jetbrains.kotlin.ir.interpreter.stack.Fields import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol -import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly @@ -110,6 +109,8 @@ internal class Wrapper(val value: Any, override val irClass: IrClass, environmen "Array.kotlin.collections.copyToArrayOfAny(Boolean)" to "kotlin.collections.CollectionsKt", ) + private val ranges = setOf("kotlin.ranges.CharRange", "kotlin.ranges.IntRange", "kotlin.ranges.LongRange") + private fun IrFunction.getSignature(): String { val fqName = this.fqName val receiver = (dispatchReceiverParameter ?: extensionReceiverParameter)?.type?.getOnlyName()?.let { "$it." } ?: "" @@ -121,9 +122,11 @@ internal class Wrapper(val value: Any, override val irClass: IrClass, environmen } fun mustBeHandledWithWrapper(declaration: IrDeclarationWithName): Boolean { - return when (declaration) { - is IrFunction -> declaration.getSignature() in intrinsicFunctionToHandler - else -> declaration.fqName.let { it in intrinsicClasses || it.startsWith("java") } + if (declaration is IrFunction) return declaration.getSignature() in intrinsicFunctionToHandler + val fqName = declaration.fqName + return when { + fqName in ranges && (declaration as IrClass).primaryConstructor!!.body == null -> true + else -> fqName in intrinsicClasses || fqName.startsWith("java") } } diff --git a/compiler/testData/ir/interpreter/helpers/Strings.kt b/compiler/testData/ir/interpreter/helpers/Strings.kt index 33e1087036f..25fbec61594 100644 --- a/compiler/testData/ir/interpreter/helpers/Strings.kt +++ b/compiler/testData/ir/interpreter/helpers/Strings.kt @@ -36,10 +36,10 @@ public inline fun CharSequence.isEmpty(): Boolean = length == 0 public inline fun CharSequence.isNotEmpty(): Boolean = length > 0 -public operator fun CharSequence.iterator(): CharIterator = object : CharIterator() { +public operator fun CharSequence.iterator(): Iterator = object : Iterator { private var index = 0 - public override fun nextChar(): Char = get(index++) + public override fun next(): Char = get(index++) public override fun hasNext(): Boolean = index < length } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/sourceProviders/IrInterpreterHelpersSourceFilesProvider.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/sourceProviders/IrInterpreterHelpersSourceFilesProvider.kt index dfa6971bf33..b6e9904c393 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/sourceProviders/IrInterpreterHelpersSourceFilesProvider.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/sourceProviders/IrInterpreterHelpersSourceFilesProvider.kt @@ -19,7 +19,9 @@ class IrInterpreterHelpersSourceFilesProvider(testServices: TestServices) : Addi private const val HELPERS_PATH = "./compiler/testData/ir/interpreter/helpers" private const val UNSIGNED_PATH = "./libraries/stdlib/unsigned/src/kotlin" private val RUNTIME_PATHS = arrayOf( - "./core/builtins/src/kotlin", + "./core/builtins/src/kotlin/Progressions.kt", + "./core/builtins/src/kotlin/ProgressionIterators.kt", + "./core/builtins/src/kotlin/internal/progressionUtil.kt", "./libraries/stdlib/jvm/runtime/kotlin/TypeAliases.kt", "./libraries/stdlib/jvm/runtime/kotlin/text/TypeAliases.kt", "./libraries/stdlib/jvm/src/kotlin/collections/TypeAliases.kt", @@ -28,7 +30,9 @@ class IrInterpreterHelpersSourceFilesProvider(testServices: TestServices) : Addi "./libraries/stdlib/src/kotlin/collections/Sequence.kt", ) private val ANNOTATIONS_PATHS = arrayOf( - "./libraries/stdlib/src/kotlin/annotations", + "./libraries/stdlib/src/kotlin/annotations/Experimental.kt", + "./libraries/stdlib/src/kotlin/annotations/ExperimentalStdlibApi.kt", + "./libraries/stdlib/src/kotlin/annotations/OptIn.kt", "./libraries/stdlib/src/kotlin/internal/Annotations.kt", "./libraries/stdlib/src/kotlin/experimental/inferenceMarker.kt", "./libraries/stdlib/jvm/runtime/kotlin/jvm/annotations/JvmPlatformAnnotations.kt", diff --git a/generators/interpreter/GenerateInterpreterMap.kt b/generators/interpreter/GenerateInterpreterMap.kt index 364d00c8113..05f955db4f4 100644 --- a/generators/interpreter/GenerateInterpreterMap.kt +++ b/generators/interpreter/GenerateInterpreterMap.kt @@ -55,6 +55,8 @@ fun generateMap(): String { val irNullCheck = irBuiltIns.checkNotNullSymbol.owner this += Operation(irNullCheck.name.asString(), listOf("T0?"), customExpression = "a!!") this += Operation("toString", listOf("Any?"), customExpression = "a?.toString() ?: \"null\"") + // TODO next operation can be dropped after serialization introduction + this += Operation("toString", listOf("Unit"), customExpression = "Unit.toString()") }) generateInterpretBinaryFunction(p, getOperationMap(2) + getBinaryIrOperationMap(irBuiltIns) + getExtensionOperationMap())