Code Search for Developers
 
 
  

CodeAttribute.java from DrJava at Krugle


Show CodeAttribute.java syntax highlighted

/*BEGIN_COPYRIGHT_BLOCK
 *
 * Copyright (c) 2001-2007, JavaPLT group at Rice University (javaplt@rice.edu)
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *    * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    * Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *    * Neither the names of DrJava, the JavaPLT group, Rice University, nor the
 *      names of its contributors may be used to endorse or promote products
 *      derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * This software is Open Source Initiative approved Open Source Software.
 * Open Source Initative Approved is a trademark of the Open Source Initiative.
 * 
 * This file is part of DrJava.  Download the current version of this project
 * from http://www.drjava.org/ or http://sourceforge.net/projects/drjava/
 * 
 * END_COPYRIGHT_BLOCK*/


/*
 * DynamicJava - Copyright (C) 1999-2001
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files
 * (the "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to permit
 * persons to whom the Software is furnished to do so, subject to the
 * following conditions:
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL DYADE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 * Except as contained in this notice, the name of Dyade shall not be
 * used in advertising or otherwise to promote the sale, use or other
 * dealings in this Software without prior written authorization from
 * Dyade.
 *
 */

package koala.dynamicjava.classfile;

import java.io.*;
import java.util.*;

/**
 * This class represents a method code attribute
 *
 * @author Stephane Hillion
 * @version 1.0 - 1999/05/07
 */

public class CodeAttribute extends AttributeInfo {
  /**
   * The max depth of the operand stack
   */
  private short maxStack;
  
  /**
   * The max number of local variables
   */
  private short maxLocals;
  
  /**
   * The code
   */
  private byte[] code;
  
  /**
   * The exception table
   */
  private List<ExceptionTableEntry> exceptionTable;
  
  /**
   * The attributes
   */
  private List attributes;
  
  /**
   * Creates a new empty (not valid) code attribute
   * @param cp the constant pool
   */
  public CodeAttribute(ConstantPool cp) {
    super(cp, "Code");
    length         = 12;
    exceptionTable = new LinkedList<ExceptionTableEntry>();
    attributes     = new LinkedList();
  }
  
  /**
   * Writes the code info to the given output stream.
   */
  public void write(DataOutputStream out) throws IOException {
    out.writeShort(nameIndex);
    out.writeInt(length);
    out.writeShort(maxStack);
    out.writeShort(maxLocals);
    
    out.writeInt(code.length);
    out.write(code);
    
    out.writeShort(exceptionTable.size());
    
    Iterator it = exceptionTable.iterator();
    while (it.hasNext()) {
      ((ExceptionTableEntry)it.next()).write(out);
    }
    
    out.writeShort(attributes.size());
    it = attributes.iterator();
    while (it.hasNext()) {
      ((AttributeInfo)it.next()).write(out);
    }
  }
  
  /**
   * Sets the code for this code attribute
   * @param code the byte code array
   * @param nl   the number of local variables
   * @param ms   the max stack size
   */
  public void setCode(byte[] code, short nl, short ms) {
    maxLocals = nl;
    maxStack  = ms;
    this.code = code;
    length += code.length;
  }
  
  /**
   * Adds an exception entry in the exception table
   * @param spc the start of the try statement
   * @param epc the end   of the try statement
   * @param tpc the handler position
   * @param ex  the name of the exception
   */
  public void addExceptionTableEntry(short spc, short epc, short tpc, String ex) {
    String              n  = JVMUtilities.getName(ex);
    short               s  = constantPool.put(new ClassIdentifier(n));
    ExceptionTableEntry ee = new ExceptionTableEntry(spc, epc, tpc, s);
    
    exceptionTable.add(ee);
    length += ee.getLength();
  }
  
  class ExceptionTableEntry {
    /**
     * The 'try' block starting position
     */
    private short startPc;
    
    /**
     * The 'try' block end
     */
    private short endPc;
    
    /**
     * The index of the 'catch' statement
     */
    private short handlerPc;
    
    /**
     * The index of the name of the catched exception in the constant pool
     */
    private short catchType;
    
    /**
     * Creates a new exception table entry
     * @param spc the 'try' block starting position
     * @param epc the 'try' block end
     * @param hpc the index of the 'catch' statement
     * @param ct  the index of the name of the catched exception in the constant pool
     */
    public ExceptionTableEntry(short spc, short epc, short hpc, short ct) {
      startPc   = spc;
      endPc     = epc;
      handlerPc = hpc;
      catchType = ct;
    }
    
    /**
     * Returns the length of the entry
     */
    public short getLength() {
      return (short)8;
    }
    
    /**
     * Writes the field info to the given output stream
     */
    public void write(OutputStream out) throws IOException {
      write(new DataOutputStream(out));
    }
    
    /**
     * Writes the field info to the given output stream.
     */
    public void write(DataOutputStream out) throws IOException {
      out.writeShort(startPc);
      out.writeShort(endPc);
      out.writeShort(handlerPc);
      out.writeShort(catchType);
    }
  }
}




See more files for this project here

DrJava

DrJava is a lightweight programming environment for Java designed to foster test-driven software development. It includes an intelligent program editor, an interactions pane for evaluating program text, a source level debugger, and a unit testing tool.

Project homepage: http://sourceforge.net/projects/drjava
Programming language(s): Java
License: other

  AbstractMethodIdentifier.java
  AbstractMethodIdentifierTest.java
  AttributeInfo.java
  AttributeOwnerComponent.java
  BytecodeComponent.java
  ClassFile.java
  ClassIdentifier.java
  ClassIdentifierTest.java
  CodeAttribute.java
  ConstantPool.java
  ConstantString.java
  ConstantValueAttribute.java
  ExceptionsAttribute.java
  FieldIdentifier.java
  FieldInfo.java
  InnerClassesAttribute.java
  InnerClassesEntry.java
  InterfaceMethodIdentifier.java
  JVMUtilities.java
  MemberIdentifier.java
  MemberIdentifierTest.java
  MethodIdentifier.java
  MethodIdentifierTest.java
  MethodInfo.java
  SimpleAttribute.java
  package.html