hotspot/src/share/vm/interpreter/linkResolver.cpp
changeset 21768 b7dba4cde1c6
parent 21556 e75cd34a59e0
child 21912 8d2924674592
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp	Sat Nov 23 12:25:13 2013 +0100
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp	Tue Nov 26 09:52:22 2013 -0500
@@ -915,6 +915,25 @@
     return;
   }
 
+  // check if invokespecial's interface method reference is in an indirect superinterface
+  if (!current_klass.is_null() && resolved_klass->is_interface()) {
+    Klass *klass_to_check = !InstanceKlass::cast(current_klass())->is_anonymous() ?
+                                  current_klass() :
+                                  InstanceKlass::cast(current_klass())->host_klass();
+
+    if (!InstanceKlass::cast(klass_to_check)->is_same_or_direct_interface(resolved_klass())) {
+      ResourceMark rm(THREAD);
+      char buf[200];
+      jio_snprintf(buf, sizeof(buf),
+                   "Interface method reference: %s, is in an indirect superinterface of %s",
+                   Method::name_and_sig_as_C_string(resolved_klass(),
+                                                         resolved_method->name(),
+                                                         resolved_method->signature()),
+                   current_klass->external_name());
+      THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+    }
+  }
+
   // check if not static
   if (resolved_method->is_static()) {
     ResourceMark rm(THREAD);