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()
|
"String" -> return (a as String).toString()
|
||||||
"Any" -> return (a as Any).toString()
|
"Any" -> return (a as Any).toString()
|
||||||
"Any?" -> return a?.toString() ?: "null"
|
"Any?" -> return a?.toString() ?: "null"
|
||||||
|
"Unit" -> return Unit.toString()
|
||||||
}
|
}
|
||||||
"dec" -> when (type) {
|
"dec" -> when (type) {
|
||||||
"Char" -> return (a as Char).dec()
|
"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.Field
|
||||||
import org.jetbrains.kotlin.ir.interpreter.stack.Fields
|
import org.jetbrains.kotlin.ir.interpreter.stack.Fields
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
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.types.*
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
|
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",
|
"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 {
|
private fun IrFunction.getSignature(): String {
|
||||||
val fqName = this.fqName
|
val fqName = this.fqName
|
||||||
val receiver = (dispatchReceiverParameter ?: extensionReceiverParameter)?.type?.getOnlyName()?.let { "$it." } ?: ""
|
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 {
|
fun mustBeHandledWithWrapper(declaration: IrDeclarationWithName): Boolean {
|
||||||
return when (declaration) {
|
if (declaration is IrFunction) return declaration.getSignature() in intrinsicFunctionToHandler
|
||||||
is IrFunction -> declaration.getSignature() in intrinsicFunctionToHandler
|
val fqName = declaration.fqName
|
||||||
else -> declaration.fqName.let { it in intrinsicClasses || it.startsWith("java") }
|
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 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
|
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
|
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 HELPERS_PATH = "./compiler/testData/ir/interpreter/helpers"
|
||||||
private const val UNSIGNED_PATH = "./libraries/stdlib/unsigned/src/kotlin"
|
private const val UNSIGNED_PATH = "./libraries/stdlib/unsigned/src/kotlin"
|
||||||
private val RUNTIME_PATHS = arrayOf(
|
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/TypeAliases.kt",
|
||||||
"./libraries/stdlib/jvm/runtime/kotlin/text/TypeAliases.kt",
|
"./libraries/stdlib/jvm/runtime/kotlin/text/TypeAliases.kt",
|
||||||
"./libraries/stdlib/jvm/src/kotlin/collections/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",
|
"./libraries/stdlib/src/kotlin/collections/Sequence.kt",
|
||||||
)
|
)
|
||||||
private val ANNOTATIONS_PATHS = arrayOf(
|
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/internal/Annotations.kt",
|
||||||
"./libraries/stdlib/src/kotlin/experimental/inferenceMarker.kt",
|
"./libraries/stdlib/src/kotlin/experimental/inferenceMarker.kt",
|
||||||
"./libraries/stdlib/jvm/runtime/kotlin/jvm/annotations/JvmPlatformAnnotations.kt",
|
"./libraries/stdlib/jvm/runtime/kotlin/jvm/annotations/JvmPlatformAnnotations.kt",
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ fun generateMap(): String {
|
|||||||
val irNullCheck = irBuiltIns.checkNotNullSymbol.owner
|
val irNullCheck = irBuiltIns.checkNotNullSymbol.owner
|
||||||
this += Operation(irNullCheck.name.asString(), listOf("T0?"), customExpression = "a!!")
|
this += Operation(irNullCheck.name.asString(), listOf("T0?"), customExpression = "a!!")
|
||||||
this += Operation("toString", listOf("Any?"), customExpression = "a?.toString() ?: \"null\"")
|
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())
|
generateInterpretBinaryFunction(p, getOperationMap(2) + getBinaryIrOperationMap(irBuiltIns) + getExtensionOperationMap())
|
||||||
|
|||||||
Reference in New Issue
Block a user