📄 backwardbranchmarker.java
字号:
package proguard.optimize.info;import proguard.classfile.util.SimplifiedVisitor;import proguard.classfile.instruction.visitor.InstructionVisitor;import proguard.classfile.instruction.*;import proguard.classfile.constant.visitor.ConstantVisitor;import proguard.classfile.constant.RefConstant;import proguard.classfile.*;import proguard.classfile.attribute.CodeAttribute;/** * This InstructionVisitor marks all methods that branch backward in any of the * instructions that it visits. * * @author Eric Lafortune */public class BackwardBranchMarkerextends SimplifiedVisitorimplements InstructionVisitor{ // Implementations for InstructionVisitor. public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) { markBackwardBranch(method, branchInstruction.branchOffset); } public void visitTableSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TableSwitchInstruction tableSwitchInstruction) { markBackwardBranch(method, tableSwitchInstruction.defaultOffset); for (int index = 0; index < tableSwitchInstruction.jumpOffsetCount; index++) { markBackwardBranch(method, tableSwitchInstruction.jumpOffsets[index]); } } public void visitLookUpSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LookUpSwitchInstruction lookUpSwitchInstruction) { markBackwardBranch(method, lookUpSwitchInstruction.defaultOffset); for (int index = 0; index < lookUpSwitchInstruction.jumpOffsetCount; index++) { markBackwardBranch(method, lookUpSwitchInstruction.jumpOffsets[index]); } } // Small utility methods. /** * Marks the given method if the given branch offset is negative. */ private void markBackwardBranch(Method method, int branchOffset) { if (branchOffset < 0) { setBranchesBackward(method); } } private static void setBranchesBackward(Method method) { MethodOptimizationInfo info = MethodOptimizationInfo.getMethodOptimizationInfo(method); if (info != null) { info.setBranchesBackward(); } } public static boolean branchesBackward(Method method) { MethodOptimizationInfo info = MethodOptimizationInfo.getMethodOptimizationInfo(method); return info == null || info.branchesBackward(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -