Intrinsics update

This commit is contained in:
Michael Bogdanov
2016-09-23 11:27:29 +03:00
committed by Dmitry Petrov
parent e8c7c821a7
commit c34d140a53
21 changed files with 91 additions and 77 deletions
@@ -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) {
}
}
@@ -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))
@@ -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
}
}
@@ -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)
}
@@ -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)
}
@@ -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) {
@@ -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", "<init>", "(Ljava/lang/String;)V", false)
}
}
}
}
override fun toCallable(method: CallableMethod): Callable =
object : IntrinsicCallable(method) {
override fun invokeMethodWithArguments(
@@ -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)
}
}
}
@@ -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)
}
}
@@ -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)
}
@@ -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<Type> = signature.valueParameters.map { it.asmType }
val context: JvmBackendContext,
val argsTypes: List<Type> = 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<Type> = signature.valueParameters.map { it.asmType },
invokeInstuction: (InstructionAdapter) -> Unit): IrIntrinsicFunction {
return object : IrIntrinsicFunction(expression, signature, argsTypes) {
context: JvmBackendContext,
argsTypes: List<Type> = 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<Type> {
val callableMethod = context.state.typeMapper.mapToCallableMethod(descriptor as FunctionDescriptor, false)
val args = arrayListOf<Type>().apply {
callableMethod.dispatchReceiverType?.let { add(it) }
addAll(callableMethod.getAsmMethod().argumentTypes)
}
return args
}
fun IrMemberAccessExpression.receiverAndArgs(): List<IrExpression> {
return (arrayListOf(this.dispatchReceiver, this.extensionReceiver) +
descriptor.valueParameters.mapIndexed { i, valueParameterDescriptor ->getValueArgument(i)}).filterNotNull()
@@ -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)
@@ -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)
}
}
@@ -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,
@@ -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)
}
}
@@ -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)
@@ -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)
}
}
@@ -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, "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, argType, argType), false)
}
@@ -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))
}
}
@@ -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))
}
}
@@ -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) {
}
}