Mercurial > hg > graal-jvmci-8
comparison agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java @ 3838:6a991dcb52bb
7012081: JSR 292: SA-JDI can't read MH/MT/Indy ConstantPool entries
Reviewed-by: kvn, twisti, jrose
author | never |
---|---|
date | Thu, 21 Jul 2011 08:38:25 -0700 |
parents | 6c97c830fb6f |
children | 38fd165da001 |
comparison
equal
deleted
inserted
replaced
3837:43f9d800f276 | 3838:6a991dcb52bb |
---|---|
210 } | 210 } |
211 return new int[] { extractLowShortFromInt(i), extractHighShortFromInt(i) }; | 211 return new int[] { extractLowShortFromInt(i), extractHighShortFromInt(i) }; |
212 } | 212 } |
213 | 213 |
214 public Symbol getNameRefAt(int which) { | 214 public Symbol getNameRefAt(int which) { |
215 int nameIndex = getNameAndTypeAt(getNameAndTypeRefIndexAt(which))[0]; | 215 return implGetNameRefAt(which, false); |
216 return getSymbolAt(nameIndex); | 216 } |
217 | |
218 private Symbol implGetNameRefAt(int which, boolean uncached) { | |
219 int signatureIndex = getNameRefIndexAt(implNameAndTypeRefIndexAt(which, uncached)); | |
220 return getSymbolAt(signatureIndex); | |
217 } | 221 } |
218 | 222 |
219 public Symbol getSignatureRefAt(int which) { | 223 public Symbol getSignatureRefAt(int which) { |
220 int sigIndex = getNameAndTypeAt(getNameAndTypeRefIndexAt(which))[1]; | 224 return implGetSignatureRefAt(which, false); |
221 return getSymbolAt(sigIndex); | 225 } |
226 | |
227 private Symbol implGetSignatureRefAt(int which, boolean uncached) { | |
228 int signatureIndex = getSignatureRefIndexAt(implNameAndTypeRefIndexAt(which, uncached)); | |
229 return getSymbolAt(signatureIndex); | |
230 } | |
231 | |
232 | |
233 private int implNameAndTypeRefIndexAt(int which, boolean uncached) { | |
234 int i = which; | |
235 if (!uncached && getCache() != null) { | |
236 if (ConstantPoolCache.isSecondaryIndex(which)) { | |
237 // Invokedynamic index. | |
238 int pool_index = getCache().getMainEntryAt(which).getConstantPoolIndex(); | |
239 pool_index = invokeDynamicNameAndTypeRefIndexAt(pool_index); | |
240 // assert(tagAt(pool_index).isNameAndType(), ""); | |
241 return pool_index; | |
242 } | |
243 // change byte-ordering and go via cache | |
244 i = remapInstructionOperandFromCache(which); | |
245 } else { | |
246 if (getTagAt(which).isInvokeDynamic()) { | |
247 int pool_index = invokeDynamicNameAndTypeRefIndexAt(which); | |
248 // assert(tag_at(pool_index).is_name_and_type(), ""); | |
249 return pool_index; | |
250 } | |
251 } | |
252 // assert(tag_at(i).is_field_or_method(), "Corrupted constant pool"); | |
253 // assert(!tag_at(i).is_invoke_dynamic(), "Must be handled above"); | |
254 int ref_index = getIntAt(i); | |
255 return extractHighShortFromInt(ref_index); | |
256 } | |
257 | |
258 private int remapInstructionOperandFromCache(int operand) { | |
259 int cpc_index = operand; | |
260 // DEBUG_ONLY(cpc_index -= CPCACHE_INDEX_TAG); | |
261 // assert((int)(u2)cpc_index == cpc_index, "clean u2"); | |
262 int member_index = getCache().getEntryAt(cpc_index).getConstantPoolIndex(); | |
263 return member_index; | |
264 } | |
265 | |
266 int invokeDynamicNameAndTypeRefIndexAt(int which) { | |
267 // assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool"); | |
268 return extractHighShortFromInt(getIntAt(which)); | |
222 } | 269 } |
223 | 270 |
224 // returns null, if not resolved. | 271 // returns null, if not resolved. |
225 public Klass getKlassRefAt(int which) { | 272 public Klass getKlassRefAt(int which) { |
226 if( ! getTagAt(which).isKlass()) return null; | 273 if( ! getTagAt(which).isKlass()) return null; |
251 Symbol sig = getSignatureRefAt(which); | 298 Symbol sig = getSignatureRefAt(which); |
252 return klass.findField(name, sig); | 299 return klass.findField(name, sig); |
253 } | 300 } |
254 | 301 |
255 public int getNameAndTypeRefIndexAt(int index) { | 302 public int getNameAndTypeRefIndexAt(int index) { |
256 int refIndex = getFieldOrMethodAt(index); | 303 return implNameAndTypeRefIndexAt(index, false); |
257 if (DEBUG) { | |
258 System.err.println("ConstantPool.getNameAndTypeRefIndexAt(" + index + "): refIndex = " + refIndex); | |
259 } | |
260 int i = extractHighShortFromInt(refIndex); | |
261 if (DEBUG) { | |
262 System.err.println("ConstantPool.getNameAndTypeRefIndexAt(" + index + "): result = " + i); | |
263 } | |
264 return i; | |
265 } | 304 } |
266 | 305 |
267 /** Lookup for entries consisting of (name_index, signature_index) */ | 306 /** Lookup for entries consisting of (name_index, signature_index) */ |
268 public int getNameRefIndexAt(int index) { | 307 public int getNameRefIndexAt(int index) { |
269 int[] refIndex = getNameAndTypeAt(index); | 308 int[] refIndex = getNameAndTypeAt(index); |