Mercurial > hg > truffle
changeset 12891:7114c4597ae3
8026365: NoClassDefinitionFound for anonymous class invokespecial.
Reviewed-by: dcubed, kamg
author | acorn |
---|---|
date | Thu, 17 Oct 2013 23:30:17 -0400 |
parents | 8f4bb1773fd9 |
children | c51cd6af7e61 |
files | src/share/vm/classfile/verifier.cpp test/TEST.groups |
diffstat | 2 files changed, 22 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/vm/classfile/verifier.cpp Thu Oct 17 10:58:45 2013 -0700 +++ b/src/share/vm/classfile/verifier.cpp Thu Oct 17 23:30:17 2013 -0400 @@ -2439,19 +2439,19 @@ && !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 @@ 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(),
--- a/test/TEST.groups Thu Oct 17 10:58:45 2013 -0700 +++ b/test/TEST.groups Thu Oct 17 23:30:17 2013 -0400 @@ -27,7 +27,7 @@ # - compact1, compact2, compact3, full JRE, JDK # # 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. # # The groups are defined hierarchically in two forms: @@ -44,9 +44,9 @@ # by listing the top-level test directories. # # To use a group simply list it on the jtreg command line eg: -# jtreg :jdk +# jtreg :jdk # runs all tests. While -# jtreg :compact2 +# jtreg :compact2 # runs those tests that only require compact1 and compact2 API's. # @@ -69,6 +69,7 @@ runtime/7107135/Test7107135.sh \ runtime/7158988/FieldMonitor.java \ runtime/7194254/Test7194254.java \ + runtime/8026365/InvokeSpecialAnonTest.java \ runtime/jsig/Test8017498.sh \ runtime/Metaspace/FragmentMetaspace.java \ runtime/NMT/BaselineWithParameter.java \ @@ -140,7 +141,7 @@ -:needs_jdk # Tests that require compact2 API's and a full VM -# +# needs_full_vm_compact2 = # Compact 1 adds full VM tests