| 1 21 package proguard.optimize.peephole; 22 23 import proguard.classfile.*; 24 import proguard.classfile.util.*; 25 import proguard.classfile.visitor.*; 26 import proguard.optimize.KeepMarker; 27 28 34 public class ClassFinalizer 35 extends SimplifiedVisitor 36 implements ClassVisitor, 37 MemberVisitor 38 { 39 private ClassVisitor extraClassVisitor; 40 private MemberVisitor extraMemberVisitor; 41 42 private MemberFinder memberFinder = new MemberFinder(); 43 44 45 48 public ClassFinalizer() 49 { 50 this(null, null); 51 } 52 53 54 61 public ClassFinalizer(ClassVisitor extraClassVisitor, 62 MemberVisitor extraMemberVisitor) 63 { 64 this.extraClassVisitor = extraClassVisitor; 65 this.extraMemberVisitor = extraMemberVisitor; 66 } 67 68 69 71 public void visitProgramClass(ProgramClass programClass) 72 { 73 if ((programClass.u2accessFlags & (ClassConstants.INTERNAL_ACC_FINAL | 78 ClassConstants.INTERNAL_ACC_INTERFACE | 79 ClassConstants.INTERNAL_ACC_ABSTRACT)) == 0 && 80 !KeepMarker.isKept(programClass) && 81 programClass.subClasses == null) 82 { 83 programClass.u2accessFlags |= ClassConstants.INTERNAL_ACC_FINAL; 84 85 if (extraClassVisitor != null) 87 { 88 extraClassVisitor.visitProgramClass(programClass); 89 } 90 } 91 92 programClass.methodsAccept(this); 94 } 95 96 97 99 public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) 100 { 101 String name = programMethod.getName(programClass); 102 103 if ((programMethod.u2accessFlags & (ClassConstants.INTERNAL_ACC_PRIVATE | 109 ClassConstants.INTERNAL_ACC_STATIC | 110 ClassConstants.INTERNAL_ACC_FINAL | 111 ClassConstants.INTERNAL_ACC_ABSTRACT)) == 0 && 112 !name.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT) && 113 ((programClass.u2accessFlags & ClassConstants.INTERNAL_ACC_FINAL) != 0 || 114 (!KeepMarker.isKept(programMethod) && 115 (programClass.subClasses == null || 116 !memberFinder.isOverriden(programClass, programMethod))))) 117 { 118 programMethod.u2accessFlags |= ClassConstants.INTERNAL_ACC_FINAL; 119 120 if (extraMemberVisitor != null) 122 { 123 extraMemberVisitor.visitProgramMethod(programClass, programMethod); 124 } 125 } 126 } 127 } 128 | Popular Tags |