View Javadoc
1   /*
2    * Copyright (c) 2000, 2012, 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  
25  package sun.jvm.hotspot.oops;
26  
27  import java.io.*;
28  import java.util.*;
29  import sun.jvm.hotspot.debugger.*;
30  import sun.jvm.hotspot.runtime.*;
31  import sun.jvm.hotspot.types.*;
32  import sun.jvm.hotspot.utilities.*;
33  
34  //  ConstantPoolCache : A constant pool cache (ConstantPoolCache).
35  //  See cpCache.hpp for details about this class.
36  //
37  public class ConstantPoolCache extends Metadata {
38    static {
39      VM.registerVMInitializedObserver(new Observer() {
40          public void update(Observable o, Object data) {
41            initialize(VM.getVM().getTypeDataBase());
42          }
43        });
44    }
45  
46    private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
47      Type type      = db.lookupType("ConstantPoolCache");
48      constants      = new MetadataField(type.getAddressField("_constant_pool"), 0);
49      baseOffset     = type.getSize();
50      Type elType    = db.lookupType("ConstantPoolCacheEntry");
51      elementSize    = elType.getSize();
52      length         = new CIntField(type.getCIntegerField("_length"), 0);
53      intSize        = VM.getVM().getObjectHeap().getIntSize();
54    }
55  
56    public ConstantPoolCache(Address addr) {
57      super(addr);
58    }
59  
60    public boolean isConstantPoolCache() { return true; }
61  
62    private static MetadataField constants;
63  
64    private static long baseOffset;
65    private static long elementSize;
66    private static CIntField length;
67    private static long intSize;
68  
69  
70    public ConstantPool getConstants() { return (ConstantPool) constants.getValue(this); }
71  
72    public long getSize() {
73      return Oop.alignObjectSize(baseOffset + getLength() * elementSize);
74    }
75  
76    public ConstantPoolCacheEntry getEntryAt(int i) {
77      if (i < 0 || i >= getLength()) throw new IndexOutOfBoundsException(i + " " + getLength());
78      return new ConstantPoolCacheEntry(this, i);
79    }
80  
81    public int getIntAt(int entry, int fld) {
82      //alignObjectSize ?
83      long offset = baseOffset + /*alignObjectSize*/entry * elementSize + fld * intSize;
84      return (int) getAddress().getCIntegerAt(offset, intSize, true );
85    }
86  
87  
88    public void printValueOn(PrintStream tty) {
89      tty.print("ConstantPoolCache for " + getConstants().getPoolHolder().getName().asString() + " address = " + getAddress() + " offset = " + baseOffset);
90    }
91  
92    public int getLength() {
93      return (int) length.getValue(getAddress());
94    }
95  
96    public void iterateFields(MetadataVisitor visitor) {
97      super.iterateFields(visitor);
98      visitor.doMetadata(constants, true);
99        for (int i = 0; i < getLength(); i++) {
100         ConstantPoolCacheEntry entry = getEntryAt(i);
101         entry.iterateFields(visitor);
102       }
103     }
104 };