1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19 package org.apache.bcel; 20 21 import org.apache.bcel.classfile.JavaClass; 22 import org.apache.bcel.classfile.LocalVariable; 23 import org.apache.bcel.classfile.LocalVariableTable; 24 import org.apache.bcel.classfile.Method; 25 import org.apache.bcel.generic.ClassGen; 26 import org.apache.bcel.generic.ConstantPoolGen; 27 import org.apache.bcel.generic.InstructionHandle; 28 import org.apache.bcel.generic.InstructionList; 29 import org.apache.bcel.generic.InvokeInstruction; 30 import org.apache.bcel.generic.MethodGen; 31 import org.apache.bcel.generic.Type; 32 33 public class PLSETestCase extends AbstractTestCase 34 { 35 /** 36 * BCEL-208: A couple of methods in MethodGen.java need to test for 37 * an empty instruction list. 38 */ testB208()39 public void testB208() throws ClassNotFoundException 40 { 41 final JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.PLSETestClass"); 42 final ClassGen gen = new ClassGen(clazz); 43 final ConstantPoolGen pool = gen.getConstantPool(); 44 final Method m = gen.getMethodAt(1); 45 final MethodGen mg = new MethodGen(m, gen.getClassName(), pool); 46 mg.setInstructionList(null); 47 mg.addLocalVariable("local2", Type.INT, null, null); 48 // currently, this will cause null pointer exception 49 mg.getLocalVariableTable(pool); 50 } 51 52 /** 53 * BCEL-79: 54 */ testB79()55 public void testB79() throws ClassNotFoundException 56 { 57 final JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.PLSETestClass"); 58 final ClassGen gen = new ClassGen(clazz); 59 final ConstantPoolGen pool = gen.getConstantPool(); 60 final Method m = gen.getMethodAt(2); 61 final LocalVariableTable lvt = m.getLocalVariableTable(); 62 //System.out.println(lvt); 63 //System.out.println(lvt.getTableLength()); 64 final MethodGen mg = new MethodGen(m, gen.getClassName(), pool); 65 final LocalVariableTable new_lvt = mg.getLocalVariableTable(mg.getConstantPool()); 66 //System.out.println(new_lvt); 67 assertEquals("number of locals", lvt.getTableLength(), new_lvt.getTableLength()); 68 } 69 70 /** 71 * BCEL-262: 72 */ testB262()73 public void testB262() throws ClassNotFoundException 74 { 75 final JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.PLSETestEnum"); 76 final ClassGen gen = new ClassGen(clazz); 77 final ConstantPoolGen pool = gen.getConstantPool(); 78 // get the values() method 79 final Method m = gen.getMethodAt(0); 80 final MethodGen mg = new MethodGen(m, gen.getClassName(), pool); 81 final InstructionList il = mg.getInstructionList(); 82 // get the invokevirtual instruction 83 final InstructionHandle ih = il.findHandle(3); 84 final InvokeInstruction ii = (InvokeInstruction)(ih.getInstruction()); 85 // without fix, the getClassName() will throw: 86 // java.lang.IllegalArgumentException: Cannot be used on an array type 87 final String cn = ii.getClassName(pool); 88 assertEquals("[Lorg.apache.bcel.data.PLSETestEnum;", cn); 89 } 90 91 /** 92 * BCEL-295: 93 */ testB295()94 public void testB295() throws Exception 95 { 96 final JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.PLSETestClass2"); 97 final ClassGen cg = new ClassGen(clazz); 98 final ConstantPoolGen pool = cg.getConstantPool(); 99 final Method m = cg.getMethodAt(1); // 'main' 100 final LocalVariableTable lvt = m.getLocalVariableTable(); 101 final LocalVariable lv = lvt.getLocalVariable(2, 4); // 'i' 102 //System.out.println(lv); 103 final MethodGen mg = new MethodGen(m, cg.getClassName(), pool); 104 final LocalVariableTable new_lvt = mg.getLocalVariableTable(mg.getConstantPool()); 105 final LocalVariable new_lv = new_lvt.getLocalVariable(2, 4); // 'i' 106 //System.out.println(new_lv); 107 assertEquals("live range length", lv.getLength(), new_lv.getLength()); 108 } 109 } 110