View Javadoc

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  }