1*f1fbf3c2SXin Li import java.util.ArrayList; 2*f1fbf3c2SXin Li import java.util.List; 3*f1fbf3c2SXin Li import javassist.*; 4*f1fbf3c2SXin Li 5*f1fbf3c2SXin Li @SuppressWarnings("unused") 6*f1fbf3c2SXin Li class InvalidStackMapFrame { 7*f1fbf3c2SXin Li 8*f1fbf3c2SXin Li public void bytecodeVerifyError1() { 9*f1fbf3c2SXin Li String[] newLine = new String[10]; 10*f1fbf3c2SXin Li for (int i = 0; i < 5; i++) { 11*f1fbf3c2SXin Li String a = newLine[1]; 12*f1fbf3c2SXin Li newLine[4] = a; 13*f1fbf3c2SXin Li } 14*f1fbf3c2SXin Li } 15*f1fbf3c2SXin Li 16*f1fbf3c2SXin Li public void bytecodeVerifyError() { 17*f1fbf3c2SXin Li // javassist bug : invalid stack map frame 18*f1fbf3c2SXin Li List<Integer> test = new ArrayList<Integer>(); 19*f1fbf3c2SXin Li String[] newLine = new String[10]; 20*f1fbf3c2SXin Li for (Integer idx : test) { 21*f1fbf3c2SXin Li // invalid stackMapFrame 22*f1fbf3c2SXin Li // FRAME FULL [bug_regression_jdk7/javassist/InvalidStackMapFrame java/util/ArrayList java/lang/Object java/util/Iterator T T T I] [] 23*f1fbf3c2SXin Li // java/lang/Object is wrong -> [Ljava/lang/String; is correct 24*f1fbf3c2SXin Li String address = newLine[1]; 25*f1fbf3c2SXin Li int tabPos = -1; 26*f1fbf3c2SXin Li if (tabPos != -1) { 27*f1fbf3c2SXin Li address = address.substring(tabPos + 1); 28*f1fbf3c2SXin Li } 29*f1fbf3c2SXin Li newLine[4] = address; 30*f1fbf3c2SXin Li } 31*f1fbf3c2SXin Li 32*f1fbf3c2SXin Li } 33*f1fbf3c2SXin Li } 34*f1fbf3c2SXin Li 35*f1fbf3c2SXin Li public class Test { 36*f1fbf3c2SXin Li private static final String INVALID_STACK_MAP_FRAME = "InvalidStackMapFrame"; 37*f1fbf3c2SXin Li 38*f1fbf3c2SXin Li public static void main(String[] args) throws Exception { 39*f1fbf3c2SXin Li 40*f1fbf3c2SXin Li // CustomURLClassLoader classLoader = new CustomURLClassLoader(new URL[]{}, Thread.currentThread().getContextClassLoader()); 41*f1fbf3c2SXin Li 42*f1fbf3c2SXin Li ClassPool classPool = ClassPool.getDefault(); 43*f1fbf3c2SXin Li // classPool.appendClassPath(new LoaderClassPath(classLoader)); 44*f1fbf3c2SXin Li 45*f1fbf3c2SXin Li final CtClass ctClass = classPool.get(INVALID_STACK_MAP_FRAME); 46*f1fbf3c2SXin Li final CtMethod method = ctClass.getDeclaredMethod("bytecodeVerifyError"); 47*f1fbf3c2SXin Li method.addLocalVariable("test_localVariable", CtClass.intType); 48*f1fbf3c2SXin Li method.insertBefore("{ test_localVariable = 1; }"); 49*f1fbf3c2SXin Li ctClass.debugWriteFile(); 50*f1fbf3c2SXin Li Class<?> cc = ctClass.toClass(); 51*f1fbf3c2SXin Li System.out.println(cc.getName()); 52*f1fbf3c2SXin Li InvalidStackMapFrame obj = (InvalidStackMapFrame)cc.getDeclaredConstructor().newInstance(); 53*f1fbf3c2SXin Li obj.bytecodeVerifyError(); 54*f1fbf3c2SXin Li } 55*f1fbf3c2SXin Li } 56