# HG changeset patch # User Doug Simon # Date 1427038412 -3600 # Node ID 053c1f9daed1421eb9ad5a5d698ac4c47daa112c # Parent 4187aa9d6a1048dd3f67e0e3b8fdc80a87a1fee4 support disassembling a subrange of a bytecode method diff -r 4187aa9d6a10 -r 053c1f9daed1 graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeDisassembler.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeDisassembler.java Sun Mar 22 12:30:26 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeDisassembler.java Sun Mar 22 16:33:32 2015 +0100 @@ -51,6 +51,15 @@ * @return {@code null} if {@code method} has no bytecode (e.g., it is native or abstract) */ public String disassemble(ResolvedJavaMethod method) { + return disassemble(method, 0, Integer.MAX_VALUE); + } + + /** + * Disassembles the bytecode of a given method in a {@code javap}-like format. + * + * @return {@code null} if {@code method} has no bytecode (e.g., it is native or abstract) + */ + public String disassemble(ResolvedJavaMethod method, int startBci, int endBci) { if (method.getCode() == null) { return null; } @@ -60,10 +69,11 @@ int opcode = stream.currentBC(); while (opcode != Bytecodes.END) { int bci = stream.currentBCI(); - String mnemonic = Bytecodes.nameOf(opcode); - buf.append(String.format("%4d: %-14s", bci, mnemonic)); - if (stream.nextBCI() > bci + 1) { - // @formatter:off + if (bci >= startBci && bci <= endBci) { + String mnemonic = Bytecodes.nameOf(opcode); + buf.append(String.format("%4d: %-14s", bci, mnemonic)); + if (stream.nextBCI() > bci + 1) { + // @formatter:off switch (opcode) { case BIPUSH : buf.append(stream.readByte()); break; case SIPUSH : buf.append(stream.readShort()); break; @@ -211,8 +221,9 @@ } } // @formatter:on + } + buf.append(String.format("%n")); } - buf.append(String.format("%n")); stream.next(); opcode = stream.currentBC(); }