Commit
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt index e6d45f6d9..1b33f2f 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt
@@ -18,9 +18,11 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.scopes.getFunctions +import org.jetbrains.kotlin.fir.scopes.getProperties import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.ir.BuiltInOperatorNames @@ -270,9 +272,8 @@ override val floatIterator by lazy { primitiveIterator(PrimitiveType.FLOAT) } override val doubleIterator by lazy { primitiveIterator(PrimitiveType.DOUBLE) } - private fun loadPrimitiveArray(primitiveType: PrimitiveType): IrClassSymbol { - return loadClass(ClassId(StandardClassIds.BASE_KOTLIN_PACKAGE, Name.identifier("${primitiveType.typeName}Array"))) - } + private fun loadPrimitiveArray(primitiveType: PrimitiveType): IrClassSymbol = loadClass(primitiveType.arrayClassId) + override val booleanArray: IrClassSymbol by lazy { loadPrimitiveArray(PrimitiveType.BOOLEAN) } override val charArray: IrClassSymbol by lazy { loadPrimitiveArray(PrimitiveType.CHAR) }
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt index 9fe86bf..0478fbc 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.StandardNames.KOTLIN_REFLECT_FQ_NAME +import org.jetbrains.kotlin.builtins.UnsignedArrayType import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol @@ -17,7 +18,9 @@ import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.StandardClassIds // This is what Context collects about IR. abstract class Ir<out T : CommonBackendContext>(val context: T) { @@ -238,6 +241,35 @@ open val arraysContentEquals: Map<IrType, IrSimpleFunctionSymbol>? = null + val arrayGetFunction: Map<ClassId, IrSimpleFunctionSymbol> = + buildMap { + fun putGetFunctionFor(classId: ClassId, name: String) { + val arrayClass = irBuiltIns.findClass(classId.shortClassName, classId.packageFqName) ?: return + val getFunction = arrayClass.getSimpleFunction(name) ?: return + put(classId, getFunction) + } + + val defaultGetName = getWithoutBoundCheckName?.asString() ?: "get" + putGetFunctionFor(StandardClassIds.Array, defaultGetName) + PrimitiveType.entries.forEach { putGetFunctionFor(it.arrayClassId, defaultGetName) } + UnsignedArrayType.entries.forEach { putGetFunctionFor(it.classId, defaultGetName) } + putGetFunctionFor(StandardClassIds.List, "get") + } + + val arraySizeGetters: Map<ClassId, IrSimpleFunctionSymbol> = + buildMap { + fun putSizeGetterFor(classId: ClassId) { + val arrayClass = irBuiltIns.findClass(classId.shortClassName, classId.packageFqName) ?: return + val sizeGetter = arrayClass.getPropertyGetter("size") ?: return + put(classId, sizeGetter) + } + + putSizeGetterFor(StandardClassIds.Array) + PrimitiveType.entries.forEach { putSizeGetterFor(it.arrayClassId) } + UnsignedArrayType.entries.forEach { putSizeGetterFor(it.classId) } + putSizeGetterFor(StandardClassIds.List) + } + companion object { fun isLateinitIsInitializedPropertyGetter(symbol: IrFunctionSymbol): Boolean = symbol is IrSimpleFunctionSymbol && symbol.owner.let { function ->
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/IndexedGetIterationHandlers.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/IndexedGetIterationHandlers.kt index 313c41e..f7de48f 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/IndexedGetIterationHandlers.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/handlers/IndexedGetIterationHandlers.kt
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.util.OperatorNameConventions /** Builds a [HeaderInfo] for iteration over iterables using the `get / []` operator and an index. */ @@ -50,7 +49,9 @@ expression, nameHint = "indexedObject" ) - val last = irCall(expression.type.sizePropertyGetter).apply { + val sizePropertyGetter = expression.type.sizePropertyGetter ?: return null + + val last = irCall(sizePropertyGetter).apply { dispatchReceiver = irGet(objectVariable) } @@ -65,7 +66,7 @@ ) } - abstract val IrType.sizePropertyGetter: IrSimpleFunction + abstract val IrType.sizePropertyGetter: IrSimpleFunction? abstract val IrType.getFunction: IrSimpleFunction } @@ -83,27 +84,14 @@ callee.kotlinFqName == FqName("kotlin.collections.reversed") } - override val IrType.sizePropertyGetter - get() = getClass()!!.getPropertyGetter("size")!!.owner + override val IrType.sizePropertyGetter: IrSimpleFunction? + get() = context.ir.symbols.arraySizeGetters[getClass()!!.classId!!]?.owner private fun IrType.isArrayType() = isArray() || isPrimitiveArray() || (supportsUnsignedArrays && isUnsignedArray()) - private val IrType.getFunctionName: Name - get() = context.ir.symbols.getWithoutBoundCheckName.let { - if (isArrayType() && it != null) { - it - } else { - OperatorNameConventions.GET - } - } - override val IrType.getFunction - get() = getClass()!!.functions.single { - it.name == getFunctionName && - it.valueParameters.size == 1 && - it.valueParameters[0].type.isInt() - } + override val IrType.getFunction get() = context.ir.symbols.arrayGetFunction[getClass()!!.classId!!]?.owner!! } /**
diff --git a/core/compiler.common/src/org/jetbrains/kotlin/builtins/PrimitiveType.kt b/core/compiler.common/src/org/jetbrains/kotlin/builtins/PrimitiveType.kt index 025c51d..a2cbaa5 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/builtins/PrimitiveType.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/builtins/PrimitiveType.kt
@@ -5,8 +5,10 @@ package org.jetbrains.kotlin.builtins +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.StandardClassIds enum class PrimitiveType(typeName: String) { BOOLEAN("Boolean"), @@ -27,6 +29,13 @@ val arrayTypeFqName: FqName by lazy(LazyThreadSafetyMode.PUBLICATION) { StandardNames.BUILT_INS_PACKAGE_FQ_NAME.child(arrayTypeName) } + val arrayClassId by lazy(LazyThreadSafetyMode.PUBLICATION) { + ClassId( + StandardClassIds.BASE_KOTLIN_PACKAGE, + Name.identifier("${typeName}Array") + ) + } + companion object { @JvmField val NUMBER_TYPES = setOf(CHAR, BYTE, SHORT, INT, FLOAT, LONG, DOUBLE)