Render byte code on exception from back-end
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user