summaryrefslogtreecommitdiff
path: root/src/fjbg/ch/epfl/lamp/fjbg/JExceptionsAttribute.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/fjbg/ch/epfl/lamp/fjbg/JExceptionsAttribute.java')
-rw-r--r--src/fjbg/ch/epfl/lamp/fjbg/JExceptionsAttribute.java90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/fjbg/ch/epfl/lamp/fjbg/JExceptionsAttribute.java b/src/fjbg/ch/epfl/lamp/fjbg/JExceptionsAttribute.java
new file mode 100644
index 0000000000..aee34de219
--- /dev/null
+++ b/src/fjbg/ch/epfl/lamp/fjbg/JExceptionsAttribute.java
@@ -0,0 +1,90 @@
+/* FJBG -- Fast Java Bytecode Generator
+ * Copyright 2002-2011 LAMP/EPFL
+ * @author Michel Schinz
+ */
+
+package ch.epfl.lamp.fjbg;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+/**
+ * Exceptions attribute
+
+ * This table is used by compilers to indicate which Exceptions a method
+ * is declared to throw. See section 2.6.4 of the JVM specification.
+ *
+ * @author Stephane Micheloud
+ * @version 1.0
+ */
+
+public class JExceptionsAttribute extends JAttribute {
+ /** Constant pool of the current classfile. */
+ private JConstantPool pool;
+
+ protected int[] indexTable;
+ protected int count;
+
+ public JExceptionsAttribute(FJBGContext context,
+ JClass clazz,
+ JMethod owner) {
+ super(context, clazz);
+ this.pool = clazz.pool;
+
+ this.count = 0;
+ this.indexTable = new int[8]; // some size > count
+
+ assert clazz == owner.getOwner();
+ }
+
+ public JExceptionsAttribute(FJBGContext context,
+ JClass clazz,
+ Object owner, //JMethod
+ String name,
+ int size,
+ DataInputStream stream)
+ throws IOException {
+ super(context, clazz, name);
+ this.pool = clazz.pool;
+
+ this.count = stream.readShort();
+ this.indexTable = new int[count];
+ for (int i = 0; i < count; ++i)
+ indexTable[i] = stream.readShort();
+
+ assert name.equals(getName());
+ }
+
+ public void addEntry(int classIndex) {
+ if (count >= indexTable.length) {
+ int[] newIT = new int[indexTable.length * 2];
+ System.arraycopy(indexTable, 0, newIT, 0, indexTable.length);
+ indexTable = newIT;
+ }
+ indexTable[count++] = classIndex;
+ }
+
+ public String getName() { return "Exceptions"; }
+
+ // Follows javap output format for Exceptions attribute.
+ /*@Override*/ public String toString() {
+ StringBuffer buf = new StringBuffer(" Exceptions: ");
+ for (int i = 0; i < indexTable.length; ++i) {
+ buf.append("\n throws ");
+ buf.append(JClass.toExternalName(pool.lookupClass(indexTable[i])));
+ }
+ buf.append("\n");
+ return buf.toString();
+ }
+
+ protected int getSize() {
+ return 2 + indexTable.length * 2;
+ }
+
+ protected void writeContentsTo(DataOutputStream stream) throws IOException {
+ stream.writeShort(count);
+ for (int i = 0; i < count; ++i)
+ stream.writeShort(indexTable[i]);
+ }
+}