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: ClassDescriptor.java,v 1.1.1.1 2004/05/09 16:57:30 vlad_r Exp $
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.emma.data;
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.DataInput;
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.DataOutput;
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.IOException;
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.Serializable;
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.IConstants;
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.asserts.$assert;
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2003
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectfinal class ClassDescriptor implements IConstants, Serializable
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public ClassDescriptor (final String packageVMName, final String name, final long stamp,
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            final String srcFileName,
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            final MethodDescriptor [] methods)
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (packageVMName == null)
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new IllegalArgumentException ("null input: packageVMName");
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (name == null)
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new IllegalArgumentException ("null input: name");
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (methods == null)
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new IllegalArgumentException ("null input: methods");
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ($assert.ENABLED)
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (int m = 0; m < methods.length; ++ m)
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                $assert.ASSERT (methods [m] != null, "methods [" + m + "] = null (length = " + methods.length + ")");
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_packageVMName = packageVMName;
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_name = name;
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_stamp = stamp;
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_srcFileName = srcFileName;
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_methods = methods; // TODO: defensive copy?
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        boolean completeLineNumberInfo = true;
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int m = 0; m < m_methods.length; ++ m)
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final MethodDescriptor method = methods [m];
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (((method.getStatus () & IMetadataConstants.METHOD_NO_BLOCK_DATA) == 0) && ! m_methods [m].hasLineNumberInfo ())
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                completeLineNumberInfo = false;
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                break;
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_hasCompleteLineNumberInfo = completeLineNumberInfo;
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // equality is defined based on <m_packageVMName, m_name> only (m_stamp not mixed in by design):
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final boolean equals (final Object rhs)
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (! (rhs instanceof ClassDescriptor)) return false;
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final ClassDescriptor _rhs = (ClassDescriptor) rhs;
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (hashCode () != _rhs.hashCode ()) return false;
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (! m_name.equals (_rhs.m_name)) return false;
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (! m_packageVMName.equals (_rhs.m_packageVMName)) return false;
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return true;
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final int hashCode ()
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (m_hash == 0)
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final int hash = m_name.hashCode () + 16661 * m_packageVMName.hashCode ();
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_hash = hash;
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return hash;
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_hash;
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final String getPackageVMName ()
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_packageVMName;
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final String getName ()
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_name;
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final long getStamp ()
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_stamp;
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final String getClassVMName ()
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // TODO: use Descriptors API?
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (m_packageVMName.length () == 0)
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return m_name;
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return new StringBuffer (m_packageVMName).append ("/").append (m_name).toString ();
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final String getSrcFileName ()
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_srcFileName;
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final MethodDescriptor [] getMethods ()
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_methods; // no defensive copy
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final boolean hasSrcFileInfo ()
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_srcFileName != null;
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final boolean hasCompleteLineNumberInfo ()
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_hasCompleteLineNumberInfo;
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public String toString ()
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return toString ("");
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public String toString (final String indent)
151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        StringBuffer s = new StringBuffer (indent + "class [" + (m_packageVMName.length () > 0 ? m_packageVMName + "/" : "") + m_name + "] descriptor:");
153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int m = 0; m < m_methods.length; ++ m)
155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            s.append (EOL);
157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            s.append (m_methods [m].toString (indent + INDENT_INCREMENT));
158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return s.toString ();
161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    static ClassDescriptor readExternal (final DataInput in)
169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final String packageVMName = in.readUTF ();
172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final String name = in.readUTF ();
173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final long stamp = in.readLong ();
175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final byte srcFileNameFlag = in.readByte ();
177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final String srcFileName = srcFileNameFlag != 0 ? in.readUTF () : null;
178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int length = in.readInt ();
180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final MethodDescriptor [] methods = new MethodDescriptor [length];
181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0; i < length; ++ i)
182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            methods [i] = MethodDescriptor.readExternal (in);
184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return new ClassDescriptor (packageVMName, name, stamp, srcFileName, methods);
187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    static void writeExternal (final ClassDescriptor cls, final DataOutput out)
190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.writeUTF (cls.m_packageVMName);
193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.writeUTF (cls.m_name);
194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.writeLong (cls.m_stamp);
196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (cls.m_srcFileName != null)
198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            out.writeByte (1);
200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            out.writeUTF (cls.m_srcFileName);
201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            out.writeByte (0);
205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final MethodDescriptor [] methods = cls.m_methods;
208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int length = methods.length;
209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.writeInt (length);
210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0; i < length; ++ i)
211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            MethodDescriptor.writeExternal (methods [i], out);
213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // [m_hash and m_hasCompleteLineNumberInfo are transient data]
216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final String m_packageVMName; // in JVM format, no trailing '/' [never null]
222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final String m_name; // relative to (m_packageName + '/') [never null]
223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final long m_stamp;
224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final String m_srcFileName; // relative to (m_packageName + '/') [can be null]
225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final MethodDescriptor [] m_methods; // [never null, could be empty]
226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final boolean m_hasCompleteLineNumberInfo;
228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private transient int m_hash;
229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
232