From d61b276ebf2a23e80c45a7acf5cb99573a558b97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Tue, 30 Jul 2019 15:05:15 +0200 Subject: [PATCH] JVM IR: Fix types in ArrayGet/Set intrinsics --- .../kotlin/backend/jvm/intrinsics/ArrayGet.kt | 17 +++++++-------- .../kotlin/backend/jvm/intrinsics/ArraySet.kt | 21 +++++++++---------- .../kotlin/backend/jvm/ir/IrUtils.kt | 12 +++++++++++ 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayGet.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayGet.kt index 379b5d1335c..361515f4284 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayGet.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayGet.kt @@ -16,19 +16,16 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics -import org.jetbrains.kotlin.backend.jvm.JvmBackendContext +import org.jetbrains.kotlin.backend.jvm.codegen.* import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression -import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression -import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature -import org.jetbrains.org.objectweb.asm.Type object ArrayGet : IntrinsicMethod() { - override fun toCallable(expression: IrFunctionAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { - val arrayType = calcReceiverType(expression, context) - val elementType = AsmUtil.correctElementType(arrayType) - return IrIntrinsicFunction.create(expression, signature.newReturnType(elementType), context, listOf(arrayType, Type.INT_TYPE)) { - it.aload(elementType) - } + override fun invoke(expression: IrFunctionAccessExpression, codegen: ExpressionCodegen, data: BlockInfo): PromisedValue? { + val receiver = expression.dispatchReceiver!!.accept(codegen, data).materialized + val elementType = AsmUtil.correctElementType(receiver.type) + expression.getValueArgument(0)!!.accept(codegen, data).materialize() + codegen.mv.aload(elementType) + return MaterialValue(codegen, elementType, expression.type) } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArraySet.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArraySet.kt index 18e94f4f9e3..58c3f5b751f 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArraySet.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArraySet.kt @@ -16,20 +16,19 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics -import org.jetbrains.kotlin.backend.jvm.JvmBackendContext +import org.jetbrains.kotlin.backend.jvm.codegen.* +import org.jetbrains.kotlin.backend.jvm.ir.getArrayElementType import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression -import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression -import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature -import org.jetbrains.org.objectweb.asm.Type object ArraySet : IntrinsicMethod() { - - override fun toCallable(expression: IrFunctionAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { - val arrayType = expressionType(expression.dispatchReceiver!!, context) - val elementType = AsmUtil.correctElementType(arrayType) - return IrIntrinsicFunction.create(expression, signature, context, listOf(arrayType, Type.INT_TYPE, elementType)) { - it.astore(elementType) - } + override fun invoke(expression: IrFunctionAccessExpression, codegen: ExpressionCodegen, data: BlockInfo): PromisedValue? { + val receiver = expression.dispatchReceiver!!.accept(codegen, data).materialized + val elementType = AsmUtil.correctElementType(receiver.type) + val elementIrType = receiver.irType.getArrayElementType(codegen.context.irBuiltIns) + expression.getValueArgument(0)!!.accept(codegen, data).materialize() + expression.getValueArgument(1)!!.accept(codegen, data).coerce(elementType, elementIrType).materialize() + codegen.mv.astore(elementType) + return codegen.immaterialUnitValue } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt index ac4f53c257d..45155b2d0b6 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt @@ -6,12 +6,15 @@ package org.jetbrains.kotlin.backend.jvm.ir import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.ir.types.impl.IrStarProjectionImpl +import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable import org.jetbrains.kotlin.ir.util.hasAnnotation import org.jetbrains.kotlin.ir.util.isFunction import org.jetbrains.kotlin.ir.util.isSuspendFunctionTypeOrSubtype @@ -79,3 +82,12 @@ fun IrFunction.hasJvmDefault(): Boolean = propertyIfAccessor.hasAnnotation(JVM_D fun IrValueParameter.isInlineParameter() = index >= 0 && !isNoinline && !type.isNullable() && (type.isFunction() || type.isSuspendFunctionTypeOrSubtype()) + +val IrType.isBoxedArray: Boolean + get() = classOrNull?.owner?.fqNameWhenAvailable == KotlinBuiltIns.FQ_NAMES.array.toSafe() + +fun IrType.getArrayElementType(irBuiltIns: IrBuiltIns): IrType = + if (isBoxedArray) + ((this as IrSimpleType).arguments.single() as IrTypeProjection).type + else + irBuiltIns.primitiveArrayElementTypes.getValue(this.classOrNull!!)