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: ClassDefParser.java,v 1.1.1.1 2004/05/09 16:57:51 vlad_r Exp $ 8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.jcd.parser; 10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.InputStream; 12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.IOException; 13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.jcd.cls.*; 15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.jcd.cls.attribute.*; 16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.jcd.cls.constant.*; 17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.jcd.lib.UDataInputStream; 18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.ByteArrayIStream; 19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ---------------------------------------------------------------------------- 21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/** 22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This class provides an API for parsing a stream or array of bytecodes into a 23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * {@link ClassDef} AST. 24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author (C) 2001, Vlad Roubtsov 26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic 28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectabstract class ClassDefParser 29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{ 30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // public: ................................................................ 31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Parses an array of bytecodes into a {@link ClassDef}. 35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static ClassDef parseClass (final byte [] bytes) 37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throws IOException 38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (bytes == null) throw new IllegalArgumentException ("null input: bytes"); 40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project classParser parser = new classParser (new UDataInputStream (new ByteArrayIStream (bytes))); 42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return parser.class_table (); 44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Parses an array of bytecodes into a {@link ClassDef}. 48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static ClassDef parseClass (final byte [] bytes, final int length) 50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throws IOException 51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (bytes == null) throw new IllegalArgumentException ("null input: bytes"); 53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project classParser parser = new classParser (new UDataInputStream (new ByteArrayIStream (bytes, length))); 55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return parser.class_table (); 57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Parses a stream of bytecodes into a {@link ClassDef}. 62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static ClassDef parseClass (final InputStream bytes) 64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throws IOException 65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (bytes == null) throw new IllegalArgumentException ("null input: bytes"); 67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project classParser parser = new classParser (new UDataInputStream (bytes)); 69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return parser.class_table (); 71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // protected: ............................................................. 74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // package: ............................................................... 76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project static final boolean PARSE_SERIAL_VERSION_UID = true; 79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project static final String SERIAL_VERSION_UID_FIELD_NAME = "serialVersionUID"; 81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project static final int SERIAL_VERSION_UID_FIELD_MASK = IAccessFlags.ACC_STATIC | IAccessFlags.ACC_FINAL; 82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // private: ............................................................... 84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * All the parsing work is done by this class and its class_table method. The 88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * work that needs to be done is not complicated, but is rather monotonous -- see 89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Chapter 4 of VM spec 1.0 for the class file format. 90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final class classParser 92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project classParser (final UDataInputStream bytes) 94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_bytes = bytes; 96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project ClassDef class_table () throws IOException 100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_table = new ClassDef (); 102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project magic (); 105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project version (); 106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println (s_line); 108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project constant_pool (); 110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println (s_line); 112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project access_flags (); 114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project this_class (); 115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project super_class (); 116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println (s_line); 118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project interfaces (); 120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println (s_line); 121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project fields (); 123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println (s_line); 124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project methods (); 126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println (s_line); 127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project attributes (); 129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println (s_line); 130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return m_table; 132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void magic () throws IOException 136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final long magic = m_bytes.readU4 (); 138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println ("magic: [" + Long.toHexString (magic) + ']'); 139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_table.setMagic (magic); 141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void version () throws IOException 145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int minor_version = m_bytes.readU2 (); 147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int major_version = m_bytes.readU2 (); 148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) 150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project System.out.println ("major_version: [" + major_version + ']'); 152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project System.out.println ("minor_version: [" + minor_version + ']'); 153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_table.setVersion (new int [] {major_version, minor_version}); 156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void constant_pool () throws IOException 160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int constant_pool_count = m_bytes.readU2 (); 162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println ("constant_pool_count = " + constant_pool_count + " [actual number of entries = " + (constant_pool_count - 1) + "]"); 163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IConstantCollection constants = m_table.getConstants(); 165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int index = 1; index < constant_pool_count; ++ index) 167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final CONSTANT_info cp_info = CONSTANT_info.new_CONSTANT_info (m_bytes); 169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project constants.add (cp_info); 170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println ("[" + index + "] constant: " + cp_info); 172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ((cp_info instanceof CONSTANT_Long_info) || (cp_info instanceof CONSTANT_Double_info)) 174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project index++; 175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void access_flags () throws IOException 180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int _access_flags = m_bytes.readU2 (); 182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_table.setAccessFlags (_access_flags); 184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void this_class () throws IOException 188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int _class_index = m_bytes.readU2 (); 190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println ("this_class: [" + _class_index + ']'); 191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_table.setThisClassIndex (_class_index); 193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void super_class () throws IOException 197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int _class_index = m_bytes.readU2 (); 199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println ("super_class: [" + _class_index + ']'); 200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_table.setSuperClassIndex (_class_index); 202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void interfaces () throws IOException 206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int _interfaces_count = m_bytes.readU2 (); 208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println ("interfaces_count = " + _interfaces_count); 209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int i = 0; i < _interfaces_count; i++) 211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project int _interface_index = m_bytes.readU2 (); 213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println ("[" + i + "] interface: " + _interface_index); 214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_table.getInterfaces().add (_interface_index); 216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void fields () throws IOException 221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int _fields_count = m_bytes.readU2 (); 223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println ("fields_count = " + _fields_count); 224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IConstantCollection constantPool = m_table.getConstants (); 226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int i = 0; i < _fields_count; i++) 228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final Field_info field_info = new Field_info (constantPool, m_bytes); 230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) 231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 232f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project System.out.println ("[" + i + "] field: " + field_info); 233f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project System.out.println (); 234f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 235f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 236f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_table.getFields().add (field_info); 237f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 238f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (PARSE_SERIAL_VERSION_UID) 239f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 240f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (((field_info.getAccessFlags () & SERIAL_VERSION_UID_FIELD_MASK) == SERIAL_VERSION_UID_FIELD_MASK) 241f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project && SERIAL_VERSION_UID_FIELD_NAME.equals (field_info.getName (m_table))) 242f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 243f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IAttributeCollection attributes = field_info.getAttributes (); 244f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int a = 0, aLimit = attributes.size (); a < aLimit; ++ a) 245f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 246f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final Attribute_info attr_info = attributes.get (a); 247f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 248f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (attr_info instanceof ConstantValueAttribute_info) 249f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 250f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final CONSTANT_literal_info constant_value = ((ConstantValueAttribute_info) attr_info).getValue (m_table); 251f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (constant_value instanceof CONSTANT_Long_info) 252f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_table.setDeclaredSUID (((CONSTANT_Long_info) constant_value).m_value); 253f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 254f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 255f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 256f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 257f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 258f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 259f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 260f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void methods () throws IOException 261f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 262f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int _methods_count = m_bytes.readU2 (); 263f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println ("methods_count = " + _methods_count); 264f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 265f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IConstantCollection constantPool = m_table.getConstants (); 266f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 267f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int i = 0; i < _methods_count; i++) 268f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 269f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final Method_info method_info = new Method_info (constantPool, m_bytes); 270f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) 271f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 272f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project System.out.println ("[" + i + "] method: " + method_info); 273f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project System.out.println (); 274f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 275f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 276f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_table.getMethods().add (method_info); 277f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 278f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 279f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 280f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 281f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void attributes () throws IOException 282f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 283f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int _attributes_count = m_bytes.readU2 (); 284f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) System.out.println ("attributes_count = " + _attributes_count); 285f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 286f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project IConstantCollection constantPool = m_table.getConstants (); 287f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 288f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int i = 0; i < _attributes_count; i++) 289f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 290f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project Attribute_info attribute_info = Attribute_info.new_Attribute_info (constantPool, m_bytes); 291f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (DEBUG) 292f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 293f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project System.out.println ("[" + i + "] attribute: " + attribute_info); 294f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project System.out.println (); 295f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 296f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 297f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_table.getAttributes().add (attribute_info); 298f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 299f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 300f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 301f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 302f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private final UDataInputStream m_bytes; 303f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private ClassDef m_table; 304f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 305f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final boolean DEBUG = false; 306f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String s_line = "------------------------------------------------------------------------"; 307f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 308f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } // end of static class 309f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 310f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class 311f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ---------------------------------------------------------------------------- 312