diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java index 1d4ee47deb6..778eeae72dd 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java @@ -339,13 +339,17 @@ public class AsmUtil { } } - public static void genThrow(@NotNull MethodVisitor mv, @NotNull String exception, @NotNull String message) { - InstructionAdapter iv = new InstructionAdapter(mv); - iv.anew(Type.getObjectType(exception)); - iv.dup(); - iv.aconst(message); - iv.invokespecial(exception, "", "(Ljava/lang/String;)V", false); - iv.athrow(); + public static void genThrow(@NotNull InstructionAdapter v, @NotNull String exception, @Nullable String message) { + v.anew(Type.getObjectType(exception)); + v.dup(); + if (message != null) { + v.aconst(message); + v.invokespecial(exception, "", "(Ljava/lang/String;)V", false); + } + else { + v.invokespecial(exception, "", "()V", false); + } + v.athrow(); } public static void genClosureFields(CalculatedClosure closure, ClassBuilder v, JetTypeMapper typeMapper) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 72f6561a9da..cd1667e2de1 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -3650,9 +3650,9 @@ The "returned" value of try expression with no finally is either the last expres v.ifnonnull(nonnull); JetType leftType = bindingContext.get(EXPRESSION_TYPE, left); assert leftType != null; - throwNewException("kotlin/TypeCastException", DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(leftType) + - " cannot be cast to " + - DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(rightType)); + genThrow(v, "kotlin/TypeCastException", DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(leftType) + + " cannot be cast to " + + DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(rightType)); v.mark(nonnull); } } @@ -3812,7 +3812,7 @@ The "returned" value of try expression with no finally is either the last expres ) { if (Boolean.TRUE.equals(bindingContext.get(BindingContext.EXHAUSTIVE_WHEN, expression))) { // when() is supposed to be exhaustive - throwNewException("kotlin/NoWhenBranchMatchedException"); + genThrow(v, "kotlin/NoWhenBranchMatchedException", null); } else { // non-exhaustive when() with no else -> Unit must be expected @@ -3854,23 +3854,6 @@ The "returned" value of try expression with no finally is either the last expres return false; } - private void throwNewException(@NotNull String className) { - throwNewException(className, null); - } - - private void throwNewException(@NotNull String className, @Nullable String message) { - v.anew(Type.getObjectType(className)); - v.dup(); - if (message != null) { - v.visitLdcInsn(message); - v.invokespecial(className, "", "(Ljava/lang/String;)V", false); - } - else { - v.invokespecial(className, "", "()V", false); - } - v.athrow(); - } - private Call makeFakeCall(ReceiverValue initializerAsReceiver) { JetSimpleNameExpression fake = JetPsiFactory(state.getProject()).createSimpleName("fake"); return CallMaker.makeCall(fake, initializerAsReceiver); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 1baf3b45dc6..89ad9ae3c5c 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -565,7 +565,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { MethodVisitor mv = v.newMethod(NO_ORIGIN, access, name, desc, null, null); if (descriptor.getKind() != ClassKind.TRAIT) { mv.visitCode(); - genThrow(mv, "java/lang/UnsupportedOperationException", "Mutating immutable collection"); + genThrow(new InstructionAdapter(mv), "java/lang/UnsupportedOperationException", "Mutating immutable collection"); FunctionCodegen.endVisit(mv, "built-in stub for " + name + desc, null); } }