From 6d575c1437a22ba8e9b1857b31c50ff12e377ff6 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Mon, 26 Sep 2016 10:45:53 +0300 Subject: [PATCH] 'Throw' support --- .../backend/jvm/codegen/ExpressionCodegen.kt | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index 8daf73e98bf..307f42c30c1 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -21,16 +21,16 @@ import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.codegen.* import org.jetbrains.kotlin.codegen.AsmUtil.* -import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.StackValue.* import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.expressions.* -import org.jetbrains.kotlin.ir.expressions.impl.IrIfThenElseImpl import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.resolve.jvm.AsmTypes +import org.jetbrains.kotlin.resolve.jvm.AsmTypes.JAVA_THROWABLE_TYPE import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.org.objectweb.asm.Label @@ -415,6 +415,12 @@ class ExpressionCodegen( return super.visitDoWhileLoop(loop, data) } + override fun visitThrow(expression: IrThrow, data: BlockInfo): StackValue { + gen(expression.value, JAVA_THROWABLE_TYPE, data) + mv.athrow() + return expression.onStack + } + private fun coerceNotToUnit(fromType: Type, toType: Type) { if (toType != AsmTypes.UNIT_TYPE) { coerce(fromType, toType, mv) @@ -433,7 +439,12 @@ class ExpressionCodegen( return intrinsic.toCallable(irCall, typeMapper.mapSignatureSkipGeneric(irCall.descriptor as FunctionDescriptor), classCodegen.context) } - return typeMapper.mapToCallableMethod(irCall.descriptor as FunctionDescriptor, isSuper) + var descriptor = irCall.descriptor + if (descriptor is TypeAliasConstructorDescriptor) { + //TODO where is best to unwrap? + descriptor = descriptor.underlyingConstructorDescriptor + } + return typeMapper.mapToCallableMethod(descriptor as FunctionDescriptor, isSuper) } private val KotlinType.asmType: Type