< prev index next >
src/hotspot/share/ci/ciField.cpp
Print this page
rev 50604 : imported patch jep181-rev1
rev 50606 : imported patch jep181-rev3
@@ -68,50 +68,50 @@
// ------------------------------------------------------------------
// ciField::ciField
ciField::ciField(ciInstanceKlass* klass, int index) :
_known_to_link_with_put(NULL), _known_to_link_with_get(NULL) {
ASSERT_IN_VM;
- CompilerThread *thread = CompilerThread::current();
+ CompilerThread *THREAD = CompilerThread::current();
assert(ciObjectFactory::is_initialized(), "not a shared field");
assert(klass->get_instanceKlass()->is_linked(), "must be linked before using its constant-pool");
- constantPoolHandle cpool(thread, klass->get_instanceKlass()->constants());
+ constantPoolHandle cpool(THREAD, klass->get_instanceKlass()->constants());
// Get the field's name, signature, and type.
Symbol* name = cpool->name_ref_at(index);
- _name = ciEnv::current(thread)->get_symbol(name);
+ _name = ciEnv::current(THREAD)->get_symbol(name);
int nt_index = cpool->name_and_type_ref_index_at(index);
int sig_index = cpool->signature_ref_index_at(nt_index);
Symbol* signature = cpool->symbol_at(sig_index);
- _signature = ciEnv::current(thread)->get_symbol(signature);
+ _signature = ciEnv::current(THREAD)->get_symbol(signature);
BasicType field_type = FieldType::basic_type(signature);
// If the field is a pointer type, get the klass of the
// field.
if (field_type == T_OBJECT || field_type == T_ARRAY) {
bool ignore;
// This is not really a class reference; the index always refers to the
// field's type signature, as a symbol. Linkage checks do not apply.
- _type = ciEnv::current(thread)->get_klass_by_index(cpool, sig_index, ignore, klass);
+ _type = ciEnv::current(THREAD)->get_klass_by_index(cpool, sig_index, ignore, klass);
} else {
_type = ciType::make(field_type);
}
- _name = (ciSymbol*)ciEnv::current(thread)->get_symbol(name);
+ _name = (ciSymbol*)ciEnv::current(THREAD)->get_symbol(name);
// Get the field's declared holder.
//
// Note: we actually create a ciInstanceKlass for this klass,
// even though we may not need to.
int holder_index = cpool->klass_ref_index_at(index);
bool holder_is_accessible;
- ciKlass* generic_declared_holder = ciEnv::current(thread)->get_klass_by_index(cpool, holder_index,
+ ciKlass* generic_declared_holder = ciEnv::current(THREAD)->get_klass_by_index(cpool, holder_index,
holder_is_accessible,
klass);
if (generic_declared_holder->is_array_klass()) {
// If the declared holder of the field is an array class, assume that
@@ -124,11 +124,11 @@
// have any fields. Therefore, the field is not looked up. Instead,
// the method returns partial information that will trigger special
// handling in ciField::will_link and will result in a
// java.lang.NoSuchFieldError exception being thrown by the compiled
// code (the expected behavior in this case).
- _holder = ciEnv::current(thread)->Object_klass();
+ _holder = ciEnv::current(THREAD)->Object_klass();
_offset = -1;
_is_constant = false;
return;
}
@@ -162,14 +162,26 @@
// Access check based on declared_holder. canonical_holder should not be used
// to check access because it can erroneously succeed. If this check fails,
// propagate the declared holder to will_link() which in turn will bail out
// compilation for this field access.
- if (!Reflection::verify_field_access(klass->get_Klass(), declared_holder->get_Klass(), canonical_holder, field_desc.access_flags(), true)) {
+ bool can_access = Reflection::verify_member_access(klass->get_Klass(),
+ declared_holder->get_Klass(),
+ canonical_holder,
+ field_desc.access_flags(),
+ true, false, THREAD);
+ if (!can_access) {
_holder = declared_holder;
_offset = -1;
_is_constant = false;
+ // It's possible the access check failed due to a nestmate access check
+ // encountering an exception. We can't propagate the exception from here
+ // so we have to clear it. If the access check happens again in a different
+ // context then the exception will be thrown there.
+ if (HAS_PENDING_EXCEPTION) {
+ CLEAR_PENDING_EXCEPTION;
+ }
return;
}
assert(canonical_holder == field_desc.field_holder(), "just checking");
initialize_from(&field_desc);
< prev index next >