1*f1fbf3c2SXin Li import javassist.CannotCompileException; 2*f1fbf3c2SXin Li import javassist.ClassPool; 3*f1fbf3c2SXin Li import javassist.CtClass; 4*f1fbf3c2SXin Li import javassist.CtMethod; 5*f1fbf3c2SXin Li import javassist.NotFoundException; 6*f1fbf3c2SXin Li import javassist.expr.ExprEditor; 7*f1fbf3c2SXin Li import javassist.expr.MethodCall; 8*f1fbf3c2SXin Li 9*f1fbf3c2SXin Li @SuppressWarnings("unused") 10*f1fbf3c2SXin Li public class Jassist150 { 11*f1fbf3c2SXin Li public static final String BASE_PATH = "./"; 12*f1fbf3c2SXin Li public static final String JAVASSIST_JAR = BASE_PATH + "javassist.jar"; 13*f1fbf3c2SXin Li public static final String CLASSES_FOLDER = BASE_PATH + "build/classes"; 14*f1fbf3c2SXin Li public static final String TEST_CLASSES_FOLDER = BASE_PATH 15*f1fbf3c2SXin Li + "build/test-classes"; 16*f1fbf3c2SXin Li 17*f1fbf3c2SXin Li public static class Inner1 { get()18*f1fbf3c2SXin Li public static int get() { 19*f1fbf3c2SXin Li return 0; 20*f1fbf3c2SXin Li } 21*f1fbf3c2SXin Li } 22*f1fbf3c2SXin Li implTestClassTailCache()23*f1fbf3c2SXin Li public static void implTestClassTailCache() throws NotFoundException, 24*f1fbf3c2SXin Li CannotCompileException { 25*f1fbf3c2SXin Li ClassPool pool = new ClassPool(true); 26*f1fbf3c2SXin Li for (int paths = 0; paths < 50; paths++) { 27*f1fbf3c2SXin Li pool.appendClassPath(JAVASSIST_JAR); 28*f1fbf3c2SXin Li pool.appendClassPath(CLASSES_FOLDER); 29*f1fbf3c2SXin Li pool.appendClassPath(TEST_CLASSES_FOLDER); 30*f1fbf3c2SXin Li } 31*f1fbf3c2SXin Li CtClass cc = pool.get("Jassist150$Inner1"); 32*f1fbf3c2SXin Li CtMethod ccGet = cc.getDeclaredMethod("get"); 33*f1fbf3c2SXin Li String code1 = "{ int n1 = Integer.valueOf(1); " 34*f1fbf3c2SXin Li + " int n2 = Integer.valueOf(2); " 35*f1fbf3c2SXin Li + " int n3 = Integer.valueOf(3); " 36*f1fbf3c2SXin Li + " int n4 = Integer.valueOf(4); " 37*f1fbf3c2SXin Li + " int n5 = Integer.valueOf(5); " 38*f1fbf3c2SXin Li + " return n1+n2+n3+n4+n5; }"; 39*f1fbf3c2SXin Li String code2 = "{ int n1 = java.lang.Integer.valueOf(1); " 40*f1fbf3c2SXin Li + " int n2 = java.lang.Integer.valueOf(2); " 41*f1fbf3c2SXin Li + " int n3 = java.lang.Integer.valueOf(3); " 42*f1fbf3c2SXin Li + " int n4 = java.lang.Integer.valueOf(4); " 43*f1fbf3c2SXin Li + " int n5 = java.lang.Integer.valueOf(5); " 44*f1fbf3c2SXin Li + " return n1+n2+n3+n4+n5; }"; 45*f1fbf3c2SXin Li String code3 = "{ int n1 = java.lang.Integer#valueOf(1); " 46*f1fbf3c2SXin Li + " int n2 = java.lang.Integer#valueOf(2); " 47*f1fbf3c2SXin Li + " int n3 = java.lang.Integer#valueOf(3); " 48*f1fbf3c2SXin Li + " int n4 = java.lang.Integer#valueOf(4); " 49*f1fbf3c2SXin Li + " int n5 = java.lang.Integer#valueOf(5); " 50*f1fbf3c2SXin Li + " return n1+n2+n3+n4+n5; }"; 51*f1fbf3c2SXin Li loop(cc, ccGet, code1); 52*f1fbf3c2SXin Li } 53*f1fbf3c2SXin Li loop(CtClass cc, CtMethod ccGet, String code)54*f1fbf3c2SXin Li public static void loop(CtClass cc, CtMethod ccGet, String code) 55*f1fbf3c2SXin Li throws CannotCompileException { 56*f1fbf3c2SXin Li long startTime = System.currentTimeMillis(); 57*f1fbf3c2SXin Li for (int replace = 0; replace < 1000; replace++) { 58*f1fbf3c2SXin Li ccGet.setBody(code); 59*f1fbf3c2SXin Li } 60*f1fbf3c2SXin Li long endTime = System.currentTimeMillis(); 61*f1fbf3c2SXin Li System.out.println("Test: Time (ms) " + (endTime - startTime)); 62*f1fbf3c2SXin Li } 63*f1fbf3c2SXin Li implTestClassTailCache2()64*f1fbf3c2SXin Li public static void implTestClassTailCache2() throws NotFoundException, 65*f1fbf3c2SXin Li CannotCompileException { 66*f1fbf3c2SXin Li ClassPool pool = new ClassPool(true); 67*f1fbf3c2SXin Li for (int paths = 0; paths < 50; paths++) { 68*f1fbf3c2SXin Li pool.appendClassPath(JAVASSIST_JAR); 69*f1fbf3c2SXin Li pool.appendClassPath(CLASSES_FOLDER); 70*f1fbf3c2SXin Li pool.appendClassPath(TEST_CLASSES_FOLDER); 71*f1fbf3c2SXin Li } 72*f1fbf3c2SXin Li CtClass cc = pool.get("Jassist150$Inner1"); 73*f1fbf3c2SXin Li CtMethod ccGet = cc.getDeclaredMethod("get"); 74*f1fbf3c2SXin Li String code3 = "{ int n1 = java.lang.Integer#valueOf(1); " 75*f1fbf3c2SXin Li + " int n2 = java.lang.Integer#valueOf(2); " 76*f1fbf3c2SXin Li + " int n3 = java.lang.Integer#valueOf(3); " 77*f1fbf3c2SXin Li + " int n4 = java.lang.Integer#valueOf(4); " 78*f1fbf3c2SXin Li + " int n5 = java.lang.Integer#valueOf(5); " 79*f1fbf3c2SXin Li + " return n1+n2+n3+n4+n5; }"; 80*f1fbf3c2SXin Li ccGet.setBody(code3); 81*f1fbf3c2SXin Li } 82*f1fbf3c2SXin Li testJIRA152()83*f1fbf3c2SXin Li public void testJIRA152() throws Exception { 84*f1fbf3c2SXin Li CtClass cc = ClassPool.getDefault().get("test4.JIRA152"); 85*f1fbf3c2SXin Li CtMethod mth = cc.getDeclaredMethod("buildColumnOverride"); 86*f1fbf3c2SXin Li mth.instrument(new ExprEditor() { 87*f1fbf3c2SXin Li public void edit(MethodCall c) throws CannotCompileException { 88*f1fbf3c2SXin Li c.replace("try{ $_ = $proceed($$); } catch (Throwable t) { throw t; }"); 89*f1fbf3c2SXin Li } 90*f1fbf3c2SXin Li }); 91*f1fbf3c2SXin Li mth.getMethodInfo().rebuildStackMap(ClassPool.getDefault()); 92*f1fbf3c2SXin Li cc.writeFile(); 93*f1fbf3c2SXin Li } 94*f1fbf3c2SXin Li main(String[] args)95*f1fbf3c2SXin Li public static void main(String[] args) throws Exception { 96*f1fbf3c2SXin Li new Jassist150().testJIRA152(); 97*f1fbf3c2SXin Li } 98*f1fbf3c2SXin Li main2(String[] args)99*f1fbf3c2SXin Li public static void main2(String[] args) { 100*f1fbf3c2SXin Li for (int loop = 0; loop < 5; loop++) { 101*f1fbf3c2SXin Li try { 102*f1fbf3c2SXin Li implTestClassTailCache(); 103*f1fbf3c2SXin Li for (int i = 0; i < 100; i++) 104*f1fbf3c2SXin Li implTestClassTailCache2(); 105*f1fbf3c2SXin Li } catch (Exception e) { 106*f1fbf3c2SXin Li e.printStackTrace(); 107*f1fbf3c2SXin Li } 108*f1fbf3c2SXin Li } 109*f1fbf3c2SXin Li System.out.println("size: " + javassist.compiler.MemberResolver.getInvalidMapSize()); 110*f1fbf3c2SXin Li } 111*f1fbf3c2SXin Li } 112