package javassist.bytecode;
import javassist.*;
final class Gap0Example {
public static int counter = 1;
public Gap0Example() {}
public int run(int x) { return counter; }
private static final int INTVALUE = 100000;
private int i1, i2, i3, i4, i5, i6, i7, i8, i9, i10;
private int i11, i12, i13, i14, i15, i16, i17, i18, i19, i20;
private int i21, i22, i23, i24, i25, i26, i27, i28, i29, i30;
private int i31, i32, i33, i34, i35, i36, i37, i38, i39, i40;
public void doit() {
i1 = INTVALUE;
i2 = INTVALUE;
i3 = INTVALUE;
i4 = INTVALUE;
i5 = INTVALUE;
i6 = INTVALUE;
i7 = INTVALUE;
i8 = INTVALUE;
i9 = INTVALUE;
i10 = INTVALUE;
i11 = INTVALUE;
i12 = INTVALUE;
i13 = INTVALUE;
i14 = INTVALUE;
i15 = INTVALUE;
i16 = INTVALUE;
i17 = INTVALUE;
i18 = INTVALUE;
i19 = INTVALUE;
i20 = INTVALUE;
i21 = INTVALUE;
i22 = INTVALUE;
i23 = INTVALUE;
i24 = INTVALUE;
i25 = INTVALUE;
i26 = INTVALUE;
i27 = INTVALUE;
i28 = INTVALUE;
i29 = INTVALUE;
i20 = INTVALUE;
i21 = INTVALUE;
i22 = INTVALUE;
i23 = INTVALUE;
i24 = INTVALUE;
i25 = INTVALUE;
i26 = INTVALUE;
i27 = INTVALUE;
i28 = INTVALUE;
i29 = INTVALUE;
i30 = INTVALUE;
i31 = INTVALUE;
i32 = INTVALUE;
i33 = INTVALUE;
i34 = INTVALUE;
i35 = INTVALUE;
i36 = INTVALUE;
i37 = INTVALUE;
i38 = INTVALUE;
i39 = INTVALUE;
i40 = INTVALUE;
}
}
final class Gap0Example2 {
public static int counter = 1;
public Gap0Example2() {}
public int run(int x) { return counter; }
private static final int INTVALUE = 100000;
private int i1, i2, i3, i4, i5, i6, i7, i8, i9, i10;
private int i11, i12, i13, i14, i15, i16, i17, i18, i19, i20;
private int i21, i22, i23, i24, i25, i26, i27, i28, i29, i30;
private int i31, i32, i33, i34, i35, i36, i37, i38, i39, i40;
public int run2(int x) {
switch (x) {
case 0:
i1 = INTVALUE;
i2 = INTVALUE;
i3 = INTVALUE;
i4 = INTVALUE;
i5 = INTVALUE;
i6 = INTVALUE;
i7 = INTVALUE;
break;
case 100:
i8 = INTVALUE;
i9 = INTVALUE;
i10 = INTVALUE;
i11 = INTVALUE;
i12 = INTVALUE;
i13 = INTVALUE;
i14 = INTVALUE;
break;
default:
i15 = INTVALUE;
i16 = INTVALUE;
i17 = INTVALUE;
if (x > 0) {
i18 = INTVALUE;
i19 = INTVALUE;
i20 = INTVALUE;
i21 = INTVALUE;
i22 = INTVALUE;
i23 = INTVALUE;
i24 = INTVALUE;
}
i25 = INTVALUE;
i26 = INTVALUE;
i27 = INTVALUE;
i28 = INTVALUE;
i29 = INTVALUE;
i20 = INTVALUE;
i21 = INTVALUE;
i22 = INTVALUE;
i23 = INTVALUE;
i24 = INTVALUE;
i25 = INTVALUE;
i26 = INTVALUE;
i27 = INTVALUE;
i28 = INTVALUE;
i29 = INTVALUE;
i30 = INTVALUE;
i31 = INTVALUE;
i32 = INTVALUE;
i33 = INTVALUE;
i34 = INTVALUE;
i35 = INTVALUE;
i36 = INTVALUE;
i37 = INTVALUE;
i38 = INTVALUE;
i39 = INTVALUE;
i40 = INTVALUE;
break;
}
switch (x) {
case 0:
break;
default:
return x + 1;
}
return x;
}
}
public final class InsertGap0 extends JvstTestRoot {
public InsertGap0(String name) {
super(name);
}
public void testExample() throws Throwable {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("javassist.bytecode.Gap0Example");
CtMethod[] ms = cc.getDeclaredMethods();
for (int i = 0; i < ms.length; i++) {
addMethod(ms[i], cc);
}
cc.setModifiers(Modifier.PUBLIC | Modifier.FINAL);
cc.addField(new CtField(CtClass.intType, "i", cc), "++counter");
boolean p = cc.stopPruning(true);
cc.writeFile();
Class c = cc.toClass();
cc.stopPruning(p);
Object obj = c.getConstructor().newInstance();
assertEquals(2, invoke(obj, "run", 0));
}
public void testExample2() throws Throwable {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("javassist.bytecode.Gap0Example2");
CtMethod[] ms = cc.getDeclaredMethods();
for (int i = 0; i < ms.length; i++) {
addMethod(ms[i], cc);
}
cc.setModifiers(Modifier.PUBLIC | Modifier.FINAL);
cc.addField(new CtField(CtClass.intType, "i", cc), "++counter");
boolean p = cc.stopPruning(true);
cc.writeFile();
Class c = cc.toClass();
cc.stopPruning(p);
Object obj = c.getConstructor().newInstance();
assertEquals(0, invoke(obj, "run2", 0));
}
private void addMethod(CtMethod method, CtClass target)
throws CannotCompileException, NotFoundException {
CtClass[] ts = method.getParameterTypes();
CtClass[] newts = new CtClass[ts.length + 1];
for (int i = 0; i < ts.length; i++) {
newts[i] = ts[i];
}
ClassPool p = method.getDeclaringClass().getClassPool();
newts[ts.length] = target;
CtMethod m =
CtNewMethod.make(
method.getModifiers(),
method.getReturnType(),
method.getName(),
newts,
method.getExceptionTypes(),
null,
method.getDeclaringClass());
m.setBody(method, null);
CodeAttribute ca = m.getMethodInfo().getCodeAttribute();
ca.setMaxLocals(ca.getMaxLocals() + 1);
target.addMethod(m);
}
}