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