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: Method_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; 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.cls.attribute.*; 14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.jcd.cls.constant.CONSTANT_Utf8_info; 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 * Each class method, and each instance initialization method <init>, is described 21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * by a variable-length method_info structure. The structure has the following 22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * format: 23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <PRE> 24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * method_info { 25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * u2 access_flags; 26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * u2 name_index; 27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * u2 descriptor_index; 28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * u2 attributes_count; 29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * attribute_info attributes[attributes_count]; 30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * } 31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * </PRE> 32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * The value of the access_flags item is a mask of modifiers used to describe 34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * access permission to and properties of a method or instance initialization method.<P> 35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * The value of the name_index item must be a valid index into the constant pool 37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * table. The constant pool entry at that index must be a {@link CONSTANT_Utf8_info} 38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * structure representing either one of the special internal method names, either 39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <init> or <clinit>, or a valid Java method name, stored as a simple 40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * (not fully qualified) name.<P> 41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * The value of the descriptor_index item must be a valid index into the constant pool 43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * table. The constant pool entry at that index must be a {@link CONSTANT_Utf8_info} 44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * structure representing a valid Java method descriptor.<P> 45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Each value of the attributes table must be a variable-length attribute structure. 47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * A method can have any number of optional attributes associated with it. The only 48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * attributes defined by this specification for the attributes table of a method_info 49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * structure are the Code and Exceptions attributes. See {@link CodeAttribute_info} 50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * and {@link ExceptionsAttribute_info}. 51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author (C) 2001, Vlad Roubtsov 53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic 55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectfinal class Method_info implements Cloneable, IAccessFlags 56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{ 57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // public: ................................................................ 58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public int m_name_index; 61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public int m_descriptor_index; 62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public Method_info (int access_flags, int name_index, int descriptor_index, IAttributeCollection attributes) 65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_access_flags = access_flags; 67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_name_index = name_index; 69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_descriptor_index = descriptor_index; 70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_attributes = attributes; 72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public Method_info (final IConstantCollection constants, 76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final UDataInputStream bytes) 77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throws IOException 78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_access_flags = bytes.readU2 (); 80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_name_index = bytes.readU2 (); 82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_descriptor_index = bytes.readU2 (); 83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: put this logic into AttributeCollection 85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int attributes_count = bytes.readU2 (); 87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_attributes = ElementFactory.newAttributeCollection (attributes_count); 88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int i = 0; i < attributes_count; ++ i) 90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final Attribute_info attribute_info = Attribute_info.new_Attribute_info (constants, bytes); 92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_attributes.add (attribute_info); 94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Returns the method name within the context of 'cls' class definition. 99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @param cls class that contains this method 101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @return method name 102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public String getName (final ClassDef cls) 104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return ((CONSTANT_Utf8_info) cls.getConstants ().get (m_name_index)).m_value; 106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Returns the descriptor string for this method within the context of 'cls' 110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * class definition. 111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @param cls class that contains this method 113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @return field typename descriptor 114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public String getDescriptor (final ClassDef cls) 116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return ((CONSTANT_Utf8_info) cls.getConstants ().get (m_descriptor_index)).m_value; 118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public boolean isNative () 121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return (m_access_flags & ACC_NATIVE) != 0; 123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public boolean isAbstract () 126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return (m_access_flags & ACC_ABSTRACT) != 0; 128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public boolean isSynthetic () 131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return m_attributes.hasSynthetic (); 133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public boolean isBridge () 136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return ((m_access_flags & ACC_BRIDGE) != 0) || m_attributes.hasBridge (); 138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // IAccessFlags: 141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public final void setAccessFlags (final int flags) 143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_access_flags = flags; 145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public final int getAccessFlags () 148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return m_access_flags; 150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public IAttributeCollection getAttributes () 154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return m_attributes; 156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public String toString () 160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project StringBuffer s = new StringBuffer (); 162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project s.append ("method_info: [modifiers: 0x" + Integer.toHexString(m_access_flags) + ", name_index = " + m_name_index + ", descriptor_index = " + m_descriptor_index + "]\n"); 164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int i = 0; i < m_attributes.size (); i++) 165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project Attribute_info attribute_info = m_attributes.get (i); 167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project s.append ("\t[" + i + "] attribute: " + attribute_info + "\n"); 169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return s.toString (); 172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // Cloneable: 176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Performs a deep copy. 179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public Object clone () 181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project try 183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final Method_info _clone = (Method_info) super.clone (); 185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // do deep copy: 187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _clone.m_attributes = (IAttributeCollection) m_attributes.clone (); 188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return _clone; 190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project catch (CloneNotSupportedException e) 192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throw new InternalError (e.toString ()); 194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // IClassFormatOutput: 198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public void writeInClassFormat (final UDataOutputStream out) throws IOException 200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out.writeU2 (m_access_flags); 202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out.writeU2 (m_name_index); 204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out.writeU2 (m_descriptor_index); 205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_attributes.writeInClassFormat (out); 207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // protected: ............................................................. 210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // package: ............................................................... 212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // private: ............................................................... 214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private int m_access_flags; 217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private IAttributeCollection m_attributes; 218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class 220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ---------------------------------------------------------------------------- 221