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: MethodDescriptor.java,v 1.1.1.1.2.1 2004/07/10 03:34:52 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.IntObjectMap;
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.IntSet;
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.asserts.$assert;
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2003
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectfinal class MethodDescriptor implements IConstants, IMetadataConstants, Serializable
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // need a separate 'blockCount' parm because 'blockMap' could be null
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // and for a class that is never loaded I can't find out the number of
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // blocks for block coverage reporting
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public MethodDescriptor (final String name, final String descriptor, final int status,
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                             final int [] blockSizes, final int [][] blockMap, final int firstLine)
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (name == null)
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new IllegalArgumentException ("null input: name");
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (descriptor == null)
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new IllegalArgumentException ("null input: descriptor");
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ((status & METHOD_NO_BLOCK_DATA) == 0)
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // block metadata is available: blockCount must be positive
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final int blockCount = blockSizes.length;
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if ($assert.ENABLED) $assert.ASSERT (blockCount > 0, "blockCount must be positive: " + blockCount);
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_blockSizes = blockSizes;
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if ((status & METHOD_NO_LINE_DATA) == 0)
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // line metadata is available: blockMap must not be null or empty
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if ($assert.ENABLED) $assert.ASSERT (firstLine > 0, "firstLine must be positive: " + firstLine);
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if ((blockMap == null) || (blockMap.length == 0))
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    throw new IllegalArgumentException ("null or empty input: blockMap");
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if ($assert.ENABLED)
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    $assert.ASSERT (blockCount == blockMap.length, "blockCount " + blockCount + " != blockMap.length " + blockMap.length);
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    for (int i = 0; i < blockMap.length; ++ i)
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        $assert.ASSERT (blockMap [i] != null, "blockMap[" + i + "] is null");
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        // note: it is legal for blockMap [i] to be empty
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_blockMap = blockMap;
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_firstLine = firstLine;
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_blockMap = null;
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_firstLine = 0;
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_blockSizes = null;
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_blockMap = null;
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_firstLine = 0;
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_name = name;
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_descriptor = descriptor;
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_status = status;
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public String getName ()
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_name;
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public String getDescriptor ()
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_descriptor;
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public int getStatus ()
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_status;
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public int getBlockCount ()
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_blockSizes.length;
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public int [] getBlockSizes ()
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_blockSizes;
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public int [][] getBlockMap ()
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_blockMap;
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public IntObjectMap /* line no->int[](blockIDs) */ getLineMap ()
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        IntObjectMap lineMap = m_lineMap;
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (lineMap != null)
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return lineMap;
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else if ((m_status & METHOD_NO_LINE_DATA) == 0)
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // construct reverse line->block ID mapping:
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            lineMap = new IntObjectMap ();
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final int [][] blockMap = m_blockMap;
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (int bl = 0, blCount = blockMap.length; bl < blCount; ++ bl)
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final int [] lines = blockMap [bl];
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (lines != null)
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    final int lineCount = lines.length;
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    for (int l = 0; l < lineCount; ++ l)
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final int line = lines [l];
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        IntSet blockIDs = (IntSet) lineMap.get (line);
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        if (blockIDs == null)
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        {
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            blockIDs = new IntSet ();
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            lineMap.put (line, blockIDs);
151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        }
152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        blockIDs.add (bl);
154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final int [] lines = lineMap.keys ();
159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (int l = 0, lineCount = lines.length; l < lineCount; ++ l)
160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final int line = lines [l];
162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final int [] blockIDs = ((IntSet) lineMap.get (line)).values ();
163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if ($assert.ENABLED) $assert.ASSERT (blockIDs != null && blockIDs.length > 0, "wrong line mapping for line #" + line);
164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                lineMap.put (line, blockIDs); // overwrite IntSet as the value
166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_lineMap = lineMap;
169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return lineMap;
171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return null;
174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public int getFirstLine ()
177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_firstLine;
179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public boolean hasLineNumberInfo ()
182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return (m_status & METHOD_NO_LINE_DATA) == 0;
184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public String toString ()
188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return toString ("");
190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public String toString (final String indent)
193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        StringBuffer s = new StringBuffer (indent + "method [" + m_name + "] descriptor:");
195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ((m_status & METHOD_NO_LINE_DATA) == 0)
197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (int bl = 0; bl < m_blockMap.length; ++ bl)
199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                s.append (EOL);
201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                s.append (indent + INDENT_INCREMENT + "block " + bl + " (" + m_blockSizes [bl] + " instrs) : ");
202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final int [] lines = m_blockMap [bl];
204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                for (int l = 0; l < lines.length; ++ l)
205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if (l != 0) s.append (", ");
207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    s.append (lines [l]);
208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            s.append (EOL);
211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            s.append (indent + INDENT_INCREMENT + "---");
212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final int [] lines = m_lineMap.keys ();
214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (int l = 0; l < lines.length; ++ l)
215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                s.append (EOL);
217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                s.append (indent + INDENT_INCREMENT + "line " + lines [l] + ": ");
218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final int [] blocks = (int []) m_lineMap.get (lines [l]);
220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                for (int bl = 0; bl < blocks.length; ++ bl)
221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if (bl != 0) s.append (", ");
223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    s.append (blocks [bl]);
224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            s.append (" <no line info>");
230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
232f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return s.toString ();
233f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
234f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
235f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
236f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
237f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
238f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
239f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
240f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    static MethodDescriptor readExternal (final DataInput in)
241f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
242f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
243f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final String name = in.readUTF ();
244f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final String descriptor = in.readUTF ();
245f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
246f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int status = in.readInt ();
247f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
248f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        int [] blockSizes = null;
249f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        int [][] blockMap = null;
250f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        int firstLine = 0;
251f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
252f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ((status & METHOD_NO_BLOCK_DATA) == 0)
253f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
254f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // blockSizes must be set:
255f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
256f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            blockSizes = DataFactory.readIntArray (in);
257f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
258f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if ((status & METHOD_NO_LINE_DATA) == 0)
259f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
260f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // blockMap, lineMap, firstLine must be set:
261f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
262f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final int length = in.readInt ();
263f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                blockMap = new int [length][];
264f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
265f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                for (int i = 0; i < length; ++ i)
266f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
267f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    blockMap [i] = DataFactory.readIntArray (in);
268f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
269f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
270f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                firstLine = in.readInt ();
271f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
272f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // [lineMap is transient data]
273f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
274f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
275f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
276f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return new MethodDescriptor (name, descriptor, status, blockSizes, blockMap, firstLine);
277f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
278f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
279f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    static void writeExternal (final MethodDescriptor method, final DataOutput out)
280f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
281f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
282f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.writeUTF (method.m_name);
283f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.writeUTF (method.m_descriptor);
284f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
285f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int status = method.m_status;
286f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.writeInt (status);
287f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
288f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ((status & METHOD_NO_BLOCK_DATA) == 0)
289f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
290f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // blockSizes must be set:
291f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
292f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            DataFactory.writeIntArray (method.m_blockSizes, out);
293f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
294f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if ((status & METHOD_NO_LINE_DATA) == 0)
295f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
296f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // blockMap, lineMap, firstLine must be set:
297f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
298f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final int [][] blockMap = method.m_blockMap;
299f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final int length = blockMap.length;
300f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                out.writeInt (length);
301f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
302f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                for (int i = 0; i < length; ++ i)
303f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
304f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    DataFactory.writeIntArray (blockMap [i], out);
305f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
306f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
307f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                out.writeInt (method.m_firstLine);
308f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
309f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // [lineMap is transient data]
310f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
311f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
312f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
313f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
314f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
315f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
316f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
317f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final String m_name; // internal JVM name (<init>, <clinit> for initializers, etc) [never null]
318f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final String m_descriptor; // [never null]
319f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final int m_status; // excluded, no debug data, etc
320f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final int [] m_blockSizes; // always of positive length if ((status & METHOD_NO_BLOCK_DATA) == 0)
321f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final int [][] m_blockMap; // [never null or empty if status is ...]
322f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final int m_firstLine; // 0 if not src line info is available
323f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
324f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private IntObjectMap /* line no->int[](blockIDs) */  m_lineMap; // created lazily [could be empty if status ...]
325f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
326f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
327f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
328