Render byte code on exception from back-end

This commit is contained in:
Andrey Breslav
2013-11-28 19:10:53 +04:00
parent c975fcb847
commit 23e533f3b7
@@ -28,6 +28,7 @@ import org.jetbrains.asm4.MethodVisitor;
import org.jetbrains.asm4.Type; import org.jetbrains.asm4.Type;
import org.jetbrains.asm4.commons.InstructionAdapter; import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.asm4.commons.Method; import org.jetbrains.asm4.commons.Method;
import org.jetbrains.asm4.util.TraceMethodVisitor;
import org.jetbrains.jet.codegen.binding.CodegenBinding; import org.jetbrains.jet.codegen.binding.CodegenBinding;
import org.jetbrains.jet.codegen.context.CodegenContext; import org.jetbrains.jet.codegen.context.CodegenContext;
import org.jetbrains.jet.codegen.context.MethodContext; 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.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.*; import java.util.*;
import static org.jetbrains.asm4.Opcodes.*; import static org.jetbrains.asm4.Opcodes.*;
@@ -437,17 +440,32 @@ public class FunctionCodegen extends ParentCodegenAwareImpl {
throw e; throw e;
} }
catch (Throwable t) { catch (Throwable t) {
String bytecode = renderByteCodeIfAvailable(mv);
throw new CompilationException( throw new CompilationException(
"wrong code generated" + "wrong code generated" +
(description != null ? " for " + description : "") + (description != null ? " for " + description : "") +
t.getClass().getName() + t.getClass().getName() +
" " + " " +
t.getMessage(), t.getMessage() +
(bytecode != null ? "\nbytecode:\n" + bytecode : ""),
t, method); t, method);
} }
mv.visitEnd(); 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( static void generateBridgeIfNeeded(
CodegenContext owner, CodegenContext owner,
GenerationState state, GenerationState state,