1 /* 2 * Copyright 2000-2005 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 20 * CA 95054 USA or visit www.sun.com if you need additional information or 21 * have any questions. 22 * 23 */ 24 25 package sun.jvm.hotspot.code; 26 27 import java.util.*; 28 29 import sun.jvm.hotspot.debugger.*; 30 import sun.jvm.hotspot.runtime.VM; 31 import sun.jvm.hotspot.utilities.*; 32 33 public class DebugInfoReadStream extends CompressedReadStream { 34 private NMethod code; 35 private int InvocationEntryBCI; 36 private List objectPool; // ArrayList<ObjectValue> 37 38 public DebugInfoReadStream(NMethod code, int offset) { 39 super(code.scopesDataBegin(), offset); 40 InvocationEntryBCI = VM.getVM().getInvocationEntryBCI(); 41 this.code = code; 42 this.objectPool = null; 43 } 44 45 public DebugInfoReadStream(NMethod code, int offset, List objectPool) { 46 super(code.scopesDataBegin(), offset); 47 InvocationEntryBCI = VM.getVM().getInvocationEntryBCI(); 48 this.code = code; 49 this.objectPool = objectPool; 50 } 51 52 public OopHandle readOopHandle() { 53 return code.getOopAt(readInt()); 54 } 55 56 ScopeValue readObjectValue() { 57 int id = readInt(); 58 if (Assert.ASSERTS_ENABLED) { 59 Assert.that(objectPool != null, "object pool does not exist"); 60 for (Iterator itr = objectPool.iterator(); itr.hasNext();) { 61 ObjectValue ov = (ObjectValue) itr.next(); 62 Assert.that(ov.id() != id, "should not be read twice"); 63 } 64 } 65 ObjectValue result = new ObjectValue(id); 66 // Cache the object since an object field could reference it. 67 objectPool.add(result); 68 result.readObject(this); 69 return result; 70 } 71 72 ScopeValue getCachedObject() { 73 int id = readInt(); 74 Assert.that(objectPool != null, "object pool does not exist"); 75 for (Iterator itr = objectPool.iterator(); itr.hasNext();) { 76 ObjectValue ov = (ObjectValue) itr.next(); 77 if (ov.id() == id) { 78 return ov; 79 } 80 } 81 Assert.that(false, "should not reach here"); 82 return null; 83 } 84 85 public int readBCI() { 86 return readInt() + InvocationEntryBCI; 87 } 88 }