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