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: InnerClassesAttribute_info.java,v 1.1.1.1 2004/05/09 16:57:48 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 Projectimport java.util.ArrayList; 13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.List; 14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.jcd.lib.UDataInputStream; 16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.jcd.lib.UDataOutputStream; 17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ---------------------------------------------------------------------------- 19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/** 20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2003 21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic 23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectfinal class InnerClassesAttribute_info extends Attribute_info 24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{ 25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // public: ................................................................ 26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // ACCESSORS: 28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public boolean makesClassNested (final int class_index, final int [] nestedAccessFlags) 30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (class_index > 0) 32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: avoid linear loop by keeping all class indices in a bitset 34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int i = 0, iLimit = size (); i < iLimit; ++ i) 36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final InnerClass_info info = get (i); 38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (info.m_inner_class_index == class_index) 40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project nestedAccessFlags [0] = info.m_inner_access_flags; 42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return true; 43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return false; 48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Returns {@link InnerClass_info} descriptor at a given offset. 52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @param offset inner class entry offset [must be in [0, size()) range; 54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * input not checked] 55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @return InnerClass_info descriptor [never null] 56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @throws IndexOutOfBoundsException if 'offset' is outside of valid range 58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public final InnerClass_info get (final int offset) 60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return (InnerClass_info) m_classes.get (offset); 62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Returns the number of descriptors in this collection [can be 0]. 66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public final int size () 68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return m_classes.size (); 70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public final long length () 73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return 8 + (m_classes.size () << 3); // use size() if class becomes non-final 75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // Visitor: 78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public void accept (final IAttributeVisitor visitor, final Object ctx) 80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project visitor.visit (this, ctx); 82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public String toString () 85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer s = new StringBuffer ("InnerClassesAttribute_info: [attribute_name_index = " + m_name_index + ", attribute_length = " + length () + "]\n"); 87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int l = 0; l < size (); ++ l) 89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project s.append (" " + get (l)); 91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project s.append ("\n"); // TODO: proper EOL const 92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return s.toString (); 95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // Cloneable: 98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Performs a deep copy. 101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public Object clone () 103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final InnerClassesAttribute_info _clone = (InnerClassesAttribute_info) super.clone (); 105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final List/* InnerClass_info */ classes = m_classes; 107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // do deep copy: 109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int class_count = classes.size (); // use size() if class becomes non-final 110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _clone.m_classes = new ArrayList (class_count); 111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int e = 0; e < class_count; ++ e) 112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _clone.m_classes.add (((InnerClass_info) classes.get (e)).clone ()); 114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return _clone; 117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // IClassFormatOutput: 120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public void writeInClassFormat (final UDataOutputStream out) throws IOException 122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project super.writeInClassFormat (out); 124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final List/* InnerClass_info */ classes = m_classes; 126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int class_count = classes.size (); // use size() if class becomes non-final 128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out.writeU2 (class_count); 129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int l = 0; l < class_count; ++ l) 131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project ((InnerClass_info) classes.get (l)).writeInClassFormat (out); 133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // protected: ............................................................. 137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // package: ............................................................... 139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project InnerClassesAttribute_info (final int attribute_name_index, final long attribute_length, 142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final UDataInputStream bytes) 143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throws IOException 144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project super (attribute_name_index, attribute_length); 146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int class_count = bytes.readU2 (); 148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final List/* InnerClass_info */ classes = new ArrayList (class_count); 149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int i = 0; i < class_count; ++ i) 151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project classes.add (new InnerClass_info (bytes)); 153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_classes = classes; 156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // private: ............................................................... 159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private List/* InnerClass_info */ m_classes; // never null 162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class 164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------