Mercurial > hg > truffle
diff agent/src/share/classes/sun/jvm/hotspot/memory/SymbolTable.java @ 0:a61af66fc99e jdk7-b24
Initial load
author | duke |
---|---|
date | Sat, 01 Dec 2007 00:00:00 +0000 |
parents | |
children | c18cbe5936b8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/agent/src/share/classes/sun/jvm/hotspot/memory/SymbolTable.java Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,122 @@ +/* + * Copyright 2001-2005 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package sun.jvm.hotspot.memory; + +import java.io.*; +import java.util.*; +import sun.jvm.hotspot.debugger.*; +import sun.jvm.hotspot.oops.*; +import sun.jvm.hotspot.types.*; +import sun.jvm.hotspot.runtime.*; +import sun.jvm.hotspot.utilities.*; + +public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable { + static { + VM.registerVMInitializedObserver(new Observer() { + public void update(Observable o, Object data) { + initialize(VM.getVM().getTypeDataBase()); + } + }); + } + + private static synchronized void initialize(TypeDataBase db) { + Type type = db.lookupType("SymbolTable"); + theTableField = type.getAddressField("_the_table"); + symbolTableSize = db.lookupIntConstant("SymbolTable::symbol_table_size").intValue(); + } + + // Fields + private static AddressField theTableField; + private static int symbolTableSize; + + // Accessors + public static SymbolTable getTheTable() { + Address tmp = theTableField.getValue(); + return (SymbolTable) VMObjectFactory.newObject(SymbolTable.class, tmp); + } + + public static int getSymbolTableSize() { + return symbolTableSize; + } + + public SymbolTable(Address addr) { + super(addr); + } + + /** Clone of VM's "temporary" probe routine, as the SA currently + does not support mutation so lookup() would have no effect + anyway. Returns null if the given string is not in the symbol + table. */ + public Symbol probe(String name) { + try { + return probe(toModifiedUTF8Bytes(name)); + } catch (IOException e) { + return null; + } + } + + /** Clone of VM's "temporary" probe routine, as the SA currently + does not support mutation so lookup() would have no effect + anyway. Returns null if the given string is not in the symbol + table. */ + public Symbol probe(byte[] name) { + long hashValue = hashSymbol(name); + for (HashtableEntry e = (HashtableEntry) bucket(hashToIndex(hashValue)); e != null; e = (HashtableEntry) e.next()) { + if (e.hash() == hashValue) { + Symbol sym = (Symbol) e.literal(); + if (sym.equals(name)) { + return sym; + } + } + } + return null; + } + + public interface SymbolVisitor { + public void visit(Symbol sym); + } + + public void symbolsDo(SymbolVisitor visitor) { + int numBuckets = tableSize(); + for (int i = 0; i < numBuckets; i++) { + for (HashtableEntry e = (HashtableEntry) bucket(i); e != null; + e = (HashtableEntry) e.next()) { + visitor.visit((Symbol) e.literal()); + } + } + } + + private static byte[] toModifiedUTF8Bytes(String name) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + dos.writeUTF(name); + dos.flush(); + byte[] buf = baos.toByteArray(); + byte[] res = new byte[buf.length - 2]; + // skip the length part + System.arraycopy(buf, 2, res, 0, res.length); + return res; + } +}