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