1 21 package proguard.optimize.peephole; 22 23 import proguard.classfile.*; 24 import proguard.classfile.attribute.*; 25 import proguard.classfile.attribute.visitor.*; 26 import proguard.classfile.attribute.annotation.*; 27 import proguard.classfile.attribute.annotation.visitor.*; 28 import proguard.classfile.constant.*; 29 import proguard.classfile.constant.visitor.ConstantVisitor; 30 import proguard.classfile.editor.ClassReferenceFixer; 31 import proguard.classfile.visitor.*; 32 import proguard.classfile.util.SimplifiedVisitor; 33 import proguard.optimize.info.SingleImplementationMarker; 34 35 45 public class SingleImplementationInliner 46 extends SimplifiedVisitor 47 implements ClassVisitor, 48 ConstantVisitor, 49 MemberVisitor, 50 AttributeVisitor, 51 LocalVariableInfoVisitor, 52 LocalVariableTypeInfoVisitor, 53 AnnotationVisitor, 54 ElementValueVisitor 55 { 56 58 public void visitProgramClass(ProgramClass programClass) 59 { 60 programClass.constantPoolEntriesAccept(this); 62 63 programClass.fieldsAccept(this); 65 programClass.methodsAccept(this); 66 67 programClass.attributesAccept(this); 69 } 70 71 72 74 public void visitAnyConstant(Clazz clazz, Constant constant) {} 75 76 77 public void visitStringConstant(Clazz clazz, StringConstant stringConstant) 78 { 79 if (stringConstant.referencedMember == null) 80 { 81 Clazz singleImplementationClass = 84 SingleImplementationMarker.singleImplementation(stringConstant.referencedClass); 85 86 if (singleImplementationClass != null) 87 { 88 stringConstant.referencedClass = singleImplementationClass; 89 } 90 } 91 } 92 93 94 public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant) 95 { 96 Clazz singleImplementationClass = 98 SingleImplementationMarker.singleImplementation(interfaceMethodrefConstant.referencedClass); 99 100 if (singleImplementationClass != null) 101 { 102 String name = interfaceMethodrefConstant.getName(clazz); 104 String type = interfaceMethodrefConstant.getType(clazz); 105 106 interfaceMethodrefConstant.referencedClass = singleImplementationClass; 107 interfaceMethodrefConstant.referencedMember = singleImplementationClass.findMethod(name, type); 108 } 109 } 110 111 112 public void visitClassConstant(Clazz clazz, ClassConstant classConstant) 113 { 114 Clazz singleImplementationClass = 117 SingleImplementationMarker.singleImplementation(classConstant.referencedClass); 118 119 if (singleImplementationClass != null) 120 { 121 classConstant.referencedClass = singleImplementationClass; 122 } 123 } 124 125 126 128 public void visitProgramField(ProgramClass programClass, ProgramField programField) 129 { 130 Clazz singleImplementationClass = 133 SingleImplementationMarker.singleImplementation(programField.referencedClass); 134 135 if (singleImplementationClass != null) 136 { 137 programField.referencedClass = singleImplementationClass; 138 } 139 140 programField.attributesAccept(programClass, this); 142 } 143 144 145 public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) 146 { 147 updateReferencedClasses(programMethod.referencedClasses); 150 151 programMethod.attributesAccept(programClass, this); 153 } 154 155 156 158 public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} 159 160 161 public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) 162 { 163 codeAttribute.attributesAccept(clazz, method, this); 165 } 166 167 168 public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) 169 { 170 localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); 172 } 173 174 175 public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) 176 { 177 localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); 179 } 180 181 182 public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) 183 { 184 updateReferencedClasses(signatureAttribute.referencedClasses); 186 } 187 188 189 public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) 190 { 191 annotationsAttribute.annotationsAccept(clazz, this); 193 } 194 195 196 public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) 197 { 198 parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); 200 } 201 202 203 public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) 204 { 205 annotationDefaultAttribute.defaultValueAccept(clazz, this); 207 } 208 209 210 212 public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) 213 { 214 Clazz singleImplementationClass = 217 SingleImplementationMarker.singleImplementation(localVariableInfo.referencedClass); 218 219 if (singleImplementationClass != null) 220 { 221 localVariableInfo.referencedClass = singleImplementationClass; 222 } 223 } 224 225 226 228 public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) 229 { 230 updateReferencedClasses(localVariableTypeInfo.referencedClasses); 232 } 233 234 235 237 public void visitAnnotation(Clazz clazz, Annotation annotation) 238 { 239 updateReferencedClasses(annotation.referencedClasses); 241 242 annotation.elementValuesAccept(clazz, this); 244 } 245 246 247 249 public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) 250 { 251 } 252 253 254 public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) 255 { 256 updateReferencedClasses(enumConstantElementValue.referencedClasses); 258 } 259 260 261 public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) 262 { 263 updateReferencedClasses(classElementValue.referencedClasses); 265 } 266 267 268 public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) 269 { 270 annotationElementValue.annotationAccept(clazz, this); 272 } 273 274 275 public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) 276 { 277 arrayElementValue.elementValuesAccept(clazz, annotation, this); 279 } 280 281 282 284 288 private void updateReferencedClasses(Clazz[] referencedClasses) 289 { 290 if (referencedClasses != null) 292 { 293 for (int index = 0; index < referencedClasses.length; index++) 294 { 295 Clazz singleImplementationClass = 297 SingleImplementationMarker.singleImplementation(referencedClasses[index]); 298 299 if (singleImplementationClass != null) 301 { 302 referencedClasses[index] = singleImplementationClass; 303 } 304 } 305 } 306 } 307 } 308 | Popular Tags |