KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > proguard > optimize > ChangedCodePrinter


1 /*
2  * ProGuard -- shrinking, optimization, obfuscation, and preverification
3  * of Java bytecode.
4  *
5  * Copyright (c) 2002-2007 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.optimize;
22
23 import proguard.classfile.*;
24 import proguard.classfile.attribute.*;
25 import proguard.classfile.attribute.annotation.*;
26 import proguard.classfile.attribute.preverification.*;
27 import proguard.classfile.attribute.visitor.AttributeVisitor;
28 import proguard.classfile.util.ClassUtil;
29
30 /**
31  * This AttributeVisitor delegates its call to another AttributeVisitor, and
32  * prints out the code if the other visitor has changed it.
33  *
34  * @author Eric Lafortune
35  */

36 public class ChangedCodePrinter
37 implements AttributeVisitor
38 {
39     private AttributeVisitor attributeVisitor;
40
41
42     public ChangedCodePrinter(AttributeVisitor attributeVisitor)
43     {
44         this.attributeVisitor = attributeVisitor;
45     }
46
47
48     // Implementations for AttributeVisitor.
49

50
51     public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute)
52     {
53         attributeVisitor.visitUnknownAttribute(clazz, unknownAttribute);
54     }
55
56
57     public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute)
58     {
59         attributeVisitor.visitSourceFileAttribute(clazz, sourceFileAttribute);
60     }
61
62
63     public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute)
64     {
65         attributeVisitor.visitSourceDirAttribute(clazz, sourceDirAttribute);
66     }
67
68
69     public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute)
70     {
71         attributeVisitor.visitInnerClassesAttribute(clazz, innerClassesAttribute);
72     }
73
74
75     public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute)
76     {
77         attributeVisitor.visitEnclosingMethodAttribute(clazz, enclosingMethodAttribute);
78     }
79
80
81     public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute)
82     {
83         attributeVisitor.visitDeprecatedAttribute(clazz, deprecatedAttribute);
84     }
85
86
87     public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute)
88     {
89         attributeVisitor.visitSyntheticAttribute(clazz, syntheticAttribute);
90     }
91
92
93     public void visitSignatureAttribute(Clazz clazz, SignatureAttribute syntheticAttribute)
94     {
95         attributeVisitor.visitSignatureAttribute(clazz, syntheticAttribute);
96     }
97
98
99     public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute)
100     {
101         attributeVisitor.visitDeprecatedAttribute(clazz, field, deprecatedAttribute);
102     }
103
104
105     public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute)
106     {
107         attributeVisitor.visitSyntheticAttribute(clazz, field, syntheticAttribute);
108     }
109
110
111     public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute syntheticAttribute)
112     {
113         attributeVisitor.visitSignatureAttribute(clazz, field, syntheticAttribute);
114     }
115
116
117     public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute)
118     {
119         attributeVisitor.visitDeprecatedAttribute(clazz, method, deprecatedAttribute);
120     }
121
122
123     public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute)
124     {
125         attributeVisitor.visitSyntheticAttribute(clazz, method, syntheticAttribute);
126     }
127
128
129     public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute syntheticAttribute)
130     {
131         attributeVisitor.visitSignatureAttribute(clazz, method, syntheticAttribute);
132     }
133
134
135     public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute)
136     {
137         attributeVisitor.visitConstantValueAttribute(clazz, field, constantValueAttribute);
138     }
139
140
141     public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute)
142     {
143         attributeVisitor.visitExceptionsAttribute(clazz, method, exceptionsAttribute);
144     }
145
146
147     public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute)
148     {
149         attributeVisitor.visitStackMapAttribute(clazz, method, codeAttribute, stackMapAttribute);
150     }
151
152
153     public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute)
154     {
155         attributeVisitor.visitStackMapTableAttribute(clazz, method, codeAttribute, stackMapTableAttribute);
156     }
157
158
159     public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute)
160     {
161         attributeVisitor.visitLineNumberTableAttribute(clazz, method, codeAttribute, lineNumberTableAttribute);
162     }
163
164
165     public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute)
166     {
167         attributeVisitor.visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute);
168     }
169
170
171     public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute)
172     {
173         attributeVisitor.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute);
174     }
175
176
177     public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
178     {
179         attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute);
180     }
181
182
183     public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
184     {
185         attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute);
186     }
187
188
189     public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
190     {
191         attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, field, runtimeVisibleAnnotationsAttribute);
192     }
193
194
195     public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
196     {
197         attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, field, runtimeInvisibleAnnotationsAttribute);
198     }
199
200
201     public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
202     {
203         attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, method, runtimeVisibleAnnotationsAttribute);
204     }
205
206
207     public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
208     {
209         attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, method, runtimeInvisibleAnnotationsAttribute);
210     }
211
212
213     public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute)
214     {
215         attributeVisitor.visitRuntimeVisibleParameterAnnotationsAttribute(clazz, method, runtimeVisibleParameterAnnotationsAttribute);
216     }
217
218
219     public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute)
220     {
221         attributeVisitor.visitRuntimeInvisibleParameterAnnotationsAttribute(clazz, method, runtimeInvisibleParameterAnnotationsAttribute);
222     }
223
224
225     public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
226     {
227         attributeVisitor.visitAnnotationDefaultAttribute(clazz, method, annotationDefaultAttribute);
228     }
229
230
231     public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
232     {
233         byte[] code = codeAttribute.code;
234         byte[] oldCode = new byte[code.length];
235
236         // Copy the current code.
237
for (int index = 0; index < codeAttribute.u4codeLength; index++)
238         {
239             oldCode[index] = code[index];
240         }
241
242         // Delegate to the real visitor.
243
attributeVisitor.visitCodeAttribute(clazz, method, codeAttribute);
244
245         // Check if the code has changed.
246
if (codeHasChanged(codeAttribute, oldCode))
247         {
248             printChangedCode(clazz, method, codeAttribute, oldCode);
249         }
250     }
251
252
253     // Small utility methods.
254

255     private boolean codeHasChanged(CodeAttribute codeAttribute, byte[] oldCode)
256     {
257         if (oldCode.length != codeAttribute.u4codeLength)
258         {
259             return true;
260         }
261
262         for (int index = 0; index < codeAttribute.u4codeLength; index++)
263         {
264             if (oldCode[index] != codeAttribute.code[index])
265             {
266                 return true;
267             }
268         }
269
270         return false;
271     }
272
273
274     private void printChangedCode(Clazz clazz,
275                                   Method method,
276                                   CodeAttribute codeAttribute,
277                                   byte[] oldCode)
278     {
279         System.out.println("Class "+ClassUtil.externalClassName(clazz.getName()));
280         System.out.println("Method "+ClassUtil.externalFullMethodDescription(clazz.getName(),
281                                                                              0,
282                                                                              method.getName(clazz),
283                                                                              method.getDescriptor(clazz)));
284
285         for (int index = 0; index < codeAttribute.u4codeLength; index++)
286         {
287             System.out.println(
288                 (oldCode[index] == codeAttribute.code[index]? " -- ":" => ")+
289                 index+": "+
290                 Integer.toHexString(0x100|oldCode[index] &0xff).substring(1)+" "+
291                 Integer.toHexString(0x100|codeAttribute.code[index]&0xff).substring(1));
292         }
293     }
294 }
295
Popular Tags