Home | History | Annotate | Download | only in attribute
      1 /* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
      2  *
      3  * This program and the accompanying materials are made available under
      4  * the terms of the Common Public License v1.0 which accompanies this distribution,
      5  * and is available at http://www.eclipse.org/legal/cpl-v10.html
      6  *
      7  * $Id: DeclaredExceptionTable.java,v 1.1.1.1 2004/05/09 16:57:47 vlad_r Exp $
      8  */
      9 package com.vladium.jcd.cls.attribute;
     10 
     11 import java.io.IOException;
     12 
     13 import com.vladium.jcd.lib.UDataOutputStream;
     14 import com.vladium.util.IntVector;
     15 
     16 // ----------------------------------------------------------------------------
     17 /**
     18  * @author (C) 2001, Vlad Roubtsov
     19  */
     20 final class DeclaredExceptionTable implements IDeclaredExceptionTable
     21 {
     22     // public: ................................................................
     23 
     24     // ACCESSORS:
     25 
     26     public int get (final int offset)
     27     {
     28         return m_exceptions.get (offset);
     29     }
     30 
     31     public int size ()
     32     {
     33         return m_exceptions.size ();
     34     }
     35 
     36     public long length ()
     37     {
     38         return (1 + m_exceptions.size ()) << 1; // use size() if class becomes non-final
     39     }
     40 
     41     // Cloneable:
     42 
     43     /**
     44      * Performs a deep copy.
     45      */
     46     public Object clone ()
     47     {
     48         try
     49         {
     50             final DeclaredExceptionTable _clone = (DeclaredExceptionTable) super.clone ();
     51 
     52             // deep clone:
     53             _clone.m_exceptions = (IntVector) m_exceptions.clone ();
     54 
     55             return _clone;
     56         }
     57         catch (CloneNotSupportedException e)
     58         {
     59             throw new InternalError (e.toString ());
     60         }
     61     }
     62 
     63     // IClassFormatOutput:
     64 
     65     public void writeInClassFormat (final UDataOutputStream out) throws IOException
     66     {
     67         int number_of_exceptions = m_exceptions.size (); // use size() if class becomes non-final
     68         out.writeU2 (number_of_exceptions);
     69 
     70         for (int i = 0; i < number_of_exceptions; i++)
     71         {
     72             out.writeU2 (get (i));
     73         }
     74     }
     75 
     76 
     77     // MUTATORS:
     78 
     79     public int add (final int exception_index)
     80     {
     81         final int newoffset = m_exceptions.size (); // use size() if class becomes non-final
     82         m_exceptions.add (exception_index);
     83 
     84         return newoffset;
     85     }
     86 
     87     public int set (final int offset, final int exception_index)
     88     {
     89         return m_exceptions.set (offset, exception_index);
     90     }
     91 
     92     // protected: .............................................................
     93 
     94     // package: ...............................................................
     95 
     96 
     97     DeclaredExceptionTable (final int capacity)
     98     {
     99          m_exceptions = capacity < 0 ? new IntVector () : new IntVector (capacity);
    100     }
    101 
    102     // private: ...............................................................
    103 
    104 
    105     private IntVector m_exceptions;
    106 
    107 } // end of class
    108 // ----------------------------------------------------------------------------
    109