diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index 6ef4f1fe576..e9a625208d8 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -28,6 +28,7 @@ import org.jetbrains.asm4.MethodVisitor; import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.InstructionAdapter; import org.jetbrains.asm4.commons.Method; +import org.jetbrains.asm4.util.TraceMethodVisitor; import org.jetbrains.jet.codegen.binding.CodegenBinding; import org.jetbrains.jet.codegen.context.CodegenContext; import org.jetbrains.jet.codegen.context.MethodContext; @@ -43,6 +44,8 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.name.Name; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.*; import static org.jetbrains.asm4.Opcodes.*; @@ -437,17 +440,32 @@ public class FunctionCodegen extends ParentCodegenAwareImpl { throw e; } catch (Throwable t) { + String bytecode = renderByteCodeIfAvailable(mv); throw new CompilationException( "wrong code generated" + (description != null ? " for " + description : "") + t.getClass().getName() + " " + - t.getMessage(), + t.getMessage() + + (bytecode != null ? "\nbytecode:\n" + bytecode : ""), t, method); } mv.visitEnd(); } + private static String renderByteCodeIfAvailable(MethodVisitor mv) { + String bytecode = null; + if (mv instanceof TraceMethodVisitor) { + TraceMethodVisitor traceMethodVisitor = (TraceMethodVisitor) mv; + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + traceMethodVisitor.p.print(pw); + pw.close(); + bytecode = sw.toString(); + } + return bytecode; + } + static void generateBridgeIfNeeded( CodegenContext owner, GenerationState state,