ObjArray.java revision 9883:903a2e023ffb
1/* 2 * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25package sun.jvm.hotspot.oops; 26 27import java.io.*; 28import java.util.*; 29import sun.jvm.hotspot.debugger.*; 30import sun.jvm.hotspot.runtime.*; 31import sun.jvm.hotspot.types.*; 32 33// An ObjArray is an array containing oops 34 35public class ObjArray extends Array { 36 static { 37 VM.registerVMInitializedObserver(new Observer() { 38 public void update(Observable o, Object data) { 39 initialize(VM.getVM().getTypeDataBase()); 40 } 41 }); 42 } 43 44 private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { 45 Type type = db.lookupType("objArrayOopDesc"); 46 elementSize = VM.getVM().getHeapOopSize(); 47 } 48 49 ObjArray(OopHandle handle, ObjectHeap heap) { 50 super(handle, heap); 51 } 52 53 public boolean isObjArray() { return true; } 54 55 private static long elementSize; 56 57 public OopHandle getOopHandleAt(long index) { 58 long offset = baseOffsetInBytes(BasicType.T_OBJECT) + (index * elementSize); 59 if (VM.getVM().isCompressedOopsEnabled()) { 60 return getHandle().getCompOopHandleAt(offset); 61 } else { 62 return getHandle().getOopHandleAt(offset); 63 } 64 } 65 66 public Oop getObjAt(long index) { 67 return getHeap().newOop(getOopHandleAt(index)); 68 } 69 70 public void printValueOn(PrintStream tty) { 71 tty.print("ObjArray"); 72 } 73 74 public void iterateFields(OopVisitor visitor, boolean doVMFields) { 75 super.iterateFields(visitor, doVMFields); 76 int length = (int) getLength(); 77 long baseOffset = baseOffsetInBytes(BasicType.T_OBJECT); 78 for (int index = 0; index < length; index++) { 79 long offset = baseOffset + (index * elementSize); 80 OopField field; 81 if (VM.getVM().isCompressedOopsEnabled()) { 82 field = new NarrowOopField(new IndexableFieldIdentifier(index), offset, false); 83 } else { 84 field = new OopField(new IndexableFieldIdentifier(index), offset, false); 85 } 86 visitor.doOop(field, false); 87 } 88 } 89} 90