mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8026365: NoClassDefinitionFound for anonymous class invokespecial
Reviewed-by: dcubed, kamg
This commit is contained in:
parent
d94fef24b5
commit
4f064cafe6
2 changed files with 22 additions and 25 deletions
|
@ -2439,19 +2439,19 @@ void ClassVerifier::verify_invoke_instructions(
|
|||
&& !ref_class_type.equals(current_type())
|
||||
&& !ref_class_type.equals(VerificationType::reference_type(
|
||||
current_class()->super()->name()))) {
|
||||
bool subtype = ref_class_type.is_assignable_from(
|
||||
current_type(), this, CHECK_VERIFY(this));
|
||||
bool subtype = false;
|
||||
if (!current_class()->is_anonymous()) {
|
||||
subtype = ref_class_type.is_assignable_from(
|
||||
current_type(), this, CHECK_VERIFY(this));
|
||||
} else {
|
||||
subtype = ref_class_type.is_assignable_from(VerificationType::reference_type(
|
||||
current_class()->host_klass()->name()), this, CHECK_VERIFY(this));
|
||||
}
|
||||
if (!subtype) {
|
||||
if (current_class()->is_anonymous()) {
|
||||
subtype = ref_class_type.is_assignable_from(VerificationType::reference_type(
|
||||
current_class()->host_klass()->name()), this, CHECK_VERIFY(this));
|
||||
}
|
||||
if (!subtype) {
|
||||
verify_error(ErrorContext::bad_code(bci),
|
||||
"Bad invokespecial instruction: "
|
||||
"current class isn't assignable to reference class.");
|
||||
return;
|
||||
}
|
||||
verify_error(ErrorContext::bad_code(bci),
|
||||
"Bad invokespecial instruction: "
|
||||
"current class isn't assignable to reference class.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Match method descriptor with operand stack
|
||||
|
@ -2470,17 +2470,13 @@ void ClassVerifier::verify_invoke_instructions(
|
|||
if (!current_class()->is_anonymous()) {
|
||||
current_frame->pop_stack(current_type(), CHECK_VERIFY(this));
|
||||
} else {
|
||||
// anonymous class invokespecial calls: either the
|
||||
// operand stack/objectref is a subtype of the current class OR
|
||||
// the objectref is a subtype of the host_klass of the current class
|
||||
// anonymous class invokespecial calls: check if the
|
||||
// objectref is a subtype of the host_klass of the current class
|
||||
// to allow an anonymous class to reference methods in the host_klass
|
||||
VerificationType top = current_frame->pop_stack(CHECK_VERIFY(this));
|
||||
bool subtype = current_type().is_assignable_from(top, this, CHECK_VERIFY(this));
|
||||
if (!subtype) {
|
||||
VerificationType hosttype =
|
||||
VerificationType::reference_type(current_class()->host_klass()->name());
|
||||
subtype = hosttype.is_assignable_from(top, this, CHECK_VERIFY(this));
|
||||
}
|
||||
VerificationType hosttype =
|
||||
VerificationType::reference_type(current_class()->host_klass()->name());
|
||||
bool subtype = hosttype.is_assignable_from(top, this, CHECK_VERIFY(this));
|
||||
if (!subtype) {
|
||||
verify_error( ErrorContext::bad_type(current_frame->offset(),
|
||||
current_frame->stack_top_ctx(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue