Evaluate range classes in interpreter if constructor's body is missing
This commit is contained in:
+1
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
+6
-2
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user