/* * CodeAnalyzer (c) 1998 Jochen Hoenicke * * You may distribute under the terms of the GNU General Public License. * * IN NO EVENT SHALL JOCHEN HOENICKE BE LIABLE TO ANY PARTY FOR DIRECT, * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF * THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF JOCHEN HOENICKE * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * JOCHEN HOENICKE SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" * BASIS, AND JOCHEN HOENICKE HAS NO OBLIGATION TO PROVIDE MAINTENANCE, * SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * $Id$ */ package jode; import sun.tools.java.*; import java.util.Stack; import java.io.*; import jode.flow.FlowBlock; public class CodeAnalyzer implements Analyzer, Constants { BinaryCode bincode; FlowBlock methodHeader; MethodAnalyzer method; public JodeEnvironment env; LocalVariableTable lvt; /** * Get the method. * @return The method to which this code belongs. */ public MethodAnalyzer getMethod() {return method;} void readCode() throws ClassFormatError { byte[] code = bincode.getCode(); FlowBlock[] instr = new FlowBlock[code.length]; int returnCount; try { DataInputStream stream = new DataInputStream(new ByteArrayInputStream(code)); for (int addr = 0; addr < code.length; ) { instr[addr] = Opcodes.readOpcode(addr, stream, this); addr = instr[addr].getNextAddr(); } } catch (IOException ex) { throw new ClassFormatError(ex.toString()); } BinaryExceptionHandler[] handlers = bincode.getExceptionHandlers(); for (int addr=0; addr