1 21 package proguard.optimize.info; 22 23 import proguard.classfile.util.SimplifiedVisitor; 24 import proguard.classfile.instruction.visitor.InstructionVisitor; 25 import proguard.classfile.instruction.*; 26 import proguard.classfile.constant.visitor.ConstantVisitor; 27 import proguard.classfile.constant.RefConstant; 28 import proguard.classfile.*; 29 import proguard.classfile.attribute.CodeAttribute; 30 31 37 public class BackwardBranchMarker 38 extends SimplifiedVisitor 39 implements InstructionVisitor 40 { 41 43 public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} 44 45 46 public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction) 47 { 48 markBackwardBranch(method, branchInstruction.branchOffset); 49 } 50 51 52 public void visitAnySwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SwitchInstruction switchInstruction) 53 { 54 markBackwardBranch(method, switchInstruction.defaultOffset); 55 56 for (int index = 0; index < switchInstruction.jumpOffsets.length; index++) 57 { 58 markBackwardBranch(method, switchInstruction.jumpOffsets[index]); 59 } 60 } 61 62 63 65 68 private void markBackwardBranch(Method method, int branchOffset) 69 { 70 if (branchOffset < 0) 71 { 72 setBranchesBackward(method); 73 } 74 } 75 76 77 private static void setBranchesBackward(Method method) 78 { 79 MethodOptimizationInfo info = MethodOptimizationInfo.getMethodOptimizationInfo(method); 80 if (info != null) 81 { 82 info.setBranchesBackward(); 83 } 84 } 85 86 87 public static boolean branchesBackward(Method method) 88 { 89 MethodOptimizationInfo info = MethodOptimizationInfo.getMethodOptimizationInfo(method); 90 return info == null || info.branchesBackward(); 91 } 92 } 93 | Popular Tags |