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 }