/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ import org.apache.bcel.Repository; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.Method; import org.apache.bcel.generic.ConstantPoolGen; import org.apache.bcel.generic.MethodGen; /** * Read class file(s) and examine all of its methods, determining the * maximum stack depth used by analyzing control flow. * * @version $Id$ */ public final class maxstack { public static void main(String[] argv) throws Exception { for (String class_name : argv) { JavaClass java_class = Repository.lookupClass(class_name); if (java_class == null) { java_class = new ClassParser(class_name).parse(); } ConstantPoolGen cp = new ConstantPoolGen(java_class.getConstantPool()); for (Method m : java_class.getMethods()) { if (!(m.isAbstract() || m.isNative())) { MethodGen mg = new MethodGen(m, class_name, cp); int compiled_stack = mg.getMaxStack(); int compiled_locals = mg.getMaxLocals(); mg.setMaxStack(); // Recompute value mg.setMaxLocals(); int computed_stack = mg.getMaxStack(); int computed_locals = mg.getMaxLocals(); mg.getInstructionList().dispose(); // Reuse instruction handles System.out.println(m); if (computed_stack == compiled_stack) { System.out.println("Stack ok(" + computed_stack + ")"); } else { System.out.println("\nCompiled stack size " + compiled_stack + " computed size " + computed_stack); } if (computed_locals == compiled_locals) { System.out.println("Locals ok(" + computed_locals + ")"); } else { System.out.println("\nCompiled locals " + compiled_locals + " computed size " + computed_locals); } } } } } }