< prev index next >
src/hotspot/share/oops/instanceKlass.cpp
Print this page
*** 234,282 ****
InstanceKlass* nest_host_k = _nest_host;
if (nest_host_k != NULL) {
return nest_host_k;
}
! const bool doLog = log_is_enabled(Trace, class, nestmates);
// need to resolve and save our nest-host class.
if (_nest_host_index != 0) { // we have a real nest_host
// Before trying to resolve check if we're in a suitable context
if (!THREAD->can_call_java() && !_constants->tag_at(_nest_host_index).is_klass()) {
- if (doLog) {
- ResourceMark rm(THREAD);
log_trace(class, nestmates)("Rejected resolution of nest-host of %s in unsuitable thread",
this->external_name());
- }
return NULL; // sentinel to say "try again from a different context"
}
- if (doLog) {
- ResourceMark rm(THREAD);
log_trace(class, nestmates)("Resolving nest-host of %s using cp entry for %s",
this->external_name(),
_constants->klass_name_at(_nest_host_index)->as_C_string());
- }
Klass* k = _constants->klass_at(_nest_host_index, THREAD);
if (HAS_PENDING_EXCEPTION) {
if (PENDING_EXCEPTION->is_a(SystemDictionary::VirtualMachineError_klass())) {
return NULL; // propagate VMEs
}
- ResourceMark rm(THREAD);
stringStream ss;
char* target_host_class = _constants->klass_name_at(_nest_host_index)->as_C_string();
ss.print("Nest host resolution of %s with host %s failed: ",
this->external_name(), target_host_class);
java_lang_Throwable::print(PENDING_EXCEPTION, &ss);
_nest_host_res_error = ss.as_string(true /* on C-heap */);
// ensure we see _nest_host_res_error is set if _nest_host is non-NULL
OrderAccess::storestore();
CLEAR_PENDING_EXCEPTION;
! if (doLog) {
log_trace(class, nestmates)("%s", _nest_host_res_error);
- }
} else {
// A valid nest-host is an instance class in the current package that lists this
// class as a nest member. If any of these conditions are not met the class is
// its own nest-host.
const char* error = NULL;
--- 234,274 ----
InstanceKlass* nest_host_k = _nest_host;
if (nest_host_k != NULL) {
return nest_host_k;
}
! ResourceMark rm(THREAD);
// need to resolve and save our nest-host class.
if (_nest_host_index != 0) { // we have a real nest_host
// Before trying to resolve check if we're in a suitable context
if (!THREAD->can_call_java() && !_constants->tag_at(_nest_host_index).is_klass()) {
log_trace(class, nestmates)("Rejected resolution of nest-host of %s in unsuitable thread",
this->external_name());
return NULL; // sentinel to say "try again from a different context"
}
log_trace(class, nestmates)("Resolving nest-host of %s using cp entry for %s",
this->external_name(),
_constants->klass_name_at(_nest_host_index)->as_C_string());
Klass* k = _constants->klass_at(_nest_host_index, THREAD);
if (HAS_PENDING_EXCEPTION) {
if (PENDING_EXCEPTION->is_a(SystemDictionary::VirtualMachineError_klass())) {
return NULL; // propagate VMEs
}
stringStream ss;
char* target_host_class = _constants->klass_name_at(_nest_host_index)->as_C_string();
ss.print("Nest host resolution of %s with host %s failed: ",
this->external_name(), target_host_class);
java_lang_Throwable::print(PENDING_EXCEPTION, &ss);
_nest_host_res_error = ss.as_string(true /* on C-heap */);
// ensure we see _nest_host_res_error is set if _nest_host is non-NULL
OrderAccess::storestore();
CLEAR_PENDING_EXCEPTION;
!
log_trace(class, nestmates)("%s", _nest_host_res_error);
} else {
// A valid nest-host is an instance class in the current package that lists this
// class as a nest member. If any of these conditions are not met the class is
// its own nest-host.
const char* error = NULL;
*** 290,304 ****
bool is_member = nest_host_k->has_nest_member(this, THREAD);
// exception is rare, perhaps impossible
if (!HAS_PENDING_EXCEPTION) {
if (is_member) {
_nest_host = nest_host_k; // save resolved nest-host value
! if (doLog) {
! ResourceMark rm(THREAD);
log_trace(class, nestmates)("Resolved nest-host of %s to %s",
this->external_name(), k->external_name());
- }
return nest_host_k;
} else {
error = "current type is not listed as a nest member";
}
} else {
--- 282,294 ----
bool is_member = nest_host_k->has_nest_member(this, THREAD);
// exception is rare, perhaps impossible
if (!HAS_PENDING_EXCEPTION) {
if (is_member) {
_nest_host = nest_host_k; // save resolved nest-host value
!
log_trace(class, nestmates)("Resolved nest-host of %s to %s",
this->external_name(), k->external_name());
return nest_host_k;
} else {
error = "current type is not listed as a nest member";
}
} else {
*** 317,327 ****
error = "types are in different packages";
}
// something went wrong, so record what and log it
{
- ResourceMark rm(THREAD);
stringStream ss;
ss.print("Type %s (loader: %s) is not a nest member of type %s (loader: %s): %s",
this->external_name(),
this->class_loader_data()->loader_name_and_id(),
k->external_name(),
--- 307,316 ----
*** 329,350 ****
error);
_nest_host_res_error = ss.as_string(true /* on C-heap */);
// ensure we see _nest_host_res_error is set if _nest_host is non-NULL
OrderAccess::storestore();
- if (doLog) {
log_trace(class, nestmates)("%s", _nest_host_res_error);
}
}
- }
} else {
- if (doLog) {
- ResourceMark rm(THREAD);
log_trace(class, nestmates)("Type %s is not part of a nest: setting nest-host to self",
this->external_name());
}
- }
// Either not in an explicit nest, or else an error occurred, so
// the nest-host is set to `this`. Any thread that sees this assignment
// will also see any setting of _nest_host_res_error, if applicable.
return (_nest_host = this);
--- 318,334 ----
*** 409,426 ****
return false;
}
bool access = (cur_host == k_nest_host);
- if (log_is_enabled(Trace, class, nestmates)) {
ResourceMark rm(THREAD);
log_trace(class, nestmates)("Class %s does %shave nestmate access to %s",
this->external_name(),
access ? "" : "NOT ",
k->external_name());
- }
-
return access;
}
InstanceKlass* InstanceKlass::allocate_instance_klass(const ClassFileParser& parser, TRAPS) {
bool is_hidden_or_anonymous = parser.is_hidden() || parser.is_unsafe_anonymous();
--- 393,407 ----
< prev index next >