Home | History | Annotate | Download | only in bcel
      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      */
     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      */
     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      */
     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      */
     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