diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayConstructor.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayConstructor.kt index ef748e266bb..64b51d7f81c 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayConstructor.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayConstructor.kt @@ -17,13 +17,12 @@ 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.jvmSignature.JvmMethodSignature object ArrayConstructor : IntrinsicMethod() { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { - return IrIntrinsicFunction.create(expression, signature) { + return IrIntrinsicFunction.create(expression, signature, context) { } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayIterator.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayIterator.kt index 0185fcf5e5d..eaef0c94122 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayIterator.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayIterator.kt @@ -19,14 +19,13 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature class ArrayIterator : IntrinsicMethod() { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { val method = context.state.typeMapper.mapToCallableMethod(expression.descriptor as FunctionDescriptor, false) - return IrIntrinsicFunction.create(expression, signature, method.owner) { + return IrIntrinsicFunction.create(expression, signature, context, method.owner) { val methodSignature = "(${method.owner.descriptor})${method.returnType.descriptor}" val intrinsicOwner = if (AsmUtil.isPrimitive(method.owner.elementType)) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayOf.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayOf.kt index 93fd0ccc4d4..40cbae808d3 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayOf.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayOf.kt @@ -17,13 +17,12 @@ 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.jvmSignature.JvmMethodSignature class ArrayOf : IntrinsicMethod() { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { - return IrIntrinsicFunction.create(expression, signature) { + return IrIntrinsicFunction.create(expression, signature, context) { //do nothing all generated as vararg } } 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 357468371ee..84b1ed8ef22 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 @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.codegen.AsmUtil.numberFunctionOperandType import org.jetbrains.kotlin.codegen.StackValue -import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.org.objectweb.asm.Opcodes.* @@ -41,7 +40,7 @@ class BinaryOp(private val opcode: Int) : IntrinsicMethod() { listOf(Type.CHAR_TYPE, signature.valueParameters[0].asmType) } - return IrIntrinsicFunction.create(expression, signature, argTypes) { + return IrIntrinsicFunction.create(expression, signature, context, argTypes) { it.visitInsn(returnType.getOpcode(opcode)) StackValue.coerce(intermediateResultType, returnType, it) } 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 24a954a28a5..2226f497852 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 @@ -17,23 +17,16 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.codegen.AsmUtil -import org.jetbrains.kotlin.codegen.Callable -import org.jetbrains.kotlin.codegen.CallableMethod -import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression -import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.org.objectweb.asm.Opcodes -import org.jetbrains.org.objectweb.asm.Type -import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter class Clone : IntrinsicMethod() { /*TODO return type*/ override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { - return IrIntrinsicFunction.create(expression, signature) { + return IrIntrinsicFunction.create(expression, signature, 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) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/CompareTo.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/CompareTo.kt index 15b9183732f..f6cbeb19817 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/CompareTo.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/CompareTo.kt @@ -46,7 +46,20 @@ class CompareTo : IntrinsicMethod() { } override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { - assert (expression is IrUnaryPrimitiveImpl) + val parameterType = comparisonOperandType( + expressionType(expression.dispatchReceiver ?: expression.extensionReceiver!!, context), + signature.valueParameters.single().asmType + ) + return IrIntrinsicFunction.create(expression, signature, context, listOf(parameterType, parameterType)) { + genInvoke(parameterType, it) + } + } +} + + +class IrCompareTo : IntrinsicMethod() { + override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { + assert(expression is IrUnaryPrimitiveImpl) val compareCall = expression.getValueArgument(0) as IrCall val args = compareCall.receiverAndArgs() val argTypes = args.asmTypes(context) @@ -55,7 +68,7 @@ class CompareTo : IntrinsicMethod() { val parameterType = comparisonOperandType(leftType, rightType) val newSignature = context.state.typeMapper.mapSignatureSkipGeneric(compareCall.descriptor as FunctionDescriptor, OwnerKind.IMPLEMENTATION) - return object : IrIntrinsicFunction(compareCall, newSignature, listOf(parameterType, parameterType)) { + return object : IrIntrinsicFunction(compareCall, newSignature, context, listOf(parameterType, parameterType)) { override fun invoke(v: InstructionAdapter, codegen: ExpressionCodegen, data: BlockInfo): StackValue { val isPrimitiveIntrinsic = codegen.intrinsics.intrinsics.getIntrinsic(compareCall.descriptor as FunctionDescriptor) != null val operationType: Type @@ -69,7 +82,7 @@ class CompareTo : IntrinsicMethod() { else { operationType = Type.INT_TYPE leftValue = codegen.gen(compareCall, data) - rightValue = StackValue.constant(0, leftType) + rightValue = StackValue.constant(0, operationType) } val origin = expression.origin val token = when (origin) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Concat.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Concat.kt index b1506e0a257..7ab5d3f3f89 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Concat.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Concat.kt @@ -17,9 +17,13 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.backend.jvm.JvmBackendContext +import org.jetbrains.kotlin.backend.jvm.codegen.BlockInfo import org.jetbrains.kotlin.codegen.* import org.jetbrains.kotlin.codegen.AsmUtil.genInvokeAppendMethod import org.jetbrains.kotlin.codegen.AsmUtil.genStringBuilderConstructor +import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtCallableReferenceExpression @@ -27,6 +31,7 @@ import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.AsmTypes.JAVA_STRING_TYPE +import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter @@ -59,6 +64,31 @@ class Concat : IntrinsicMethod() { return JAVA_STRING_TYPE } + override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { + return object : IrIntrinsicFunction(expression, signature, context, expression.receiverAndArgs().asmTypes(context)) { + + override fun genInvokeInstruction(v: InstructionAdapter) { + AsmUtil.genInvokeAppendMethod(v, argsTypes[1]) + v.invokevirtual("java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false) + } + + override fun invoke(v: InstructionAdapter, codegen: org.jetbrains.kotlin.backend.jvm.codegen.ExpressionCodegen, data: BlockInfo): StackValue { + v.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder") + v.dup() + + return super.invoke(v, codegen, data) + } + + + override fun genArg(expression: IrExpression, codegen: org.jetbrains.kotlin.backend.jvm.codegen.ExpressionCodegen, index: Int, data: BlockInfo) { + super.genArg(expression, codegen, index, data) + if (index == 0) { + codegen.mv.invokespecial("java/lang/StringBuilder", "", "(Ljava/lang/String;)V", false) + } + } + } + } + override fun toCallable(method: CallableMethod): Callable = object : IntrinsicCallable(method) { override fun invokeMethodWithArguments( diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Equals.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Equals.kt index 29cc7feec0d..71eb2faa744 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Equals.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/Equals.kt @@ -20,12 +20,9 @@ import com.intellij.psi.tree.IElementType import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.codegen.AsmUtil.* import org.jetbrains.kotlin.codegen.StackValue -import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.expressions.impl.IrBinaryPrimitiveImpl -import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.psi2ir.generators.getInfixOperator import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.org.objectweb.asm.Type @@ -43,16 +40,19 @@ class Equals(val operator: IElementType) : IntrinsicMethod() { } - return object: IrIntrinsicFunction(expression, signature, listOf(leftType, rightType)) { + return object: IrIntrinsicFunction(expression, signature, context, listOf(leftType, rightType)) { override fun genInvokeInstruction(v: InstructionAdapter) { val opToken = binary.origin - if (opToken === KtTokens.EQEQEQ || opToken === KtTokens.EXCLEQEQEQ) { + + val value = if (opToken === IrStatementOrigin.EQEQEQ || opToken === IrStatementOrigin.EXCLEQEQ) { // TODO: always casting to the type of the left operand in case of primitives looks wrong val operandType = if (isPrimitive(leftType)) leftType else OBJECT_TYPE StackValue.cmp(operator, operandType, StackValue.onStack(leftType), StackValue.onStack(rightType)) } - - genEqualsForExpressionsOnStack(operator, StackValue.onStack(leftType), StackValue.onStack(rightType)).put(Type.BOOLEAN_TYPE, v) + else { + genEqualsForExpressionsOnStack(operator, StackValue.onStack(leftType), StackValue.onStack(rightType)) + } + value.put(Type.BOOLEAN_TYPE, v) } } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/HashCode.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/HashCode.kt index ab28c7613cb..3c39aeec29d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/HashCode.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/HashCode.kt @@ -31,7 +31,7 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter class HashCode : IntrinsicMethod() { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { - return IrIntrinsicFunction.create(expression, signature, AsmTypes.OBJECT_TYPE) { + return IrIntrinsicFunction.create(expression, signature, context, AsmTypes.OBJECT_TYPE) { it.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "hashCode", "()I", false) } } 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 76b06d0dfd9..ad98e70cabe 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 @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.codegen.AsmUtil.numberFunctionOperandType -import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.org.objectweb.asm.Type @@ -28,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) { + return IrIntrinsicFunction.create(expression, signature, context) { if (returnType == Type.LONG_TYPE) { it.lconst(-1) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicFunction.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicFunction.kt index a905df24e5a..0eea6f7d83b 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicFunction.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicFunction.kt @@ -16,23 +16,25 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics +import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.codegen.BlockInfo import org.jetbrains.kotlin.backend.jvm.codegen.ExpressionCodegen -import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.codegen.Callable import org.jetbrains.kotlin.codegen.StackValue -import org.jetbrains.kotlin.ir.expressions.IrCall +import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter +import java.util.* open class IrIntrinsicFunction( val expression: IrMemberAccessExpression, val signature: JvmMethodSignature, - val argsTypes: List = signature.valueParameters.map { it.asmType } + val context: JvmBackendContext, + val argsTypes: List = expression.argTypes(context) ) : Callable { override val owner: Type get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. @@ -68,16 +70,17 @@ open class IrIntrinsicFunction( return StackValue.onStack(returnType) } - fun genArg(expression: IrExpression, codegen: ExpressionCodegen, index: Int, data: BlockInfo) { + open fun genArg(expression: IrExpression, codegen: ExpressionCodegen, index: Int, data: BlockInfo) { codegen.gen(expression, argsTypes[index], data) } companion object { fun create(expression: IrMemberAccessExpression, signature: JvmMethodSignature, - argsTypes: List = signature.valueParameters.map { it.asmType }, - invokeInstuction: (InstructionAdapter) -> Unit): IrIntrinsicFunction { - return object : IrIntrinsicFunction(expression, signature, argsTypes) { + context: JvmBackendContext, + argsTypes: List = expression.argTypes(context), + invokeInstuction: IrIntrinsicFunction.(InstructionAdapter) -> Unit): IrIntrinsicFunction { + return object : IrIntrinsicFunction(expression, signature, context, argsTypes) { override fun genInvokeInstruction(v: InstructionAdapter) { invokeInstuction(v) } @@ -87,24 +90,22 @@ open class IrIntrinsicFunction( fun create(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext, - invokeInstuction: (InstructionAdapter) -> Unit): IrIntrinsicFunction { - val args = expression.receiverAndArgs().map { context.state.typeMapper.mapType(it.type) } - return object : IrIntrinsicFunction(expression, signature, args) { - override fun genInvokeInstruction(v: InstructionAdapter) { - invokeInstuction(v) - } - } - } - - fun create(expression: IrMemberAccessExpression, - signature: JvmMethodSignature, type: Type, - invokeInstuction: (InstructionAdapter) -> Unit): IrIntrinsicFunction { - return create(expression, signature, listOf(type), invokeInstuction) + invokeInstruction: IrIntrinsicFunction.(InstructionAdapter) -> Unit): IrIntrinsicFunction { + return create(expression, signature, context, listOf(type), invokeInstruction) } } } +fun IrMemberAccessExpression.argTypes(context: JvmBackendContext): ArrayList { + val callableMethod = context.state.typeMapper.mapToCallableMethod(descriptor as FunctionDescriptor, false) + val args = arrayListOf().apply { + callableMethod.dispatchReceiverType?.let { add(it) } + addAll(callableMethod.getAsmMethod().argumentTypes) + } + return args +} + fun IrMemberAccessExpression.receiverAndArgs(): List { return (arrayListOf(this.dispatchReceiver, this.extensionReceiver) + descriptor.valueParameters.mapIndexed { i, valueParameterDescriptor ->getValueArgument(i)}).filterNotNull() diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt index d450147519a..f44eea4c7f4 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt @@ -31,7 +31,7 @@ class IrIntrinsicMethods(irBuiltIns: IrBuiltIns) { irMapping.put(irBuiltIns.eqeq, Equals(KtTokens.EQEQ)) irMapping.put(irBuiltIns.eqeqeq, Equals(KtTokens.EQEQEQ)) irMapping.put(irBuiltIns.booleanNot, Not()) - val compare = CompareTo() + val compare = IrCompareTo() irMapping.put(irBuiltIns.lt0, compare) irMapping.put(irBuiltIns.lteq0, compare) irMapping.put(irBuiltIns.gt0, compare) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IsArrayOf.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IsArrayOf.kt index cfef5ef48fb..050826fdbf7 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IsArrayOf.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IsArrayOf.kt @@ -17,17 +17,10 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.codegen.AsmUtil -import org.jetbrains.kotlin.codegen.Callable -import org.jetbrains.kotlin.codegen.ExpressionCodegen -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression -import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.kotlin.types.Variance -import org.jetbrains.org.objectweb.asm.Type class IsArrayOf : IntrinsicMethod() { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { @@ -43,7 +36,7 @@ class IsArrayOf : IntrinsicMethod() { val arrayKtType = builtIns.getArrayType(Variance.INVARIANT, elementType) val arrayType = typeMapper.mapType(arrayKtType) - return IrIntrinsicFunction.create(expression, signature) { + return IrIntrinsicFunction.create(expression, signature, context) { it.instanceOf(arrayType) } } 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 d5b2a373ee8..e837c70a901 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 @@ -38,7 +38,7 @@ class IteratorNext : IntrinsicMethod() { } val newSignature = JvmMethodSignature(newMethod, signature.valueParameters) - return IrIntrinsicFunction.create(expression, newSignature, AsmTypes.OBJECT_TYPE) { + return IrIntrinsicFunction.create(expression, newSignature, context, AsmTypes.OBJECT_TYPE) { val primitiveClassName = getKotlinPrimitiveClassName(type) it.invokevirtual( getPrimitiveIteratorType(primitiveClassName).internalName, diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/MonitorInstruction.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/MonitorInstruction.kt index 08c850eeae3..0089cb56045 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/MonitorInstruction.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/MonitorInstruction.kt @@ -17,16 +17,10 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.codegen.AsmUtil -import org.jetbrains.kotlin.codegen.Callable -import org.jetbrains.kotlin.codegen.CallableMethod -import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.org.objectweb.asm.Opcodes -import org.jetbrains.org.objectweb.asm.Type -import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter class MonitorInstruction private constructor(private val opcode: Int) : IntrinsicMethod() { companion object { @@ -39,7 +33,7 @@ class MonitorInstruction private constructor(private val opcode: Int) : Intrinsi /*TODO void return type*/ override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { - return IrIntrinsicFunction.create(expression, signature, OBJECT_TYPE) { + return IrIntrinsicFunction.create(expression, signature, context, OBJECT_TYPE) { it.visitInsn(opcode) } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/NewArray.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/NewArray.kt index 0259480bb6d..2c6e3ad83ee 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/NewArray.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/NewArray.kt @@ -28,7 +28,7 @@ class NewArray : IntrinsicMethod() { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { val ktType = expression.type - return object : IrIntrinsicFunction(expression, signature) { + return object : IrIntrinsicFunction(expression, signature, context) { override fun invoke(v: InstructionAdapter, codegen: ExpressionCodegen, data: BlockInfo): StackValue { super.invoke(v, codegen, data) codegen.newArrayInstruction(ktType) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/NumberCast.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/NumberCast.kt index 6298d892d08..d9edb664d17 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/NumberCast.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/NumberCast.kt @@ -17,10 +17,7 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.codegen.Callable -import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.StackValue -import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature @@ -28,7 +25,7 @@ class NumberCast : IntrinsicMethod() { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { return IrIntrinsicFunction.create(expression, signature, context) { - StackValue.coerce(calcReceiverType(expression, context), signature.returnType, it) + StackValue.coerce(argsTypes[0], signature.returnType, it) } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/RangeTo.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/RangeTo.kt index e93710055c8..9c57b51aa8c 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/RangeTo.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/RangeTo.kt @@ -45,7 +45,7 @@ class RangeTo : IntrinsicMethod() { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { val argType = rangeTypeToPrimitiveType(signature.returnType) - return object: IrIntrinsicFunction(expression, signature, listOf(argType) + signature.valueParameters.map { argType }) { + return object: IrIntrinsicFunction(expression, signature, context, listOf(argType) + signature.valueParameters.map { argType }) { override fun genInvokeInstruction(v: InstructionAdapter) { v.invokespecial(signature.returnType.internalName, "", Type.getMethodDescriptor(Type.VOID_TYPE, argType, argType), false) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ToString.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ToString.kt index a150932fe10..5683f78fa0f 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ToString.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ToString.kt @@ -20,13 +20,12 @@ import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.Callable import org.jetbrains.kotlin.codegen.CallableMethod -import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature class ToString : IntrinsicMethod() { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { - return IrIntrinsicFunction.create(expression, signature) { + return IrIntrinsicFunction.create(expression, signature, context) { it.neg(AsmUtil.numberFunctionOperandType(signature.returnType)) } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/UnaryMinus.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/UnaryMinus.kt index 7df5279f5db..03855e2c4d4 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/UnaryMinus.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/UnaryMinus.kt @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature class UnaryMinus : IntrinsicMethod() { /*TODO return type*/ override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { - return IrIntrinsicFunction.create(expression, signature) { + return IrIntrinsicFunction.create(expression, signature, context) { it.neg(numberFunctionOperandType(signature.returnType)) } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/UnaryPlus.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/UnaryPlus.kt index 5d01e9fc1be..49ac6d4802a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/UnaryPlus.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/UnaryPlus.kt @@ -17,13 +17,12 @@ 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.jvmSignature.JvmMethodSignature class UnaryPlus : IntrinsicMethod() { override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { - return IrIntrinsicFunction.create(expression, signature) { + return IrIntrinsicFunction.create(expression, signature, context) { } }