Mercurial > hg > truffle
annotate agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLoadConstant.java @ 6725:da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author | coleenp |
---|---|
date | Sat, 01 Sep 2012 13:25:18 -0400 |
parents | 2090c623107e |
children |
rev | line source |
---|---|
0 | 1 /* |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
2 * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. |
0 | 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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 package sun.jvm.hotspot.interpreter; | |
26 | |
27 import sun.jvm.hotspot.oops.*; | |
1602 | 28 import sun.jvm.hotspot.runtime.*; |
0 | 29 import sun.jvm.hotspot.utilities.*; |
30 | |
3838
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
31 public class BytecodeLoadConstant extends Bytecode { |
0 | 32 BytecodeLoadConstant(Method method, int bci) { |
33 super(method, bci); | |
34 } | |
35 | |
1602 | 36 public boolean hasCacheIndex() { |
37 // normal ldc uses CP index, but fast_aldc uses swapped CP cache index | |
3838
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
38 return code() >= Bytecodes.number_of_java_codes; |
1602 | 39 } |
40 | |
3838
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
41 int rawIndex() { |
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
42 if (javaCode() == Bytecodes._ldc) |
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
43 return getIndexU1(); |
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
44 else |
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
45 return getIndexU2(code(), false); |
1602 | 46 } |
47 | |
48 public int poolIndex() { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
49 int index = rawIndex(); |
1602 | 50 if (hasCacheIndex()) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
51 return method().getConstants().objectToCPIndex(index); |
1602 | 52 } else { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
53 return index; |
1602 | 54 } |
55 } | |
56 | |
57 public int cacheIndex() { | |
58 if (hasCacheIndex()) { | |
3838
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
59 return rawIndex(); |
1602 | 60 } else { |
61 return -1; // no cache index | |
62 } | |
63 } | |
64 | |
3838
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
65 public BasicType resultType() { |
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
66 int index = poolIndex(); |
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
67 ConstantTag tag = method().getConstants().getTagAt(index); |
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
68 return tag.basicType(); |
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
69 } |
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
70 |
1602 | 71 private Oop getCachedConstant() { |
72 int i = cacheIndex(); | |
73 if (i >= 0) { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
74 throw new InternalError("invokedynamic not implemented yet"); |
1602 | 75 } |
76 return null; | |
0 | 77 } |
78 | |
79 public void verify() { | |
80 if (Assert.ASSERTS_ENABLED) { | |
81 Assert.that(isValid(), "check load constant"); | |
82 } | |
83 } | |
84 | |
85 public boolean isValid() { | |
86 int jcode = javaCode(); | |
87 boolean codeOk = jcode == Bytecodes._ldc || jcode == Bytecodes._ldc_w || | |
88 jcode == Bytecodes._ldc2_w; | |
89 if (! codeOk) return false; | |
90 | |
3904
2090c623107e
7016881: JSR 292: JDI: sun.jvm.hotspot.utilities.AssertionFailure: index out of bounds
never
parents:
3838
diff
changeset
|
91 ConstantTag ctag = method().getConstants().getTagAt(poolIndex()); |
0 | 92 if (jcode == Bytecodes._ldc2_w) { |
93 // has to be double or long | |
94 return (ctag.isDouble() || ctag.isLong()) ? true: false; | |
95 } else { | |
96 // has to be int or float or String or Klass | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
97 return (ctag.isString() |
0 | 98 || ctag.isUnresolvedKlass() || ctag.isKlass() |
1602 | 99 || ctag.isMethodHandle() || ctag.isMethodType() |
0 | 100 || ctag.isInt() || ctag.isFloat())? true: false; |
101 } | |
102 } | |
103 | |
104 public boolean isKlassConstant() { | |
105 int jcode = javaCode(); | |
106 if (jcode == Bytecodes._ldc2_w) { | |
107 return false; | |
108 } | |
109 | |
3838
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
110 ConstantTag ctag = method().getConstants().getTagAt(poolIndex()); |
0 | 111 return ctag.isKlass() || ctag.isUnresolvedKlass(); |
112 } | |
113 | |
114 // return Symbol (if unresolved) or Klass (if resolved) | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1913
diff
changeset
|
115 public Object getKlass() { |
0 | 116 if (Assert.ASSERTS_ENABLED) { |
117 Assert.that(isKlassConstant(), "not a klass literal"); | |
118 } | |
119 // tag change from 'unresolved' to 'klass' does not happen atomically. | |
120 // We just look at the object at the corresponding index and | |
121 // decide based on the oop type. | |
122 ConstantPool cpool = method().getConstants(); | |
3838
6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
never
parents:
2426
diff
changeset
|
123 int cpIndex = poolIndex(); |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1913
diff
changeset
|
124 ConstantPool.CPSlot oop = cpool.getSlotAt(cpIndex); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
125 if (oop.isResolved()) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
126 return oop.getKlass(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
127 } else if (oop.isUnresolved()) { |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1913
diff
changeset
|
128 return oop.getSymbol(); |
0 | 129 } else { |
130 throw new RuntimeException("should not reach here"); | |
131 } | |
132 } | |
133 | |
134 public static BytecodeLoadConstant at(Method method, int bci) { | |
135 BytecodeLoadConstant b = new BytecodeLoadConstant(method, bci); | |
136 if (Assert.ASSERTS_ENABLED) { | |
137 b.verify(); | |
138 } | |
139 return b; | |
140 } | |
141 | |
142 /** Like at, but returns null if the BCI is not at ldc or ldc_w or ldc2_w */ | |
143 public static BytecodeLoadConstant atCheck(Method method, int bci) { | |
144 BytecodeLoadConstant b = new BytecodeLoadConstant(method, bci); | |
145 return (b.isValid() ? b : null); | |
146 } | |
147 | |
148 public static BytecodeLoadConstant at(BytecodeStream bcs) { | |
149 return new BytecodeLoadConstant(bcs.method(), bcs.bci()); | |
150 } | |
151 | |
152 public String getConstantValue() { | |
153 ConstantPool cpool = method().getConstants(); | |
1602 | 154 int cpIndex = poolIndex(); |
0 | 155 ConstantTag ctag = cpool.getTagAt(cpIndex); |
156 if (ctag.isInt()) { | |
157 return "<int " + Integer.toString(cpool.getIntAt(cpIndex)) +">"; | |
158 } else if (ctag.isLong()) { | |
159 return "<long " + Long.toString(cpool.getLongAt(cpIndex)) + "L>"; | |
160 } else if (ctag.isFloat()) { | |
161 return "<float " + Float.toString(cpool.getFloatAt(cpIndex)) + "F>"; | |
162 } else if (ctag.isDouble()) { | |
163 return "<double " + Double.toString(cpool.getDoubleAt(cpIndex)) + "D>"; | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
164 } else if (ctag.isString()) { |
0 | 165 // tag change from 'unresolved' to 'string' does not happen atomically. |
166 // We just look at the object at the corresponding index and | |
167 // decide based on the oop type. | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
168 Symbol sym = cpool.getUnresolvedStringAt(cpIndex); |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1913
diff
changeset
|
169 return "<String \"" + sym.asString() + "\">"; |
0 | 170 } else if (ctag.isKlass() || ctag.isUnresolvedKlass()) { |
171 // tag change from 'unresolved' to 'klass' does not happen atomically. | |
172 // We just look at the object at the corresponding index and | |
173 // decide based on the oop type. | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1913
diff
changeset
|
174 ConstantPool.CPSlot obj = cpool.getSlotAt(cpIndex); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
175 if (obj.isResolved()) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
176 Klass k = obj.getKlass(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
177 return "<Class " + k.getName().asString() + "@" + k.getAddress() + ">"; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3904
diff
changeset
|
178 } else if (obj.isUnresolved()) { |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1913
diff
changeset
|
179 Symbol sym = obj.getSymbol(); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1913
diff
changeset
|
180 return "<Class " + sym.asString() + ">"; |
0 | 181 } else { |
182 throw new RuntimeException("should not reach here"); | |
183 } | |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
184 } else if (ctag.isMethodHandle()) { |
1602 | 185 Oop x = getCachedConstant(); |
186 int refidx = cpool.getMethodHandleIndexAt(cpIndex); | |
187 int refkind = cpool.getMethodHandleRefKindAt(cpIndex); | |
188 return "<MethodHandle kind=" + Integer.toString(refkind) + | |
189 " ref=" + Integer.toString(refidx) | |
190 + (x == null ? "" : " @" + x.getHandle()) + ">"; | |
191 } else if (ctag.isMethodType()) { | |
192 Oop x = getCachedConstant(); | |
193 int refidx = cpool.getMethodTypeIndexAt(cpIndex); | |
194 return "<MethodType " + cpool.getSymbolAt(refidx).asString() | |
195 + (x == null ? "" : " @" + x.getHandle()) + ">"; | |
0 | 196 } else { |
197 if (Assert.ASSERTS_ENABLED) { | |
198 Assert.that(false, "invalid load constant type"); | |
199 } | |
200 return null; | |
201 } | |
202 } | |
203 | |
204 public String toString() { | |
205 StringBuffer buf = new StringBuffer(); | |
206 buf.append(getJavaBytecodeName()); | |
207 buf.append(spaces); | |
208 buf.append('#'); | |
1602 | 209 buf.append(Integer.toString(poolIndex())); |
210 if (hasCacheIndex()) { | |
211 buf.append('('); | |
212 buf.append(Integer.toString(cacheIndex())); | |
213 buf.append(')'); | |
214 } | |
0 | 215 buf.append(spaces); |
216 buf.append(getConstantValue()); | |
217 if (code() != javaCode()) { | |
218 buf.append(spaces); | |
219 buf.append('['); | |
220 buf.append(getBytecodeName()); | |
221 buf.append(']'); | |
222 } | |
223 return buf.toString(); | |
224 } | |
225 } |