1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved. 2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This program and the accompanying materials are made available under 4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the terms of the Common Public License v1.0 which accompanies this distribution, 5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * and is available at http://www.eclipse.org/legal/cpl-v10.html 6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * $Id: ExceptionsAttribute_info.java,v 1.1.1.1 2004/05/09 16:57:47 vlad_r Exp $ 8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.jcd.cls.attribute; 10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.IOException; 12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.jcd.lib.UDataInputStream; 14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.jcd.lib.UDataOutputStream; 15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ---------------------------------------------------------------------------- 17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/** 18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * The Exceptions attribute is a variable-length attribute used in the attributes 19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * table of a {@link com.vladium.jcd.cls.Method_info} structure. The Exceptions 20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * attribute indicates which checked exceptions a method may throw. There must be 21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * exactly one Exceptions attribute in each method_info structure.<P> 22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * The Exceptions attribute has the following format: 24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <PRE> 25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Exceptions_attribute { 26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * u2 attribute_name_index; 27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * u4 attribute_length; 28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * u2 number_of_exceptions; 29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * u2 exception_index_table[number_of_exceptions]; 30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * } 31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * </PRE> 32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * The value of the number_of_exceptions item indicates the number of entries 33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * in the exception_index_table.<P> 34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Each nonzero value in the exception_index_table array must be a valid index 36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * into the constant_pool table. For each table item, if 37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * exception_index_table[i] != 0 , where 0 < i < number_of_exceptions, 38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * then the constant_pool entry at index exception_index_table[i] must be a 39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * {@link com.vladium.jcd.cls.constant.CONSTANT_Class_info} structure representing 40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * a class type that this method is declared to throw -- see {@link DeclaredExceptionTable}. 41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author (C) 2001, Vlad Roubtsov 43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic 45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectfinal class ExceptionsAttribute_info extends Attribute_info 46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{ 47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // public: ................................................................ 48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: merge IDeclaredExceptionTable into this class 50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public ExceptionsAttribute_info (final int attribute_name_index, 52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IDeclaredExceptionTable exceptions) 53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project super (attribute_name_index, exceptions.length ()); 55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_exceptions = exceptions; 57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public IDeclaredExceptionTable getDeclaredExceptions () 60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return m_exceptions; 62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public long length () 65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return 6 + m_exceptions.length (); 67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // Visitor: 70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public void accept (final IAttributeVisitor visitor, final Object ctx) 72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project visitor.visit (this, ctx); 74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public String toString () 77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: return more data here 79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return "ExceptionsAttribute_info: [attribute_name_index = " + m_name_index + ", attribute_length = " + m_attribute_length + ']'; 80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // Cloneable: 83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Performs a deep copy. 86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public Object clone () 88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final ExceptionsAttribute_info _clone = (ExceptionsAttribute_info) super.clone (); 90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // do deep copy: 92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _clone.m_exceptions = (IDeclaredExceptionTable) m_exceptions.clone (); 93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return _clone; 95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // IClassFormatOutput: 98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public void writeInClassFormat (final UDataOutputStream out) throws IOException 100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project super.writeInClassFormat (out); 102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_exceptions.writeInClassFormat (out); 104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // protected: ............................................................. 107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // package: ............................................................... 109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project ExceptionsAttribute_info (final int attribute_name_index, final long attribute_length, 113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final UDataInputStream bytes) 114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throws IOException 115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project super (attribute_name_index, attribute_length); 117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int number_of_exceptions = bytes.readU2 (); 119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_exceptions = new DeclaredExceptionTable (number_of_exceptions); 120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int i = 0; i < number_of_exceptions; i++) 122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int exception_index = bytes.readU2 (); 124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_exceptions.add (exception_index); 126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // private: ............................................................... 130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private IDeclaredExceptionTable m_exceptions; 133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class 135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ---------------------------------------------------------------------------- 136