001: /* Copyright (C) 2004 - 2007 db4objects Inc. http://www.db4o.com
002:
003: This file is part of the db4o open source object database.
004:
005: db4o is free software; you can redistribute it and/or modify it under
006: the terms of version 2 of the GNU General Public License as published
007: by the Free Software Foundation and as clarified by db4objects' GPL
008: interpretation policy, available at
009: http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
010: Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
011: Suite 350, San Mateo, CA 94403, USA.
012:
013: db4o is distributed in the hope that it will be useful, but WITHOUT ANY
014: WARRANTY; without even the implied warranty of MERCHANTABILITY or
015: FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
016: for more details.
017:
018: You should have received a copy of the GNU General Public License along
019: with this program; if not, write to the Free Software Foundation, Inc.,
020: 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
021: package EDU.purdue.cs.bloat.file;
022:
023: import java.io.*;
024:
025: import EDU.purdue.cs.bloat.reflect.*;
026:
027: /**
028: * Exceptions describes the types of exceptions that a method may throw. The
029: * Exceptions attribute stores a list of indices into the constant pool of the
030: * typs of exceptions thrown by the method.
031: *
032: * @see Method
033: *
034: * @author Nate Nystrom (<a
035: * href="mailto:nystrom@cs.purdue.edu">nystrom@cs.purdue.edu</a>)
036: */
037: public class Exceptions extends Attribute {
038: private int[] exceptions;
039:
040: private ClassInfo classInfo;
041:
042: /**
043: * Constructor for create an <code>Exceptions</code> from scratch.
044: *
045: * @param nameIndex
046: * The index of the UTF8 string "Exceptions" in the class's
047: * constant pool
048: * @param exceptions
049: * A non-<code>null</code> array of indices into the constant
050: * pool for the types of the exceptions
051: */
052: Exceptions(final ClassInfo info, final int nameIndex,
053: final int[] exceptions) {
054: super (nameIndex, (2 * exceptions.length) + 2);
055: this .classInfo = info;
056: this .exceptions = exceptions;
057: }
058:
059: /**
060: * Constructor. Create an Exceptions attribute from a data stream.
061: *
062: * @param in
063: * The data stream of the class file.
064: * @param nameIndex
065: * The index into the constant pool of the name of the attribute.
066: * @param length
067: * The length of the attribute, excluding the header.
068: * @exception IOException
069: * If an error occurs while reading.
070: */
071: public Exceptions(final ClassInfo classInfo,
072: final DataInputStream in, final int nameIndex,
073: final int length) throws IOException {
074: super (nameIndex, length);
075:
076: this .classInfo = classInfo;
077:
078: final int count = in.readUnsignedShort();
079:
080: exceptions = new int[count];
081:
082: for (int i = 0; i < count; i++) {
083: exceptions[i] = in.readUnsignedShort();
084: }
085: }
086:
087: /**
088: * Write the attribute to a data stream.
089: *
090: * @param out
091: * The data stream of the class file.
092: * @exception IOException
093: * If an error occurs while writing.
094: */
095: public void writeData(final DataOutputStream out)
096: throws IOException {
097: out.writeShort(exceptions.length);
098:
099: for (int i = 0; i < exceptions.length; i++) {
100: out.writeShort(exceptions[i]);
101: }
102: }
103:
104: /**
105: * Get the indices into the constant pool of the types of the exceptions
106: * thrown by this method.
107: *
108: * @return The indices of the types of the exceptions thrown.
109: */
110: public int[] exceptionTypes() {
111: return exceptions;
112: }
113:
114: /**
115: * Get the length of the attribute.
116: */
117: public int length() {
118: return 2 + exceptions.length * 2;
119: }
120:
121: /**
122: * Private constructor used for cloning.
123: */
124: private Exceptions(final Exceptions other) {
125: super (other.nameIndex, other.length);
126:
127: this .exceptions = new int[other.exceptions.length];
128: System.arraycopy(other.exceptions, 0, this .exceptions, 0,
129: other.exceptions.length);
130: this .classInfo = other.classInfo;
131: }
132:
133: public Object clone() {
134: return (new Exceptions(this ));
135: }
136:
137: /**
138: * Returns a string representation of the attribute.
139: */
140: public String toString() {
141: return "(exceptions)";
142: }
143: }
|