You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

InsertGap0.java 6.0KB

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