01: /*
02: * @(#)CVMMemberNameEntry.java 1.8 06/10/10
03: *
04: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
05: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
06: *
07: * This program is free software; you can redistribute it and/or
08: * modify it under the terms of the GNU General Public License version
09: * 2 only, as published by the Free Software Foundation.
10: *
11: * This program is distributed in the hope that it will be useful, but
12: * WITHOUT ANY WARRANTY; without even the implied warranty of
13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: * General Public License version 2 for more details (a copy is
15: * included at /legal/license.txt).
16: *
17: * You should have received a copy of the GNU General Public License
18: * version 2 along with this work; if not, write to the Free Software
19: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20: * 02110-1301 USA
21: *
22: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
23: * Clara, CA 95054 or visit www.sun.com if you need additional
24: * information or have any questions.
25: *
26: */
27: package vm;
28:
29: import java.util.Vector;
30:
31: /*
32: * Collect member names. Turn them into little integers.
33: * Build a hash table of them for writing out to the romjava image.
34: */
35: public class CVMMemberNameEntry {
36: /* instance members */
37: public String name;
38: public CVMMemberNameEntry next;
39: public int entryNo;
40:
41: /* static members */
42: public final static int NMEMBERNAMEHASH = 41 * 13;
43: public static CVMMemberNameEntry hash[] = new CVMMemberNameEntry[NMEMBERNAMEHASH];
44: static int nextEntryNo = 0;
45: public static Vector table = new Vector();
46:
47: /* constructor &c */
48:
49: static synchronized void enlist(CVMMemberNameEntry x, int xhash) {
50: x.entryNo = nextEntryNo++;
51: table.addElement(x);
52: x.next = hash[xhash];
53: hash[xhash] = x;
54: }
55:
56: CVMMemberNameEntry(String myname, int myhash) {
57: name = myname;
58: enlist(this , myhash);
59: }
60:
61: /* static methods */
62: /*
63: * We use a very simple minded name hashing scheme.
64: * Based on the LAST few letters of the name, which are
65: * the most likely to differ, I believe.
66: * Same as for CVMDataType.
67: */
68: public static int computeHash(String name) {
69: int v = 0;
70: int t = name.length();
71: int n = Math.min(t, 7);
72: t -= n;
73: while (n-- > 0) {
74: v = (v * 19) + name.charAt(t + n) - '/';
75: }
76: return v;
77: }
78:
79: public static int lookupEnter(String name) {
80: int hval = (int) (((long) (computeHash(name)) & 0xffffffffL) % NMEMBERNAMEHASH);
81: name = name.intern();
82: CVMMemberNameEntry mne;
83: for (mne = hash[hval]; mne != null; mne = mne.next) {
84: if (mne.name == name)
85: return mne.entryNo;
86: }
87: return new CVMMemberNameEntry(name, hval).entryNo;
88: }
89:
90: public static int tableSize() {
91: return nextEntryNo;
92: }
93: }
|