From 866def0d20035a96ffce04abf381c69780c00d42 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Tue, 27 Sep 2016 16:50:59 +0300 Subject: [PATCH] Intrinsic fixes --- .../jetbrains/kotlin/backend/jvm/intrinsics/ArrayGet.kt | 6 ++++-- .../jetbrains/kotlin/backend/jvm/intrinsics/BinaryOp.kt | 1 - .../org/jetbrains/kotlin/backend/jvm/intrinsics/Clone.kt | 5 ++--- .../kotlin/backend/jvm/intrinsics/IntrinsicMethod.kt | 9 +++++++++ .../org/jetbrains/kotlin/backend/jvm/intrinsics/Inv.kt | 2 +- .../kotlin/backend/jvm/intrinsics/IteratorNext.kt | 8 +------- 6 files changed, 17 insertions(+), 14 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 64e93535d30..9b043ce76c4 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 @@ -17,13 +17,15 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.JvmBackendContext +import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature +import org.jetbrains.org.objectweb.asm.Type class ArrayGet : IntrinsicMethod() { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { - val type = expressionType(expression, context) - return IrIntrinsicFunction.create(expression, signature, context) { + val type = AsmUtil.correctElementType(calcReceiverType(expression, context)) + return IrIntrinsicFunction.create(expression, signature, context, listOf(calcReceiverType(expression, context), Type.INT_TYPE)) { it.aload(type) } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/BinaryOp.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/BinaryOp.kt index 84b1ed8ef22..dfa54665ce3 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/BinaryOp.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/BinaryOp.kt @@ -28,7 +28,6 @@ class BinaryOp(private val opcode: Int) : IntrinsicMethod() { private fun shift(): Boolean = opcode == ISHL || opcode == ISHR || opcode == IUSHR - /*TODO new return type*/ override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { val owner = context.state.typeMapper.mapOwner(expression.descriptor) val returnType = signature.returnType diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Clone.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Clone.kt index b16e836a558..908de2bd490 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Clone.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Clone.kt @@ -19,17 +19,16 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression +import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.org.objectweb.asm.Opcodes class Clone : IntrinsicMethod() { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { - return IrIntrinsicFunction.create(expression, signature, context) { - val resultType = context.state.typeMapper.mapType(expression.type) + return IrIntrinsicFunction.create(expression, signature.newReturnType(AsmTypes.OBJECT_TYPE), context) { val opcode = if (expression is IrCall && expression.superQualifier != null) Opcodes.INVOKESPECIAL else Opcodes.INVOKEVIRTUAL it.visitMethodInsn(opcode, "java/lang/Object", "clone", "()Ljava/lang/Object;", false) - it.checkcast(resultType) } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IntrinsicMethod.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IntrinsicMethod.kt index a83d5cec6a8..97827170d59 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IntrinsicMethod.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IntrinsicMethod.kt @@ -21,8 +21,10 @@ import org.jetbrains.kotlin.codegen.Callable import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression +import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.org.objectweb.asm.Type +import org.jetbrains.org.objectweb.asm.commons.Method abstract class IntrinsicMethod { @@ -47,5 +49,12 @@ abstract class IntrinsicMethod { fun expressionType(expression: IrExpression, context: JvmBackendContext): Type { return context.state.typeMapper.mapType(expression.type) } + + fun JvmMethodSignature.newReturnType(type: Type): JvmMethodSignature { + val newMethod = with(asmMethod) { + Method(name, type, argumentTypes) + } + return JvmMethodSignature(newMethod, valueParameters) + } } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Inv.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Inv.kt index ad98e70cabe..31ede304c11 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Inv.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Inv.kt @@ -27,7 +27,7 @@ class Inv : IntrinsicMethod() { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { val returnType = signature.returnType val type = numberFunctionOperandType(returnType) - return IrIntrinsicFunction.create(expression, signature, context) { + return IrIntrinsicFunction.create(expression, signature, context, type) { if (returnType == Type.LONG_TYPE) { it.lconst(-1) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IteratorNext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IteratorNext.kt index e837c70a901..4b5eb8f8b4a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IteratorNext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IteratorNext.kt @@ -26,18 +26,12 @@ import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.org.objectweb.asm.Type -import org.jetbrains.org.objectweb.asm.commons.Method class IteratorNext : IntrinsicMethod() { - /*TODO new return type*/ override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { val type = AsmUtil.unboxType(signature.returnType) - val newMethod = with(signature.asmMethod) { - Method(name, type, argumentTypes) - } - - val newSignature = JvmMethodSignature(newMethod, signature.valueParameters) + val newSignature = signature.newReturnType(type) return IrIntrinsicFunction.create(expression, newSignature, context, AsmTypes.OBJECT_TYPE) { val primitiveClassName = getKotlinPrimitiveClassName(type) it.invokevirtual(