private void disassemble(String indent, CodeAttr code) { CodeBuffer buffer = code.getCodeBuffer(); mExceptionHandlers = buffer.getExceptionHandlers(); print(indent); print("// max stack: "); println(String.valueOf(buffer.getMaxStackDepth())); print(indent); print("// max locals: "); println(String.valueOf(buffer.getMaxLocals())); gatherLabels(); if (nextLine != currentLine) { if ((currentLine = nextLine) >= 0) { println(indent, "// line " + currentLine); locateLabel(indent); frame = stackMap(indent, frame); print(indent, mnemonic); case Opcode.MONITORENTER: case Opcode.MONITOREXIT: println(); continue; case Opcode.DLOAD_0: case Opcode.ALOAD_0: disassemble(code.getLocalVariable(mAddress, 0));
private void disassemble(String indent, Annotation[] annotations) { for (int i=0; i<annotations.length; i++) { print(indent); disassemble(indent, annotations[i]); println(); } }
private void disassemble(LocalVariable var) { if (var != null) { print(" // "); print(var.getName()); print(": "); disassemble(var.getType()); } }
private StackMapTableAttr.StackMapFrame stackMap(String indent, StackMapTableAttr.StackMapFrame frame) { if (frame == null) { return null; } if (mAddress < frame.getOffset()) { return frame; } print(indent); print("// stack: "); print(frame.getStackItemInfos()); println(); print(indent); print("// locals: "); print(frame.getLocalInfos()); println(); return frame.getNext(); }
println(indent, "/**"); print(indent, " * Disassembled on "); print(new Date()); println("."); addBreak = true; println(indent, " * "); addBreak = false; print(indent, " * @target "); println(CodeAssemblerPrinter.escape(mClassFile.getTarget())); println(indent, " * "); addBreak = false; print(indent, " * @source "); println(CodeAssemblerPrinter.escape(mClassFile.getSourceFile())); println(indent, " * "); addBreak = false; println(indent, " * @anonymous"); } else { print(indent, " * @name "); println(CodeAssemblerPrinter.escape(mClassFile.getInnerClassName())); println(indent, " * "); addBreak = false;
private void locateLabel(String indent) { int labelKey = mAddress; Object labelValue = mLabels.get(labelKey); if (labelValue == null) { return; } int len = indent.length() - 4; if (len > 0) { print(indent.substring(0, len)); } print(labelValue); println(":"); List<ExceptionHandler> handlers = mCatchLocations.get(labelKey); if (handlers != null) { for (int i=0; i<handlers.size(); i++) { ExceptionHandler handler = handlers.get(i); print(indent, "try ("); print(getLabel(handler.getStartLocation().getLocation())); print(".."); print(getLabel(handler.getEndLocation().getLocation())); print(") catch ("); if (handler.getCatchType() == null) { print("..."); } else { disassemble(handler.getCatchType()); } println(")"); } } }
createLabel(new Integer(handler.getStartLocation().getLocation())); createLabel(new Integer(handler.getEndLocation().getLocation())); int labelKey = handler.getCatchLocation().getLocation(); createLabel(labelKey); List<ExceptionHandler> list = mCatchLocations.get(labelKey); if (list == null) { case Opcode.IF_ICMPGT: case Opcode.IF_ICMPLE: createLabel(new Integer(mAddress + readShort())); break; createLabel(new Integer(mAddress + readInt())); break; createLabel(new Integer(opcodeAddress + readInt())); int lowValue = readInt(); int highValue = readInt(); int caseCount = highValue - lowValue + 1; createLabel(new Integer(opcodeAddress + readInt())); int caseCount = readInt(); createLabel(new Integer(opcodeAddress + readInt()));
public void disassemble(ClassFile cf, PrintWriter out) { disassemble(cf, out, ""); }
p = new AssemblyStylePrinter(); } else if (style.equals("builder")) { p = new BuilderStylePrinter();
private void disassemble(String indent, FieldInfo field) { SignatureAttr sig = field.getSignatureAttr(); if (field.isDeprecated() || field.isSynthetic() || sig != null) { println(indent, "/**"); if (field.isDeprecated()) { println(indent, " * @deprecated"); } if (field.isSynthetic()) { println(indent, " * @synthetic"); } if (sig != null) { println(indent, " * @signature " + sig.getSignature().getValue()); } println(indent, " */"); } disassemble(indent, field.getRuntimeVisibleAnnotations()); disassemble(indent, field.getRuntimeInvisibleAnnotations()); print(indent); disassemble(field.getModifiers()); disassemble(field.getType()); print(" "); print(field.getName()); ConstantInfo constant = field.getConstantValue(); if (constant != null) { print(" = "); disassemble(constant); } println(";"); }
println(indent, "/**"); print(indent, " * Disassembled on "); print(new Date()); println("."); addBreak = true; println(indent, " * "); addBreak = false; print(indent, " * @target "); println(CodeAssemblerPrinter.escape(mClassFile.getTarget())); println(indent, " * "); addBreak = false; print(indent, " * @source "); println(CodeAssemblerPrinter.escape(mClassFile.getSourceFile())); println(indent, " * "); addBreak = false; println(indent, " * @anonymous"); } else { print(indent, " * @name "); println(CodeAssemblerPrinter.escape(mClassFile.getInnerClassName())); println(indent, " * "); addBreak = false;
private void locateLabel(String indent) { int labelKey = mAddress; Object labelValue = mLabels.get(labelKey); if (labelValue == null) { return; } int len = indent.length() - 4; if (len > 0) { print(indent.substring(0, len)); } print(labelValue); println(":"); List<ExceptionHandler> handlers = mCatchLocations.get(labelKey); if (handlers != null) { for (int i=0; i<handlers.size(); i++) { ExceptionHandler handler = handlers.get(i); print(indent, "try ("); print(getLabel(handler.getStartLocation().getLocation())); print(".."); print(getLabel(handler.getEndLocation().getLocation())); print(") catch ("); if (handler.getCatchType() == null) { print("..."); } else { disassemble(handler.getCatchType()); } println(")"); } } }
private void disassemble(String indent, Annotation ann) { print("@"); print(ann.getType().getFullName()); Map mvMap = ann.getMemberValues(); if (mvMap.size() == 0) { return; } print("("); Iterator it = mvMap.entrySet().iterator(); int ordinal = 0; while (it.hasNext()) { if (ordinal++ > 0) { print(", "); } Map.Entry entry = (Map.Entry)it.next(); String name = (String)entry.getKey(); if (!"value".equals(name)) { print(name); print("="); } disassemble(indent, (Annotation.MemberValue)entry.getValue()); } print(")"); }
createLabel(handler.getStartLocation().getLocation()); createLabel(handler.getEndLocation().getLocation()); int labelKey = handler.getCatchLocation().getLocation(); createLabel(labelKey); List<ExceptionHandler> list = mCatchLocations.get(labelKey); if (list == null) { case Opcode.IF_ICMPGT: case Opcode.IF_ICMPLE: createLabel(mAddress + readShort()); break; createLabel(mAddress + readInt()); break; createLabel(opcodeAddress + readInt()); int lowValue = readInt(); int highValue = readInt(); int caseCount = highValue - lowValue + 1; createLabel(opcodeAddress + readInt()); int caseCount = readInt(); createLabel(opcodeAddress + readInt());
private void printCharLiteral(int value) { if (value >= 0 && value <= 65535) { int type = Character.getType((char)value); switch (type) { case Character.UPPERCASE_LETTER: case Character.LOWERCASE_LETTER: case Character.TITLECASE_LETTER: case Character.MODIFIER_LETTER: case Character.OTHER_LETTER: case Character.NON_SPACING_MARK: case Character.ENCLOSING_MARK: case Character.COMBINING_SPACING_MARK: case Character.DECIMAL_DIGIT_NUMBER: case Character.LETTER_NUMBER: case Character.OTHER_NUMBER: case Character.DASH_PUNCTUATION: case Character.START_PUNCTUATION: case Character.END_PUNCTUATION: case Character.CONNECTOR_PUNCTUATION: case Character.OTHER_PUNCTUATION: case Character.MATH_SYMBOL: case Character.CURRENCY_SYMBOL: case Character.MODIFIER_SYMBOL: case Character.OTHER_SYMBOL: print(" // '"); print(String.valueOf((char)value)); print("'"); } } }
private StackMapTableAttr.StackMapFrame stackMap(String indent, StackMapTableAttr.StackMapFrame frame) { if (frame == null) { return null; } if (mAddress < frame.getOffset()) { return frame; } print(indent); print("// frame type: "); print(frame.getClass().getSimpleName()); println(); print(indent); print("// stack: "); print(frame.getStackItemInfos()); println(); print(indent); print("// locals: "); print(frame.getLocalInfos()); println(); return frame.getNext(); }
private void disassemble(ConstantInfo constant) { disassemble(constant, false); }
p = new AssemblyStylePrinter(); } else if (style.equals("builder")) { p = new BuilderStylePrinter();
private void disassemble(String indent, CodeAttr code) { CodeBuffer buffer = code.getCodeBuffer(); mExceptionHandlers = buffer.getExceptionHandlers(); print(indent); print("// max stack: "); println(String.valueOf(buffer.getMaxStackDepth())); print(indent); print("// max locals: "); println(String.valueOf(buffer.getMaxLocals())); gatherLabels(); if (nextLine != currentLine) { if ((currentLine = nextLine) >= 0) { println(indent, "// line " + currentLine); locateLabel(indent); frame = stackMap(indent, frame); print(indent, mnemonic); case Opcode.MONITORENTER: case Opcode.MONITOREXIT: println(); continue; case Opcode.DLOAD_0: case Opcode.ALOAD_0: disassemble(code.getLocalVariable(mAddress, 0));