1 /*
2 * Copyright 2008 Eric Caspole
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
5 * file except in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under
10 * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11 * KIND, either express or implied. See the License for the specific language governing
12 * permissions and limitations under the License.
13 */
14
15 package net.sf.madmap;
16
17 import java.io.*;
18 import java.util.*;
19
20 /**
21 * HprofArrayObject is the representation of a java array in the heap of the hprof
22 * target process.
23 *
24 * @author ecaspole
25 *
26 */
27 public class HprofArrayObject extends HprofHeapAllocation {
28 int _size;
29 int _nelems;
30 //long[] _elems = null;
31
32 public long size() { return _size; }
33
34 public HprofArrayObject( long addr, String type, int trace,
35 long size, long nelems, HprofClassElement cls_addr, ArrayList elems ) {
36 super( addr, trace, cls_addr );
37
38 // int is enough to store array size?
39 _nelems = (int) nelems;
40 _size = (int) size;
41 set_children( longArrayListtoLongArray( elems ) );
42 if ( children() != null ) {
43 assert ( elems.size() == children().length ) : "array elems are messed up" ;
44
45 /*
46 System.out.println( "### obj addr = " + Long.toHexString( addr ));
47 System.out.println( "### _type_of_elems = " + _type_of_elems );
48 System.out.println( "### elems.size() = " + elems.size() );
49 System.out.println( "### _elems.length = " + _elems.length );
50 System.out.println( "### _nelems = " + _nelems );
51 System.out.println( "### elems = " + elems );
52 */
53 // nelems includes the total size of the array including elements which are null,
54 // which are not listed in the file
55 assert ( children().length <= _nelems ) : "array elems are messed up" ;
56 }
57 }
58
59 //public String typeOfElems() {
60 // return class_addr().className();
61 //}
62
63 // The class name should come out of the table, it should be added when the plain class
64 // for this type of array was added
65 //public String className() {
66 //return class_addr().className();
67 //}
68
69 public String toString() {
70 StringBuffer p = new StringBuffer();
71
72 p.append( new String("ARR " + Long.toHexString(addr()) + "(sz=" + size() +
73 ", trace=" + getStackTrace() + ", nelems=" + _nelems + " elem type=" + class_addr().className() + ")" ));
74
75 if ( children() != null ) {
76 for (int i = 0; i < children().length; i++ ) {
77 Long id = (Long) children()[ i ];
78 p.append("\n");
79 p.append( new String(" [" + i + "]\t" + Long.toHexString( id )));
80 }
81 }
82 return p.toString();
83 }
84 }