1*0c56280aSSorin Basca /* 2*0c56280aSSorin Basca * Licensed to the Apache Software Foundation (ASF) under one or more 3*0c56280aSSorin Basca * contributor license agreements. See the NOTICE file distributed with 4*0c56280aSSorin Basca * this work for additional information regarding copyright ownership. 5*0c56280aSSorin Basca * The ASF licenses this file to You under the Apache License, Version 2.0 6*0c56280aSSorin Basca * (the "License"); you may not use this file except in compliance with 7*0c56280aSSorin Basca * the License. You may obtain a copy of the License at 8*0c56280aSSorin Basca * 9*0c56280aSSorin Basca * http://www.apache.org/licenses/LICENSE-2.0 10*0c56280aSSorin Basca * 11*0c56280aSSorin Basca * Unless required by applicable law or agreed to in writing, software 12*0c56280aSSorin Basca * distributed under the License is distributed on an "AS IS" BASIS, 13*0c56280aSSorin Basca * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*0c56280aSSorin Basca * See the License for the specific language governing permissions and 15*0c56280aSSorin Basca * limitations under the License. 16*0c56280aSSorin Basca * 17*0c56280aSSorin Basca */ 18*0c56280aSSorin Basca 19*0c56280aSSorin Basca import org.apache.bcel.Repository; 20*0c56280aSSorin Basca import org.apache.bcel.classfile.ClassParser; 21*0c56280aSSorin Basca import org.apache.bcel.classfile.JavaClass; 22*0c56280aSSorin Basca import org.apache.bcel.classfile.Method; 23*0c56280aSSorin Basca import org.apache.bcel.generic.ConstantPoolGen; 24*0c56280aSSorin Basca import org.apache.bcel.generic.MethodGen; 25*0c56280aSSorin Basca 26*0c56280aSSorin Basca /** 27*0c56280aSSorin Basca * Read class file(s) and examine all of its methods, determining the 28*0c56280aSSorin Basca * maximum stack depth used by analyzing control flow. 29*0c56280aSSorin Basca * 30*0c56280aSSorin Basca * @version $Id$ 31*0c56280aSSorin Basca */ 32*0c56280aSSorin Basca public final class maxstack { 33*0c56280aSSorin Basca main(String[] argv)34*0c56280aSSorin Basca public static void main(String[] argv) throws Exception { 35*0c56280aSSorin Basca for (String class_name : argv) { 36*0c56280aSSorin Basca JavaClass java_class = Repository.lookupClass(class_name); 37*0c56280aSSorin Basca 38*0c56280aSSorin Basca if (java_class == null) { 39*0c56280aSSorin Basca java_class = new ClassParser(class_name).parse(); 40*0c56280aSSorin Basca } 41*0c56280aSSorin Basca 42*0c56280aSSorin Basca ConstantPoolGen cp = new ConstantPoolGen(java_class.getConstantPool()); 43*0c56280aSSorin Basca 44*0c56280aSSorin Basca for (Method m : java_class.getMethods()) { 45*0c56280aSSorin Basca if (!(m.isAbstract() || m.isNative())) { 46*0c56280aSSorin Basca MethodGen mg = new MethodGen(m, class_name, cp); 47*0c56280aSSorin Basca 48*0c56280aSSorin Basca int compiled_stack = mg.getMaxStack(); 49*0c56280aSSorin Basca int compiled_locals = mg.getMaxLocals(); 50*0c56280aSSorin Basca mg.setMaxStack(); // Recompute value 51*0c56280aSSorin Basca mg.setMaxLocals(); 52*0c56280aSSorin Basca int computed_stack = mg.getMaxStack(); 53*0c56280aSSorin Basca int computed_locals = mg.getMaxLocals(); 54*0c56280aSSorin Basca 55*0c56280aSSorin Basca mg.getInstructionList().dispose(); // Reuse instruction handles 56*0c56280aSSorin Basca 57*0c56280aSSorin Basca System.out.println(m); 58*0c56280aSSorin Basca 59*0c56280aSSorin Basca if (computed_stack == compiled_stack) { 60*0c56280aSSorin Basca System.out.println("Stack ok(" + computed_stack + ")"); 61*0c56280aSSorin Basca } else { 62*0c56280aSSorin Basca System.out.println("\nCompiled stack size " + compiled_stack + " computed size " + computed_stack); 63*0c56280aSSorin Basca } 64*0c56280aSSorin Basca 65*0c56280aSSorin Basca if (computed_locals == compiled_locals) { 66*0c56280aSSorin Basca System.out.println("Locals ok(" + computed_locals + ")"); 67*0c56280aSSorin Basca } else { 68*0c56280aSSorin Basca System.out.println("\nCompiled locals " + compiled_locals + " computed size " + computed_locals); 69*0c56280aSSorin Basca } 70*0c56280aSSorin Basca } 71*0c56280aSSorin Basca } 72*0c56280aSSorin Basca } 73*0c56280aSSorin Basca } 74*0c56280aSSorin Basca } 75