--- a/hotspot/src/share/vm/classfile/verifier.cpp Thu Oct 17 10:58:45 2013 -0700
+++ b/hotspot/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(),