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.*; 28 import proguard.classfile.*; 29 import proguard.classfile.attribute.CodeAttribute; 30 import proguard.optimize.info.MethodOptimizationInfo; 31 32 38 public class SuperInvocationMarker 39 extends SimplifiedVisitor 40 implements InstructionVisitor, 41 ConstantVisitor 42 { 43 private boolean invokesSuperMethods; 44 45 46 48 public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} 49 50 51 public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) 52 { 53 if (constantInstruction.opcode == InstructionConstants.OP_INVOKESPECIAL) 54 { 55 invokesSuperMethods = false; 56 57 clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); 58 59 if (invokesSuperMethods) 60 { 61 setInvokesSuperMethods(method); 62 } 63 } 64 } 65 66 67 69 public void visitAnyMethodrefConstant(Clazz clazz, RefConstant refConstant) 70 { 71 invokesSuperMethods = 72 !clazz.equals(refConstant.referencedClass) && 73 !refConstant.getName(clazz).equals(ClassConstants.INTERNAL_METHOD_NAME_INIT); 74 } 75 76 77 79 private static void setInvokesSuperMethods(Method method) 80 { 81 MethodOptimizationInfo info = MethodOptimizationInfo.getMethodOptimizationInfo(method); 82 if (info != null) 83 { 84 info.setInvokesSuperMethods(); 85 } 86 } 87 88 89 public static boolean invokesSuperMethods(Method method) 90 { 91 MethodOptimizationInfo info = MethodOptimizationInfo.getMethodOptimizationInfo(method); 92 return info == null || info.invokesSuperMethods(); 93 } 94 } 95 | Popular Tags |