• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package javassist.bytecode;
2 
3 import javassist.*;
4 
5 @SuppressWarnings("unused")
6 final class Gap0Example {
7     public static int counter = 1;
8 
Gap0Example()9     public Gap0Example() {}
10 
run(int x)11     public int run(int x) { return counter; }
12 
13     private static final int INTVALUE = 100000;
14     private int i1, i2, i3, i4, i5, i6, i7, i8, i9, i10;
15     private int i11, i12, i13, i14, i15, i16, i17, i18, i19, i20;
16     private int i21, i22, i23, i24, i25, i26, i27, i28, i29, i30;
17     private int i31, i32, i33, i34, i35, i36, i37, i38, i39, i40;
18 
doit()19     public void doit() {
20 
21         i1 = INTVALUE;
22         i2 = INTVALUE;
23         i3 = INTVALUE;
24         i4 = INTVALUE;
25         i5 = INTVALUE;
26         i6 = INTVALUE;
27         i7 = INTVALUE;
28         i8 = INTVALUE;
29         i9 = INTVALUE;
30         i10 = INTVALUE;
31         i11 = INTVALUE;
32         i12 = INTVALUE;
33         i13 = INTVALUE;
34         i14 = INTVALUE;
35         i15 = INTVALUE;
36         i16 = INTVALUE;
37         i17 = INTVALUE;
38         i18 = INTVALUE;
39         i19 = INTVALUE;
40         i20 = INTVALUE;
41         i21 = INTVALUE;
42         i22 = INTVALUE;
43         i23 = INTVALUE;
44         i24 = INTVALUE;
45         i25 = INTVALUE;
46         i26 = INTVALUE;
47         i27 = INTVALUE;
48         i28 = INTVALUE;
49         i29 = INTVALUE;
50         i20 = INTVALUE;
51         i21 = INTVALUE;
52         i22 = INTVALUE;
53         i23 = INTVALUE;
54         i24 = INTVALUE;
55         i25 = INTVALUE;
56         i26 = INTVALUE;
57         i27 = INTVALUE;
58         i28 = INTVALUE;
59         i29 = INTVALUE;
60         i30 = INTVALUE;
61         i31 = INTVALUE;
62         i32 = INTVALUE;
63         i33 = INTVALUE;
64         i34 = INTVALUE;
65         i35 = INTVALUE;
66         i36 = INTVALUE;
67         i37 = INTVALUE;
68         i38 = INTVALUE;
69         i39 = INTVALUE;
70         i40 = INTVALUE;
71     }
72 }
73 
74 @SuppressWarnings("unused")
75 final class Gap0Example2 {
76     public static int counter = 1;
77 
Gap0Example2()78     public Gap0Example2() {}
79 
run(int x)80     public int run(int x) { return counter; }
81 
82     private static final int INTVALUE = 100000;
83     private int i1, i2, i3, i4, i5, i6, i7, i8, i9, i10;
84     private int i11, i12, i13, i14, i15, i16, i17, i18, i19, i20;
85     private int i21, i22, i23, i24, i25, i26, i27, i28, i29, i30;
86     private int i31, i32, i33, i34, i35, i36, i37, i38, i39, i40;
87 
run2(int x)88     public int run2(int x) {
89         switch (x) {
90         case 0:
91         i1 = INTVALUE;
92         i2 = INTVALUE;
93         i3 = INTVALUE;
94         i4 = INTVALUE;
95         i5 = INTVALUE;
96         i6 = INTVALUE;
97         i7 = INTVALUE;
98         break;
99         case 100:
100         i8 = INTVALUE;
101         i9 = INTVALUE;
102         i10 = INTVALUE;
103         i11 = INTVALUE;
104         i12 = INTVALUE;
105         i13 = INTVALUE;
106         i14 = INTVALUE;
107         break;
108         default:
109         i15 = INTVALUE;
110         i16 = INTVALUE;
111         i17 = INTVALUE;
112         if (x > 0) {
113         i18 = INTVALUE;
114         i19 = INTVALUE;
115         i20 = INTVALUE;
116         i21 = INTVALUE;
117         i22 = INTVALUE;
118         i23 = INTVALUE;
119         i24 = INTVALUE;
120         }
121         i25 = INTVALUE;
122         i26 = INTVALUE;
123         i27 = INTVALUE;
124         i28 = INTVALUE;
125         i29 = INTVALUE;
126         i20 = INTVALUE;
127         i21 = INTVALUE;
128         i22 = INTVALUE;
129         i23 = INTVALUE;
130         i24 = INTVALUE;
131         i25 = INTVALUE;
132         i26 = INTVALUE;
133         i27 = INTVALUE;
134         i28 = INTVALUE;
135         i29 = INTVALUE;
136         i30 = INTVALUE;
137         i31 = INTVALUE;
138         i32 = INTVALUE;
139         i33 = INTVALUE;
140         i34 = INTVALUE;
141         i35 = INTVALUE;
142         i36 = INTVALUE;
143         i37 = INTVALUE;
144         i38 = INTVALUE;
145         i39 = INTVALUE;
146         i40 = INTVALUE;
147         break;
148         }
149         switch (x) {
150         case 0:
151             break;
152         default:
153             return x + 1;
154         }
155 
156         return x;
157     }
158 }
159 
160 @SuppressWarnings({"rawtypes","unchecked","unused"})
161 public final class InsertGap0 extends JvstTestRoot {
InsertGap0(String name)162     public InsertGap0(String name) {
163         super(name);
164     }
165 
testExample()166     public void testExample() throws Throwable {
167         ClassPool pool = ClassPool.getDefault();
168         CtClass cc = pool.get("javassist.bytecode.Gap0Example");
169         CtMethod[] ms = cc.getDeclaredMethods();
170         for (int i = 0; i < ms.length; i++) {
171             addMethod(ms[i], cc);
172         }
173 
174         cc.setModifiers(Modifier.PUBLIC | Modifier.FINAL);
175         cc.addField(new CtField(CtClass.intType, "i", cc), "++counter");
176         boolean p = cc.stopPruning(true);
177         cc.writeFile();
178         Class c = cc.toClass(ClassFile.class);
179         cc.stopPruning(p);
180 
181         Object obj = c.getConstructor().newInstance();
182         assertEquals(2, invoke(obj, "run", 0));
183     }
184 
testExample2()185     public void testExample2() throws Throwable {
186         ClassPool pool = ClassPool.getDefault();
187         CtClass cc = pool.get("javassist.bytecode.Gap0Example2");
188         CtMethod[] ms = cc.getDeclaredMethods();
189         for (int i = 0; i < ms.length; i++) {
190             addMethod(ms[i], cc);
191         }
192 
193         cc.setModifiers(Modifier.PUBLIC | Modifier.FINAL);
194         cc.addField(new CtField(CtClass.intType, "i", cc), "++counter");
195         boolean p = cc.stopPruning(true);
196         cc.writeFile();
197         Class c = cc.toClass(ClassFile.class);
198         cc.stopPruning(p);
199 
200         Object obj = c.getConstructor().newInstance();
201         assertEquals(0, invoke(obj, "run2", 0));
202     }
203 
addMethod(CtMethod method, CtClass target)204     private void addMethod(CtMethod method, CtClass target)
205         throws CannotCompileException, NotFoundException {
206 
207         CtClass[] ts = method.getParameterTypes();
208         CtClass[] newts = new CtClass[ts.length + 1];
209         for (int i = 0; i < ts.length; i++) {
210             newts[i] = ts[i];
211         }
212         ClassPool p = method.getDeclaringClass().getClassPool();
213         newts[ts.length] = target;
214 
215         CtMethod m =
216             CtNewMethod.make(
217                 method.getModifiers(),
218                 method.getReturnType(),
219                 method.getName(),
220                 newts,
221                 method.getExceptionTypes(),
222                 null,
223                 method.getDeclaringClass());
224 
225         m.setBody(method, null);
226 
227         CodeAttribute ca = m.getMethodInfo().getCodeAttribute();
228         ca.setMaxLocals(ca.getMaxLocals() + 1);
229         target.addMethod(m);
230     }
231 }
232