KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > jode > obfuscator > ConstantRuntimeEnvironment


1 /* ConstantRuntimeEnvironment Copyright (C) 1999-2002 Jochen Hoenicke.
2  *
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License as published by
5  * the Free Software Foundation; either version 2, or (at your option)
6  * any later version.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; see the file COPYING. If not, write to
15  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
16  *
17  * $Id: ConstantRuntimeEnvironment.java.in,v 1.2.2.2 2002/05/28 17:34:14 hoenicke Exp $
18  */

19
20 package jode.obfuscator;
21 import jode.jvm.Interpreter;
22 import jode.jvm.SimpleRuntimeEnvironment;
23 import jode.jvm.InterpreterException;
24 import jode.bytecode.Reference;
25 import jode.bytecode.BytecodeInfo;
26 import jode.bytecode.TypeSignature;
27 import java.lang.reflect.Array JavaDoc;
28 import java.lang.reflect.InvocationTargetException JavaDoc;
29
30 import java.util.Set JavaDoc;
31 import java.util.HashSet JavaDoc;
32
33 public class ConstantRuntimeEnvironment extends SimpleRuntimeEnvironment {
34
35     /**
36      * The references that may be used in constant methods.
37      */

38     static Set JavaDoc whiteList = new HashSet JavaDoc();
39
40     static void addWhite(Reference ref) {
41     whiteList.add(ref);
42     }
43
44     public static boolean isWhite(Reference ref) {
45     return whiteList.contains(ref);
46     }
47
48     public static boolean isWhite(String JavaDoc retTypeSig) {
49     return retTypeSig.length() == 1 // primitive type
50
|| whiteList.contains(retTypeSig);
51     }
52
53     static {
54     addWhite(Reference.getReference
55          ("Ljava/lang/String;", "toCharArray", "()[C"));
56     addWhite(Reference.getReference
57          ("Ljava/lang/StringBuffer;", "<init>",
58           "(Ljava/lang/String;)V"));
59     addWhite(Reference.getReference
60          ("Ljava/lang/StringBuffer;", "<init>", "()V"));
61     addWhite(Reference.getReference
62          ("Ljava/lang/StringBuffer;", "append",
63           "(Ljava/lang/String;)Ljava/lang/StringBuffer;"));
64     addWhite(Reference.getReference
65          ("Ljava/lang/StringBuffer;", "append",
66           "(C)Ljava/lang/StringBuffer;"));
67     addWhite(Reference.getReference
68          ("Ljava/lang/StringBuffer;", "append",
69           "(B)Ljava/lang/StringBuffer;"));
70     addWhite(Reference.getReference
71          ("Ljava/lang/StringBuffer;", "append",
72           "(S)Ljava/lang/StringBuffer;"));
73     addWhite(Reference.getReference
74          ("Ljava/lang/StringBuffer;", "append",
75           "(Z)Ljava/lang/StringBuffer;"));
76     addWhite(Reference.getReference
77          ("Ljava/lang/StringBuffer;", "append",
78           "(F)Ljava/lang/StringBuffer;"));
79     addWhite(Reference.getReference
80          ("Ljava/lang/StringBuffer;", "append",
81           "(I)Ljava/lang/StringBuffer;"));
82     addWhite(Reference.getReference
83          ("Ljava/lang/StringBuffer;", "append",
84           "(J)Ljava/lang/StringBuffer;"));
85     addWhite(Reference.getReference
86          ("Ljava/lang/StringBuffer;", "append",
87           "(D)Ljava/lang/StringBuffer;"));
88     addWhite(Reference.getReference
89          ("Ljava/lang/StringBuffer;", "toString",
90           "()Ljava/lang/String;"));
91     addWhite(Reference.getReference
92          ("Ljava/lang/String;", "<init>", "()V"));
93     addWhite(Reference.getReference
94          ("Ljava/lang/String;", "<init>", "([C)V"));
95     addWhite(Reference.getReference
96          ("Ljava/lang/String;", "<init>", "([CII)V"));
97     addWhite(Reference.getReference
98          ("Ljava/lang/String;", "<init>",
99           "(Ljava/lang/String;)V"));
100     addWhite(Reference.getReference
101          ("Ljava/lang/String;", "<init>",
102           "(Ljava/lang/StringBuffer;)V"));
103     addWhite(Reference.getReference
104          ("Ljava/lang/String;", "length", "()I"));
105     addWhite(Reference.getReference
106          ("Ljava/lang/String;", "replace",
107           "(CC)Ljava/lang/String;"));
108     addWhite(Reference.getReference
109          ("Ljava/lang/String;", "valueOf",
110           "(Z)Ljava/lang/String;"));
111     addWhite(Reference.getReference
112          ("Ljava/lang/String;", "valueOf",
113           "(B)Ljava/lang/String;"));
114     addWhite(Reference.getReference
115          ("Ljava/lang/String;", "valueOf",
116           "(S)Ljava/lang/String;"));
117     addWhite(Reference.getReference
118          ("Ljava/lang/String;", "valueOf",
119           "(C)Ljava/lang/String;"));
120     addWhite(Reference.getReference
121          ("Ljava/lang/String;", "valueOf",
122           "(D)Ljava/lang/String;"));
123     addWhite(Reference.getReference
124          ("Ljava/lang/String;", "valueOf",
125           "(F)Ljava/lang/String;"));
126     addWhite(Reference.getReference
127          ("Ljava/lang/String;", "valueOf",
128           "(I)Ljava/lang/String;"));
129     addWhite(Reference.getReference
130          ("Ljava/lang/String;", "valueOf",
131           "(J)Ljava/lang/String;"));
132     addWhite(Reference.getReference
133          ("Ljava/lang/String;", "valueOf",
134           "(Ljava/lang/Object;)Ljava/lang/String;"));
135     addWhite(Reference.getReference
136          ("Ljava/lang/String;", "substring",
137           "(I)Ljava/lang/String;"));
138     addWhite(Reference.getReference
139          ("Ljava/lang/String;", "substring",
140           "(II)Ljava/lang/String;"));
141     addWhite(Reference.getReference
142          ("Ljava.lang/reflect/Modifier;", "toString",
143           "(I)Ljava/lang/String;"));
144     addWhite(Reference.getReference
145          ("Ljava/lang/Math;", "abs", "(D)D"));
146     addWhite(Reference.getReference
147          ("Ljava/lang/Math;", "abs", "(F)F"));
148     addWhite(Reference.getReference
149          ("Ljava/lang/Math;", "abs", "(I)I"));
150     addWhite(Reference.getReference
151          ("Ljava/lang/Math;", "abs", "(J)J"));
152     addWhite(Reference.getReference
153          ("Ljava/lang/Math;", "acos", "(D)D"));
154     addWhite(Reference.getReference
155          ("Ljava/lang/Math;", "asin", "(D)D"));
156     addWhite(Reference.getReference
157          ("Ljava/lang/Math;", "atan", "(D)D"));
158     addWhite(Reference.getReference
159          ("Ljava/lang/Math;", "atan2", "(D)D"));
160     addWhite(Reference.getReference
161          ("Ljava/lang/Math;", "ceil", "(D)D"));
162     addWhite(Reference.getReference
163          ("Ljava/lang/Math;", "cos", "(D)D"));
164     addWhite(Reference.getReference
165          ("Ljava/lang/Math;", "exp", "(D)D"));
166     addWhite(Reference.getReference
167          ("Ljava/lang/Math;", "floor", "(D)D"));
168     addWhite(Reference.getReference
169          ("Ljava/lang/Math;", "IEEEremainder", "(DD)D"));
170     addWhite(Reference.getReference
171          ("Ljava/lang/Math;", "log", "(D)D"));
172     addWhite(Reference.getReference
173          ("Ljava/lang/Math;", "max", "(DD)D"));
174     addWhite(Reference.getReference
175          ("Ljava/lang/Math;", "max", "(FF)F"));
176     addWhite(Reference.getReference
177          ("Ljava/lang/Math;", "max", "(II)I"));
178     addWhite(Reference.getReference
179          ("Ljava/lang/Math;", "max", "(JJ)J"));
180     addWhite(Reference.getReference
181          ("Ljava/lang/Math;", "min", "(DD)D"));
182     addWhite(Reference.getReference
183          ("Ljava/lang/Math;", "min", "(FF)F"));
184     addWhite(Reference.getReference
185          ("Ljava/lang/Math;", "min", "(II)I"));
186     addWhite(Reference.getReference
187          ("Ljava/lang/Math;", "min", "(JJ)J"));
188     addWhite(Reference.getReference
189          ("Ljava/lang/Math;", "pow", "(DD)D"));
190     addWhite(Reference.getReference
191          ("Ljava/lang/Math;", "rint", "(D)D"));
192     addWhite(Reference.getReference
193          ("Ljava/lang/Math;", "round", "(D)J"));
194     addWhite(Reference.getReference
195          ("Ljava/lang/Math;", "round", "(F)I"));
196     addWhite(Reference.getReference
197          ("Ljava/lang/Math;", "sin", "(D)D"));
198     addWhite(Reference.getReference
199          ("Ljava/lang/Math;", "sqrt", "(D)D"));
200     addWhite(Reference.getReference
201          ("Ljava/lang/Math;", "tan", "(D)D"));
202     addWhite(Reference.getReference
203          ("Ljava/lang/Math;", "toDegrees", "(D)D"));
204     addWhite(Reference.getReference
205          ("Ljava/lang/Math;", "toRadians", "(D)D"));
206     addWhite(Reference.getReference
207          ("Ljava/lang/Math;", "E", "D"));
208     addWhite(Reference.getReference
209          ("Ljava/lang/Math;", "PI", "D"));
210
211     whiteList.add("Ljava/lang/String;");
212 // whiteList.add("Ljava/lang/Class;");
213
// whiteList.add("Ljava/lang/reflect/Method;");
214
// whiteList.add("Ljava/lang/reflect/Field;");
215
}
216
217     private Interpreter interpreter;
218     private Identifier currentFieldListener;
219     
220     public ConstantRuntimeEnvironment() {
221     interpreter = new Interpreter(this);
222     }
223
224     public void setFieldListener(Identifier fl) {
225     currentFieldListener = fl;
226     }
227
228     public static Object JavaDoc getDefaultValue(String JavaDoc typeSig) {
229     switch(typeSig.charAt(0)) {
230     case 'Z':
231     case 'B':
232     case 'S':
233     case 'C':
234     case 'I':
235         return new Integer JavaDoc(0);
236     case 'J':
237         return new Long JavaDoc(0L);
238     case 'D':
239         return new Double JavaDoc(0.0);
240     case 'F':
241         return new Float JavaDoc(0.0F);
242     default:
243         return null;
244     }
245     }
246
247     public Object JavaDoc getField(Reference ref, Object JavaDoc obj)
248     throws InterpreterException {
249     if (isWhite(ref))
250         return super.getField(ref, obj);
251     FieldIdentifier fi
252         = (FieldIdentifier) Main.getClassBundle().getIdentifier(ref);
253     if (fi != null && !fi.isNotConstant()) {
254         Object JavaDoc result = fi.getConstant();
255         if (currentFieldListener != null)
256         fi.addFieldListener(currentFieldListener);
257         if (result == null)
258         result = getDefaultValue(ref.getType());
259         return result;
260     }
261     throw new InterpreterException("Field " + ref + " not constant");
262     }
263
264     public void putField(Reference ref, Object JavaDoc obj, Object JavaDoc value)
265     throws InterpreterException {
266     throw new InterpreterException("Modifying Field " + ref + ".");
267     }
268     
269     public Object JavaDoc invokeConstructor(Reference ref, Object JavaDoc[] params)
270     throws InterpreterException, InvocationTargetException JavaDoc {
271     if (isWhite(ref))
272         return super.invokeConstructor(ref, params);
273     throw new InterpreterException("Creating new Object " + ref + ".");
274     }
275     
276     public Object JavaDoc invokeMethod(Reference ref, boolean isVirtual,
277                    Object JavaDoc cls, Object JavaDoc[] params)
278     throws InterpreterException, InvocationTargetException JavaDoc {
279     if (isWhite(ref))
280         return super.invokeMethod(ref, isVirtual, cls, params);
281     MethodIdentifier mi
282         = (MethodIdentifier) Main.getClassBundle().getIdentifier(ref);
283     if (mi != null) {
284         BytecodeInfo code = mi.info.getBytecode();
285         if (code != null)
286         return interpreter.interpretMethod(code, cls, params);
287     }
288     throw new InterpreterException("Invoking library method " + ref + ".");
289     }
290     
291     public boolean instanceOf(Object JavaDoc obj, String JavaDoc className)
292     throws InterpreterException {
293     Class JavaDoc clazz;
294     try {
295         clazz = Class.forName(className);
296     } catch (ClassNotFoundException JavaDoc ex) {
297         throw new InterpreterException
298         ("Class "+ex.getMessage()+" not found");
299     }
300     return obj != null && clazz.isInstance(obj);
301     }
302
303     public Object JavaDoc newArray(String JavaDoc type, int[] dimensions)
304     throws InterpreterException, NegativeArraySizeException JavaDoc {
305     if (type.length() == dimensions.length + 1) {
306         Class JavaDoc clazz;
307         try {
308         clazz = TypeSignature
309             .getClass(type.substring(dimensions.length));
310         } catch (ClassNotFoundException JavaDoc ex) {
311         throw new InterpreterException
312             ("Class "+ex.getMessage()+" not found");
313         }
314         return Array.newInstance(clazz, dimensions);
315     }
316     throw new InterpreterException("Creating object array.");
317     }
318 }
319
Popular Tags