Mercurial > hg > graal-compiler
comparison src/share/vm/oops/constantPool.cpp @ 12264:b2e698d2276c
8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
Summary: Enhance method resolution and resulting data structures, plus some refactoring.
Reviewed-by: twisti, acorn, jrose
author | drchase |
---|---|
date | Fri, 13 Sep 2013 22:38:02 -0400 |
parents | e0c9a1d29eb4 |
children | a7609ec351d6 |
comparison
equal
deleted
inserted
replaced
12261:2c98370f2611 | 12264:b2e698d2276c |
---|---|
391 } | 391 } |
392 | 392 |
393 | 393 |
394 Klass* ConstantPool::klass_ref_at_if_loaded(constantPoolHandle this_oop, int which) { | 394 Klass* ConstantPool::klass_ref_at_if_loaded(constantPoolHandle this_oop, int which) { |
395 return klass_at_if_loaded(this_oop, this_oop->klass_ref_index_at(which)); | 395 return klass_at_if_loaded(this_oop, this_oop->klass_ref_index_at(which)); |
396 } | |
397 | |
398 | |
399 // This is an interface for the compiler that allows accessing non-resolved entries | |
400 // in the constant pool - but still performs the validations tests. Must be used | |
401 // in a pre-parse of the compiler - to determine what it can do and not do. | |
402 // Note: We cannot update the ConstantPool from the vm_thread. | |
403 Klass* ConstantPool::klass_ref_at_if_loaded_check(constantPoolHandle this_oop, int index, TRAPS) { | |
404 int which = this_oop->klass_ref_index_at(index); | |
405 CPSlot entry = this_oop->slot_at(which); | |
406 if (entry.is_resolved()) { | |
407 assert(entry.get_klass()->is_klass(), "must be"); | |
408 return entry.get_klass(); | |
409 } else { | |
410 assert(entry.is_unresolved(), "must be either symbol or klass"); | |
411 Symbol* name = entry.get_symbol(); | |
412 oop loader = this_oop->pool_holder()->class_loader(); | |
413 oop protection_domain = this_oop->pool_holder()->protection_domain(); | |
414 Handle h_loader(THREAD, loader); | |
415 Handle h_prot (THREAD, protection_domain); | |
416 KlassHandle k(THREAD, SystemDictionary::find(name, h_loader, h_prot, THREAD)); | |
417 | |
418 // Do access check for klasses | |
419 if( k.not_null() ) verify_constant_pool_resolve(this_oop, k, CHECK_NULL); | |
420 return k(); | |
421 } | |
422 } | 396 } |
423 | 397 |
424 | 398 |
425 Method* ConstantPool::method_at_if_loaded(constantPoolHandle cpool, | 399 Method* ConstantPool::method_at_if_loaded(constantPoolHandle cpool, |
426 int which) { | 400 int which) { |