From 9d7eca137654811abfcaff9fed098524066a04e7 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Wed, 10 Jan 2018 12:16:39 +0100 Subject: [PATCH] Support throwNpe intrinsic --- .../jvm/intrinsics/IrIntrinsicFunction.kt | 26 ++++++++++++++----- .../jvm/intrinsics/IrIntrinsicMethods.kt | 1 + .../kotlin/backend/jvm/intrinsics/ThrowNPE.kt | 25 ++++++++++++++++++ 3 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ThrowNPE.kt 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 f08f16eb075..fdb58a5e118 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 @@ -82,7 +82,12 @@ open class IrIntrinsicFunction( TODO("not implemented for $this") } - open fun invoke(v: InstructionAdapter, codegen: ExpressionCodegen, data: BlockInfo):StackValue { + open fun genInvokeInstructionWithResult(v: InstructionAdapter): Type { + genInvokeInstruction(v) + return returnType + } + + open fun invoke(v: InstructionAdapter, codegen: ExpressionCodegen, data: BlockInfo): StackValue { val args = listOfNotNull(expression.dispatchReceiver, expression.extensionReceiver) + expression.descriptor.valueParameters.mapIndexed { i, descriptor -> expression.getValueArgument(i) ?: @@ -103,8 +108,7 @@ open class IrIntrinsicFunction( genArg(irExpression, codegen, i, data) } } - genInvokeInstruction(v) - return StackValue.onStack(returnType) + return StackValue.onStack(genInvokeInstructionWithResult(v)) } open fun genArg(expression: IrExpression, codegen: ExpressionCodegen, index: Int, data: BlockInfo) { @@ -118,9 +122,19 @@ open class IrIntrinsicFunction( argsTypes: List = expression.argTypes(context), invokeInstuction: IrIntrinsicFunction.(InstructionAdapter) -> Unit): IrIntrinsicFunction { return object : IrIntrinsicFunction(expression, signature, context, argsTypes) { - override fun genInvokeInstruction(v: InstructionAdapter) { - invokeInstuction(v) - } + + override fun genInvokeInstruction(v: InstructionAdapter) = invokeInstuction(v) + } + } + + fun createWithResult(expression: IrMemberAccessExpression, + signature: JvmMethodSignature, + context: JvmBackendContext, + argsTypes: List = expression.argTypes(context), + invokeInstuction: IrIntrinsicFunction.(InstructionAdapter) -> Type): IrIntrinsicFunction { + return object : IrIntrinsicFunction(expression, signature, context, argsTypes) { + + override fun genInvokeInstructionWithResult(v: InstructionAdapter) = invokeInstuction(v) } } 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 0c33502c5c2..232995ba425 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 @@ -39,6 +39,7 @@ class IrIntrinsicMethods(irBuiltIns: IrBuiltIns) { irMapping.put(irBuiltIns.gteq0, compare) irMapping.put(irBuiltIns.enumValueOf, IrEnumValueOf()) irMapping.put(irBuiltIns.noWhenBranchMatchedException, IrNoWhenBranchMatchedException()) + irMapping.put(irBuiltIns.throwNpe, ThrowNPE()) } fun getIntrinsic(descriptor: CallableMemberDescriptor): IntrinsicMethod? { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ThrowNPE.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ThrowNPE.kt new file mode 100644 index 00000000000..ded346037de --- /dev/null +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ThrowNPE.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.jvm.intrinsics + +import org.jetbrains.kotlin.backend.jvm.JvmBackendContext +import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods +import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression +import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature +import org.jetbrains.org.objectweb.asm.Type + +class ThrowNPE : IntrinsicMethod() { + override fun toCallable( + expression: IrMemberAccessExpression, + signature: JvmMethodSignature, + context: JvmBackendContext + ): IrIntrinsicFunction { + return IrIntrinsicFunction.createWithResult(expression, signature, context) { + it.invokestatic(IntrinsicMethods.INTRINSICS_CLASS_NAME, "throwNpe", "()V", false) + Type.VOID_TYPE + } + } +} \ No newline at end of file