comparison agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java @ 113:ba764ed4b6f2

6420645: Create a vm that uses compressed oops for up to 32gb heapsizes Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author coleenp
date Sun, 13 Apr 2008 17:43:42 -0400
parents a61af66fc99e
children d1605aabd0a1
comparison
equal deleted inserted replaced
110:a49a647afe9a 113:ba764ed4b6f2
29 import sun.jvm.hotspot.debugger.*; 29 import sun.jvm.hotspot.debugger.*;
30 import sun.jvm.hotspot.runtime.*; 30 import sun.jvm.hotspot.runtime.*;
31 import sun.jvm.hotspot.types.*; 31 import sun.jvm.hotspot.types.*;
32 import sun.jvm.hotspot.utilities.*; 32 import sun.jvm.hotspot.utilities.*;
33 33
34 // A ConstantPool is an array containing class constants 34 // A ConstantPool is an oop containing class constants
35 // as described in the class file 35 // as described in the class file
36 36
37 public class ConstantPool extends Array implements ClassConstants { 37 public class ConstantPool extends Oop implements ClassConstants {
38 // Used for debugging this code 38 // Used for debugging this code
39 private static final boolean DEBUG = false; 39 private static final boolean DEBUG = false;
40 40
41 protected void debugMessage(String message) { 41 protected void debugMessage(String message) {
42 System.out.println(message); 42 System.out.println(message);
53 private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { 53 private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
54 Type type = db.lookupType("constantPoolOopDesc"); 54 Type type = db.lookupType("constantPoolOopDesc");
55 tags = new OopField(type.getOopField("_tags"), 0); 55 tags = new OopField(type.getOopField("_tags"), 0);
56 cache = new OopField(type.getOopField("_cache"), 0); 56 cache = new OopField(type.getOopField("_cache"), 0);
57 poolHolder = new OopField(type.getOopField("_pool_holder"), 0); 57 poolHolder = new OopField(type.getOopField("_pool_holder"), 0);
58 length = new CIntField(type.getCIntegerField("_length"), 0);
58 headerSize = type.getSize(); 59 headerSize = type.getSize();
59 elementSize = db.getOopSize(); 60 elementSize = 0;
60 } 61 }
61 62
62 ConstantPool(OopHandle handle, ObjectHeap heap) { 63 ConstantPool(OopHandle handle, ObjectHeap heap) {
63 super(handle, heap); 64 super(handle, heap);
64 } 65 }
66 public boolean isConstantPool() { return true; } 67 public boolean isConstantPool() { return true; }
67 68
68 private static OopField tags; 69 private static OopField tags;
69 private static OopField cache; 70 private static OopField cache;
70 private static OopField poolHolder; 71 private static OopField poolHolder;
71 72 private static CIntField length; // number of elements in oop
72 73
73 private static long headerSize; 74 private static long headerSize;
74 private static long elementSize; 75 private static long elementSize;
75 76
76 public TypeArray getTags() { return (TypeArray) tags.getValue(this); } 77 public TypeArray getTags() { return (TypeArray) tags.getValue(this); }
77 public ConstantPoolCache getCache() { return (ConstantPoolCache) cache.getValue(this); } 78 public ConstantPoolCache getCache() { return (ConstantPoolCache) cache.getValue(this); }
78 public Klass getPoolHolder() { return (Klass) poolHolder.getValue(this); } 79 public Klass getPoolHolder() { return (Klass) poolHolder.getValue(this); }
80 public int getLength() { return (int)length.getValue(this); }
81
82 private long getElementSize() {
83 if (elementSize !=0 ) {
84 return elementSize;
85 } else {
86 elementSize = VM.getVM().getOopSize();
87 }
88 return elementSize;
89 }
79 90
80 private long indexOffset(long index) { 91 private long indexOffset(long index) {
81 if (Assert.ASSERTS_ENABLED) { 92 if (Assert.ASSERTS_ENABLED) {
82 Assert.that(index > 0 && index < getLength(), "invalid cp index"); 93 Assert.that(index > 0 && index < getLength(), "invalid cp index " + index + " " + getLength());
83 } 94 }
84 return (index * elementSize) + headerSize; 95 return (index * getElementSize()) + headerSize;
85 } 96 }
86 97
87 public ConstantTag getTagAt(long index) { 98 public ConstantTag getTagAt(long index) {
88 return new ConstantTag(getTags().getByteAt((int) index)); 99 return new ConstantTag(getTags().getByteAt((int) index));
89 } 100 }
462 public void printValueOn(PrintStream tty) { 473 public void printValueOn(PrintStream tty) {
463 tty.print("ConstantPool for " + getPoolHolder().getName().asString()); 474 tty.print("ConstantPool for " + getPoolHolder().getName().asString());
464 } 475 }
465 476
466 public long getObjectSize() { 477 public long getObjectSize() {
467 return alignObjectSize(headerSize + (getLength() * elementSize)); 478 return alignObjectSize(headerSize + (getLength() * getElementSize()));
468 } 479 }
469 480
470 //---------------------------------------------------------------------- 481 //----------------------------------------------------------------------
471 // Internals only below this point 482 // Internals only below this point
472 // 483 //