148 ConstantPool cp = code.getConstantPool();
149 BytecodeStream stream = new BytecodeStream(code.getCode());
150 StringBuilder buf = new StringBuilder();
151 int opcode = stream.currentBC();
152 try {
153 while (opcode != Bytecodes.END) {
154 int bci = stream.currentBCI();
155 if (bci >= startBci && bci <= endBci) {
156 String mnemonic = Bytecodes.nameOf(opcode);
157 buf.append(String.format("%4d: %-14s", bci, mnemonic));
158 if (stream.nextBCI() > bci + 1) {
159 decodeOperand(buf, stream, cp, method, bci, opcode);
160 }
161 if (newLine) {
162 buf.append(String.format("%n"));
163 }
164 }
165 stream.next();
166 opcode = stream.currentBC();
167 }
168 } catch (RuntimeException e) {
169 throw new RuntimeException(String.format("Error disassembling %s%nPartial disassembly:%n%s", method.format("%H.%n(%p)"), buf.toString()), e);
170 }
171 return buf.toString();
172 }
173
174 private void decodeOperand(StringBuilder buf, BytecodeStream stream, ConstantPool cp, ResolvedJavaMethod method, int bci, int opcode) {
175 // @formatter:off
176 switch (opcode) {
177 case BIPUSH : buf.append(stream.readByte()); break;
178 case SIPUSH : buf.append(stream.readShort()); break;
179 case NEW :
180 case CHECKCAST :
181 case INSTANCEOF :
182 case ANEWARRAY : {
183 int cpi = stream.readCPI();
184 JavaType type = cp.lookupType(cpi, opcode);
185 buf.append(String.format("#%-10d // %s", cpi, type.toJavaName()));
186 break;
187 }
188 case GETSTATIC :
|
148 ConstantPool cp = code.getConstantPool();
149 BytecodeStream stream = new BytecodeStream(code.getCode());
150 StringBuilder buf = new StringBuilder();
151 int opcode = stream.currentBC();
152 try {
153 while (opcode != Bytecodes.END) {
154 int bci = stream.currentBCI();
155 if (bci >= startBci && bci <= endBci) {
156 String mnemonic = Bytecodes.nameOf(opcode);
157 buf.append(String.format("%4d: %-14s", bci, mnemonic));
158 if (stream.nextBCI() > bci + 1) {
159 decodeOperand(buf, stream, cp, method, bci, opcode);
160 }
161 if (newLine) {
162 buf.append(String.format("%n"));
163 }
164 }
165 stream.next();
166 opcode = stream.currentBC();
167 }
168 } catch (Throwable e) {
169 throw new RuntimeException(String.format("Error disassembling %s%nPartial disassembly:%n%s", method.format("%H.%n(%p)"), buf.toString()), e);
170 }
171 return buf.toString();
172 }
173
174 private void decodeOperand(StringBuilder buf, BytecodeStream stream, ConstantPool cp, ResolvedJavaMethod method, int bci, int opcode) {
175 // @formatter:off
176 switch (opcode) {
177 case BIPUSH : buf.append(stream.readByte()); break;
178 case SIPUSH : buf.append(stream.readShort()); break;
179 case NEW :
180 case CHECKCAST :
181 case INSTANCEOF :
182 case ANEWARRAY : {
183 int cpi = stream.readCPI();
184 JavaType type = cp.lookupType(cpi, opcode);
185 buf.append(String.format("#%-10d // %s", cpi, type.toJavaName()));
186 break;
187 }
188 case GETSTATIC :
|