提交 677080c0 编写于 作者: A acorn

8026365: NoClassDefinitionFound for anonymous class invokespecial.

Reviewed-by: dcubed, kamg
上级 b1803ecb
...@@ -2439,19 +2439,19 @@ void ClassVerifier::verify_invoke_instructions( ...@@ -2439,19 +2439,19 @@ void ClassVerifier::verify_invoke_instructions(
&& !ref_class_type.equals(current_type()) && !ref_class_type.equals(current_type())
&& !ref_class_type.equals(VerificationType::reference_type( && !ref_class_type.equals(VerificationType::reference_type(
current_class()->super()->name()))) { current_class()->super()->name()))) {
bool subtype = ref_class_type.is_assignable_from( bool subtype = false;
current_type(), this, CHECK_VERIFY(this)); 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 (!subtype) {
if (current_class()->is_anonymous()) { verify_error(ErrorContext::bad_code(bci),
subtype = ref_class_type.is_assignable_from(VerificationType::reference_type( "Bad invokespecial instruction: "
current_class()->host_klass()->name()), this, CHECK_VERIFY(this)); "current class isn't assignable to reference class.");
} return;
if (!subtype) {
verify_error(ErrorContext::bad_code(bci),
"Bad invokespecial instruction: "
"current class isn't assignable to reference class.");
return;
}
} }
} }
// Match method descriptor with operand stack // Match method descriptor with operand stack
...@@ -2470,17 +2470,13 @@ void ClassVerifier::verify_invoke_instructions( ...@@ -2470,17 +2470,13 @@ void ClassVerifier::verify_invoke_instructions(
if (!current_class()->is_anonymous()) { if (!current_class()->is_anonymous()) {
current_frame->pop_stack(current_type(), CHECK_VERIFY(this)); current_frame->pop_stack(current_type(), CHECK_VERIFY(this));
} else { } else {
// anonymous class invokespecial calls: either the // anonymous class invokespecial calls: check if the
// operand stack/objectref is a subtype of the current class OR // objectref is a subtype of the host_klass of the current class
// 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 // to allow an anonymous class to reference methods in the host_klass
VerificationType top = current_frame->pop_stack(CHECK_VERIFY(this)); VerificationType top = current_frame->pop_stack(CHECK_VERIFY(this));
bool subtype = current_type().is_assignable_from(top, this, CHECK_VERIFY(this)); VerificationType hosttype =
if (!subtype) { VerificationType::reference_type(current_class()->host_klass()->name());
VerificationType hosttype = bool subtype = hosttype.is_assignable_from(top, this, CHECK_VERIFY(this));
VerificationType::reference_type(current_class()->host_klass()->name());
subtype = hosttype.is_assignable_from(top, this, CHECK_VERIFY(this));
}
if (!subtype) { if (!subtype) {
verify_error( ErrorContext::bad_type(current_frame->offset(), verify_error( ErrorContext::bad_type(current_frame->offset(),
current_frame->stack_top_ctx(), current_frame->stack_top_ctx(),
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
# - compact1, compact2, compact3, full JRE, JDK # - compact1, compact2, compact3, full JRE, JDK
# #
# In addition they support testing of the minimal VM on compact1 and compact2. # In addition they support testing of the minimal VM on compact1 and compact2.
# Essentially this defines groups based around the specified API's and VM # Essentially this defines groups based around the specified API's and VM
# services available in the runtime. # services available in the runtime.
# #
# The groups are defined hierarchically in two forms: # The groups are defined hierarchically in two forms:
...@@ -44,9 +44,9 @@ ...@@ -44,9 +44,9 @@
# by listing the top-level test directories. # by listing the top-level test directories.
# #
# To use a group simply list it on the jtreg command line eg: # To use a group simply list it on the jtreg command line eg:
# jtreg :jdk # jtreg :jdk
# runs all tests. While # runs all tests. While
# jtreg :compact2 # jtreg :compact2
# runs those tests that only require compact1 and compact2 API's. # runs those tests that only require compact1 and compact2 API's.
# #
...@@ -69,6 +69,7 @@ needs_jdk = \ ...@@ -69,6 +69,7 @@ needs_jdk = \
runtime/7107135/Test7107135.sh \ runtime/7107135/Test7107135.sh \
runtime/7158988/FieldMonitor.java \ runtime/7158988/FieldMonitor.java \
runtime/7194254/Test7194254.java \ runtime/7194254/Test7194254.java \
runtime/8026365/InvokeSpecialAnonTest.java \
runtime/jsig/Test8017498.sh \ runtime/jsig/Test8017498.sh \
runtime/Metaspace/FragmentMetaspace.java \ runtime/Metaspace/FragmentMetaspace.java \
runtime/NMT/BaselineWithParameter.java \ runtime/NMT/BaselineWithParameter.java \
...@@ -140,7 +141,7 @@ compact2 = \ ...@@ -140,7 +141,7 @@ compact2 = \
-:needs_jdk -:needs_jdk
# Tests that require compact2 API's and a full VM # Tests that require compact2 API's and a full VM
# #
needs_full_vm_compact2 = needs_full_vm_compact2 =
# Compact 1 adds full VM tests # Compact 1 adds full VM tests
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册