• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * ProGuard -- shrinking, optimization, obfuscation, and preverification
3  *             of Java bytecode.
4  *
5  * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu)
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by the Free
9  * Software Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15  * more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  */
21 package proguard.obfuscate;
22 
23 import proguard.classfile.*;
24 import proguard.classfile.util.SimplifiedVisitor;
25 import proguard.classfile.constant.ClassConstant;
26 import proguard.classfile.constant.visitor.ConstantVisitor;
27 import proguard.classfile.attribute.*;
28 import proguard.classfile.attribute.visitor.*;
29 import proguard.classfile.visitor.*;
30 
31 
32 /**
33  * This <code>ClassVisitor</code> and <code>MemberVisitor</code>
34  * marks names of the classes and class members it visits. The marked names
35  * will remain unchanged in the obfuscation step.
36  *
37  * @see ClassObfuscator
38  * @see MemberObfuscator
39  *
40  * @author Eric Lafortune
41  */
42 class      NameMarker
43 extends    SimplifiedVisitor
44 implements ClassVisitor,
45            MemberVisitor,
46            AttributeVisitor,
47            InnerClassesInfoVisitor,
48            ConstantVisitor
49 {
50     // Implementations for ClassVisitor.
51 
visitProgramClass(ProgramClass programClass)52     public void visitProgramClass(ProgramClass programClass)
53     {
54         keepClassName(programClass);
55 
56         // Make sure any outer class names are kept as well.
57         programClass.attributesAccept(this);
58     }
59 
60 
visitLibraryClass(LibraryClass libraryClass)61     public void visitLibraryClass(LibraryClass libraryClass)
62     {
63         keepClassName(libraryClass);
64     }
65 
66 
67     // Implementations for MemberVisitor.
68 
visitProgramField(ProgramClass programClass, ProgramField programField)69     public void visitProgramField(ProgramClass programClass, ProgramField programField)
70     {
71         keepFieldName(programClass, programField);
72     }
73 
74 
visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod)75     public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod)
76     {
77         keepMethodName(programClass, programMethod);
78     }
79 
80 
visitLibraryField(LibraryClass libraryClass, LibraryField libraryField)81     public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField)
82     {
83         keepFieldName(libraryClass, libraryField);
84     }
85 
86 
visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod)87     public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod)
88     {
89         keepMethodName(libraryClass, libraryMethod);
90     }
91 
92 
93     // Implementations for AttributeVisitor.
94 
visitAnyAttribute(Clazz clazz, Attribute attribute)95     public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
96 
97 
visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute)98     public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute)
99     {
100         // Make sure the outer class names are kept as well.
101         innerClassesAttribute.innerClassEntriesAccept(clazz, this);
102     }
103 
104 
105     // Implementations for InnerClassesInfoVisitor.
106 
visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo)107     public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo)
108     {
109         // Make sure the outer class name is kept as well.
110         int innerClassIndex = innerClassesInfo.u2innerClassIndex;
111         int outerClassIndex = innerClassesInfo.u2outerClassIndex;
112         if (innerClassIndex != 0 &&
113             outerClassIndex != 0 &&
114             clazz.getClassName(innerClassIndex).equals(clazz.getName()))
115         {
116             clazz.constantPoolEntryAccept(outerClassIndex, this);
117         }
118     }
119 
120 
121     // Implementations for ConstantVisitor.
122 
visitClassConstant(Clazz clazz, ClassConstant classConstant)123     public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
124     {
125         // Make sure the outer class name is kept as well.
126         classConstant.referencedClassAccept(this);
127     }
128 
129 
130     // Small utility method.
131 
132     /**
133      * Ensures the name of the given class name will be kept.
134      */
keepClassName(Clazz clazz)135     public void keepClassName(Clazz clazz)
136     {
137         ClassObfuscator.setNewClassName(clazz,
138                                         clazz.getName());
139     }
140 
141 
142     /**
143      * Ensures the name of the given field name will be kept.
144      */
keepFieldName(Clazz clazz, Field field)145     private void keepFieldName(Clazz clazz, Field field)
146     {
147         MemberObfuscator.setFixedNewMemberName(field,
148                                                field.getName(clazz));
149     }
150 
151 
152     /**
153      * Ensures the name of the given method name will be kept.
154      */
keepMethodName(Clazz clazz, Method method)155     private void keepMethodName(Clazz clazz, Method method)
156     {
157         String name = method.getName(clazz);
158 
159         if (!name.equals(ClassConstants.INTERNAL_METHOD_NAME_CLINIT) &&
160             !name.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT))
161         {
162             MemberObfuscator.setFixedNewMemberName(method,
163                                                    method.getName(clazz));
164         }
165     }
166 }
167