Evaluate range classes in interpreter if constructor's body is missing

This commit is contained in:
Ivan Kylchik
2021-08-12 17:02:20 +03:00
committed by Space
parent ae9914afe0
commit a1b45755f1
5 changed files with 18 additions and 8 deletions
@@ -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()
@@ -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")
}
}
+2 -2
View File
@@ -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<Char> = object : Iterator<Char> {
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
}
@@ -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",
@@ -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())