8143324: Backout JDK-8087223
authorctornqvi
Thu, 19 Nov 2015 10:34:11 -0800
changeset 34238 60e87df08f1e
parent 34234 e4a23d294f48
child 34239 5a67344e5ef3
8143324: Backout JDK-8087223 Reviewed-by: coleenp, acorn
hotspot/src/share/vm/ci/ciEnv.cpp
hotspot/src/share/vm/ci/ciEnv.hpp
hotspot/src/share/vm/ci/ciMethod.cpp
hotspot/src/share/vm/interpreter/linkResolver.cpp
hotspot/src/share/vm/interpreter/linkResolver.hpp
hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp
hotspot/src/share/vm/jvmci/jvmciEnv.cpp
hotspot/src/share/vm/jvmci/jvmciEnv.hpp
hotspot/src/share/vm/oops/constantPool.cpp
hotspot/src/share/vm/oops/constantPool.hpp
hotspot/src/share/vm/prims/methodHandles.cpp
hotspot/src/share/vm/runtime/javaCalls.cpp
hotspot/src/share/vm/runtime/reflection.cpp
hotspot/test/runtime/8087223/BadMethodHandles.java
hotspot/test/runtime/8087223/IntfMethod.java
--- a/hotspot/src/share/vm/ci/ciEnv.cpp	Wed Nov 18 22:00:09 2015 +0000
+++ b/hotspot/src/share/vm/ci/ciEnv.cpp	Thu Nov 19 10:34:11 2015 -0800
@@ -704,14 +704,13 @@
                                InstanceKlass*  holder,
                                Symbol*       name,
                                Symbol*       sig,
-                               Bytecodes::Code bc,
-                               constantTag    tag) {
+                               Bytecodes::Code bc) {
   EXCEPTION_CONTEXT;
   KlassHandle h_accessor(THREAD, accessor);
   KlassHandle h_holder(THREAD, holder);
   LinkResolver::check_klass_accessability(h_accessor, h_holder, KILL_COMPILE_ON_FATAL_(NULL));
   methodHandle dest_method;
-  LinkInfo link_info(h_holder, name, sig, h_accessor, LinkInfo::needs_access_check, tag);
+  LinkInfo link_info(h_holder, name, sig, h_accessor, /*check_access*/true);
   switch (bc) {
   case Bytecodes::_invokestatic:
     dest_method =
@@ -797,9 +796,7 @@
 
     if (holder_is_accessible) {  // Our declared holder is loaded.
       InstanceKlass* lookup = declared_holder->get_instanceKlass();
-      constantTag tag = cpool->tag_ref_at(index);
-      assert(accessor->get_instanceKlass() == cpool->pool_holder(), "not the pool holder?");
-      Method* m = lookup_method(accessor->get_instanceKlass(), lookup, name_sym, sig_sym, bc, tag);
+      Method* m = lookup_method(accessor->get_instanceKlass(), lookup, name_sym, sig_sym, bc);
       if (m != NULL &&
           (bc == Bytecodes::_invokestatic
            ?  m->method_holder()->is_not_initialized()
--- a/hotspot/src/share/vm/ci/ciEnv.hpp	Wed Nov 18 22:00:09 2015 +0000
+++ b/hotspot/src/share/vm/ci/ciEnv.hpp	Thu Nov 19 10:34:11 2015 -0800
@@ -158,8 +158,7 @@
                            InstanceKlass*  holder,
                            Symbol*         name,
                            Symbol*         sig,
-                           Bytecodes::Code bc,
-                           constantTag     tag);
+                           Bytecodes::Code bc);
 
   // Get a ciObject from the object factory.  Ensures uniqueness
   // of ciObjects.
--- a/hotspot/src/share/vm/ci/ciMethod.cpp	Wed Nov 18 22:00:09 2015 +0000
+++ b/hotspot/src/share/vm/ci/ciMethod.cpp	Thu Nov 19 10:34:11 2015 -0800
@@ -786,8 +786,7 @@
    Symbol* h_name      = name()->get_symbol();
    Symbol* h_signature = signature()->get_symbol();
 
-   LinkInfo link_info(h_resolved, h_name, h_signature, caller_klass,
-                      check_access ? LinkInfo::needs_access_check : LinkInfo::skip_access_check);
+   LinkInfo link_info(h_resolved, h_name, h_signature, caller_klass, check_access);
    methodHandle m;
    // Only do exact lookup if receiver klass has been linked.  Otherwise,
    // the vtable has not been setup, and the LinkResolver will fail.
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp	Wed Nov 18 22:00:09 2015 +0000
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp	Thu Nov 19 10:34:11 2015 -0800
@@ -245,7 +245,6 @@
   // Get name, signature, and static klass
   _name          = pool->name_ref_at(index);
   _signature     = pool->signature_ref_at(index);
-  _tag           = pool->tag_ref_at(index);
   _current_klass = KlassHandle(THREAD, pool->pool_holder());
 
   // Coming from the constant pool always checks access
@@ -682,15 +681,6 @@
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
-  // check tag at call is method
-  if (!link_info.tag().is_invalid() && !link_info.tag().is_method()) {
-    ResourceMark rm(THREAD);
-    char buf[200];
-    jio_snprintf(buf, sizeof(buf), "Resolving to non regular method %s", link_info.method_string());
-    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
-  }
-
-
   // 2. lookup method in resolved klass and its super klasses
   methodHandle resolved_method = lookup_method_in_klasses(link_info, true, false, CHECK_NULL);
 
@@ -750,14 +740,6 @@
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
-  // check tag at call is an interface method
-  if (!link_info.tag().is_invalid() && !link_info.tag().is_interface_method()) {
-    ResourceMark rm(THREAD);
-    char buf[200];
-    jio_snprintf(buf, sizeof(buf), "Resolving to non interface method %s", link_info.method_string());
-    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
-  }
-
   // lookup method in this interface or its super, java.lang.Object
   // JDK8: also look for static methods
   methodHandle resolved_method = lookup_method_in_klasses(link_info, false, true, CHECK_NULL);
@@ -935,8 +917,7 @@
     resolved_klass->initialize(CHECK);
     // Use updated LinkInfo (to reresolve with resolved_klass as method_holder?)
     LinkInfo new_info(resolved_klass, link_info.name(), link_info.signature(),
-                      link_info.current_klass(),
-                      link_info.check_access() ? LinkInfo::needs_access_check : LinkInfo::skip_access_check);
+                      link_info.current_klass(), link_info.check_access());
     resolved_method = linktime_resolve_static_method(new_info, CHECK);
   }
 
--- a/hotspot/src/share/vm/interpreter/linkResolver.hpp	Wed Nov 18 22:00:09 2015 +0000
+++ b/hotspot/src/share/vm/interpreter/linkResolver.hpp	Thu Nov 19 10:34:11 2015 -0800
@@ -135,35 +135,20 @@
   KlassHandle _resolved_klass;  // class that the constant pool entry points to
   KlassHandle _current_klass;   // class that owns the constant pool
   bool        _check_access;
-  constantTag _tag;
  public:
-  enum AccessCheck {
-     needs_access_check,
-     skip_access_check
-  };
-
   LinkInfo(const constantPoolHandle& pool, int index, TRAPS);
-
   // Condensed information from other call sites within the vm.
-  LinkInfo(KlassHandle resolved_klass, Symbol* name, Symbol* signature, KlassHandle current_klass,
-           AccessCheck check_access = needs_access_check,
-           constantTag tag = JVM_CONSTANT_Invalid) :
+  LinkInfo(KlassHandle resolved_klass, Symbol* name, Symbol* signature,
+           KlassHandle current_klass, bool check_access = true) :
     _resolved_klass(resolved_klass),
     _name(name), _signature(signature), _current_klass(current_klass),
-    _check_access(check_access == needs_access_check && current_klass.not_null()), _tag(tag) {}
-
-  // Case where we just find the method and don't check access against the current class
-  LinkInfo(KlassHandle resolved_klass, Symbol*name, Symbol* signature) :
-    _resolved_klass(resolved_klass),
-    _name(name), _signature(signature), _current_klass(NULL),
-    _check_access(false), _tag(JVM_CONSTANT_Invalid) {}
+    _check_access(check_access) {}
 
   // accessors
   Symbol* name() const               { return _name; }
   Symbol* signature() const          { return _signature; }
   KlassHandle resolved_klass() const { return _resolved_klass; }
   KlassHandle current_klass() const  { return _current_klass; }
-  constantTag tag() const            { return _tag; }
   bool check_access() const          { return _check_access; }
   char* method_string() const;
 
--- a/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp	Wed Nov 18 22:00:09 2015 +0000
+++ b/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp	Thu Nov 19 10:34:11 2015 -0800
@@ -574,7 +574,7 @@
 
     if (holder_klass->is_interface()) {
       // do link-time resolution to check all access rules.
-      LinkInfo link_info(holder_klass, method_name, method_signature, caller_klass);
+      LinkInfo link_info(holder_klass, method_name, method_signature, caller_klass, true);
       methodHandle resolved_method = LinkResolver::linktime_resolve_interface_method_or_null(link_info);
       if (resolved_method.is_null() || resolved_method->is_private()) {
         return NULL;
@@ -586,7 +586,7 @@
       return JNIHandles::make_local(THREAD, result);
     } else {
       // do link-time resolution to check all access rules.
-      LinkInfo link_info(holder_klass, method_name, method_signature, caller_klass);
+      LinkInfo link_info(holder_klass, method_name, method_signature, caller_klass, true);
       methodHandle resolved_method = LinkResolver::linktime_resolve_virtual_method_or_null(link_info);
       if (resolved_method.is_null()) {
         return NULL;
--- a/hotspot/src/share/vm/jvmci/jvmciEnv.cpp	Wed Nov 18 22:00:09 2015 +0000
+++ b/hotspot/src/share/vm/jvmci/jvmciEnv.cpp	Thu Nov 19 10:34:11 2015 -0800
@@ -282,12 +282,11 @@
                                instanceKlassHandle& h_holder,
                                Symbol*       name,
                                Symbol*       sig,
-                               Bytecodes::Code bc,
-                               constantTag   tag) {
+                               Bytecodes::Code bc) {
   JVMCI_EXCEPTION_CONTEXT;
   LinkResolver::check_klass_accessability(h_accessor, h_holder, KILL_COMPILE_ON_FATAL_(NULL));
   methodHandle dest_method;
-  LinkInfo link_info(h_holder, name, sig, h_accessor, LinkInfo::needs_access_check, tag);
+  LinkInfo link_info(h_holder, name, sig, h_accessor, /*check_access*/true);
   switch (bc) {
   case Bytecodes::_invokestatic:
     dest_method =
@@ -360,8 +359,7 @@
 
   if (holder_is_accessible) { // Our declared holder is loaded.
     instanceKlassHandle lookup = get_instance_klass_for_declared_method_holder(holder);
-    constantTag tag = cpool->tag_ref_at(index);
-    methodHandle m = lookup_method(accessor, lookup, name_sym, sig_sym, bc, tag);
+    methodHandle m = lookup_method(accessor, lookup, name_sym, sig_sym, bc);
     if (!m.is_null() &&
         (bc == Bytecodes::_invokestatic
          ?  InstanceKlass::cast(m->method_holder())->is_not_initialized()
--- a/hotspot/src/share/vm/jvmci/jvmciEnv.hpp	Wed Nov 18 22:00:09 2015 +0000
+++ b/hotspot/src/share/vm/jvmci/jvmciEnv.hpp	Thu Nov 19 10:34:11 2015 -0800
@@ -125,8 +125,7 @@
                            instanceKlassHandle&  holder,
                            Symbol*         name,
                            Symbol*         sig,
-                           Bytecodes::Code bc,
-                           constantTag     tag);
+                           Bytecodes::Code bc);
 
   private:
 
--- a/hotspot/src/share/vm/oops/constantPool.cpp	Wed Nov 18 22:00:09 2015 +0000
+++ b/hotspot/src/share/vm/oops/constantPool.cpp	Thu Nov 19 10:34:11 2015 -0800
@@ -409,19 +409,6 @@
   return extract_high_short_from_int(ref_index);
 }
 
-constantTag ConstantPool::impl_tag_ref_at(int which, bool uncached) {
-  int pool_index = which;
-  if (!uncached && cache() != NULL) {
-    if (ConstantPool::is_invokedynamic_index(which)) {
-      // Invokedynamic index is index into resolved_references
-      pool_index = invokedynamic_cp_cache_entry_at(which)->constant_pool_index();
-    } else {
-      // change byte-ordering and go via cache
-      pool_index = remap_instruction_operand_from_cache(which);
-    }
-  }
-  return tag_at(pool_index);
-}
 
 int ConstantPool::impl_klass_ref_index_at(int which, bool uncached) {
   guarantee(!ConstantPool::is_invokedynamic_index(which),
@@ -677,7 +664,6 @@
       int callee_index             = this_cp->method_handle_klass_index_at(index);
       Symbol*  name =      this_cp->method_handle_name_ref_at(index);
       Symbol*  signature = this_cp->method_handle_signature_ref_at(index);
-      constantTag m_tag  = this_cp->tag_at(this_cp->method_handle_index_at(index));
       if (PrintMiscellaneous)
         tty->print_cr("resolve JVM_CONSTANT_MethodHandle:%d [%d/%d/%d] %s.%s",
                       ref_kind, index, this_cp->method_handle_index_at(index),
@@ -686,15 +672,6 @@
       { Klass* k = klass_at_impl(this_cp, callee_index, true, CHECK_NULL);
         callee = KlassHandle(THREAD, k);
       }
-      if ((callee->is_interface() && m_tag.is_method()) ||
-          (!callee->is_interface() && m_tag.is_interface_method())) {
-        ResourceMark rm(THREAD);
-        char buf[200];
-        jio_snprintf(buf, sizeof(buf), "Inconsistent constant data for %s.%s%s at index %d",
-          callee->name()->as_C_string(), name->as_C_string(), signature->as_C_string(), index);
-        THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
-      }
-
       KlassHandle klass(THREAD, this_cp->pool_holder());
       Handle value = SystemDictionary::link_method_handle_constant(klass, ref_kind,
                                                                    callee, name, signature,
--- a/hotspot/src/share/vm/oops/constantPool.hpp	Wed Nov 18 22:00:09 2015 +0000
+++ b/hotspot/src/share/vm/oops/constantPool.hpp	Thu Nov 19 10:34:11 2015 -0800
@@ -664,8 +664,6 @@
 
   int remap_instruction_operand_from_cache(int operand);  // operand must be biased by CPCACHE_INDEX_TAG
 
-  constantTag tag_ref_at(int cp_cache_index)      { return impl_tag_ref_at(cp_cache_index, false); }
-
   // Lookup for entries consisting of (name_index, signature_index)
   int name_ref_index_at(int which_nt);            // ==  low-order jshort of name_and_type_at(which_nt)
   int signature_ref_index_at(int which_nt);       // == high-order jshort of name_and_type_at(which_nt)
@@ -786,7 +784,6 @@
   Symbol* impl_signature_ref_at(int which, bool uncached);
   int       impl_klass_ref_index_at(int which, bool uncached);
   int       impl_name_and_type_ref_index_at(int which, bool uncached);
-  constantTag impl_tag_ref_at(int which, bool uncached);
 
   // Used while constructing constant pool (only by ClassFileParser)
   jint klass_index_at(int which) {
--- a/hotspot/src/share/vm/prims/methodHandles.cpp	Wed Nov 18 22:00:09 2015 +0000
+++ b/hotspot/src/share/vm/prims/methodHandles.cpp	Thu Nov 19 10:34:11 2015 -0800
@@ -679,7 +679,7 @@
   case IS_METHOD:
     {
       CallInfo result;
-      LinkInfo link_info(defc, name, type, caller);
+      LinkInfo link_info(defc, name, type, caller, caller.not_null());
       {
         assert(!HAS_PENDING_EXCEPTION, "");
         if (ref_kind == JVM_REF_invokeStatic) {
@@ -716,7 +716,7 @@
   case IS_CONSTRUCTOR:
     {
       CallInfo result;
-      LinkInfo link_info(defc, name, type, caller);
+      LinkInfo link_info(defc, name, type, caller, caller.not_null());
       {
         assert(!HAS_PENDING_EXCEPTION, "");
         if (name == vmSymbols::object_initializer_name()) {
@@ -737,7 +737,7 @@
       fieldDescriptor result; // find_field initializes fd if found
       {
         assert(!HAS_PENDING_EXCEPTION, "");
-        LinkInfo link_info(defc, name, type, caller, LinkInfo::skip_access_check);
+        LinkInfo link_info(defc, name, type, caller, /*check_access*/false);
         LinkResolver::resolve_field(result, link_info, Bytecodes::_nop, false, THREAD);
         if (HAS_PENDING_EXCEPTION) {
           return empty;
--- a/hotspot/src/share/vm/runtime/javaCalls.cpp	Wed Nov 18 22:00:09 2015 +0000
+++ b/hotspot/src/share/vm/runtime/javaCalls.cpp	Thu Nov 19 10:34:11 2015 -0800
@@ -183,7 +183,7 @@
   CallInfo callinfo;
   Handle receiver = args->receiver();
   KlassHandle recvrKlass(THREAD, receiver.is_null() ? (Klass*)NULL : receiver->klass());
-  LinkInfo link_info(spec_klass, name, signature);
+  LinkInfo link_info(spec_klass, name, signature, KlassHandle(), /*check_access*/false);
   LinkResolver::resolve_virtual_call(
           callinfo, receiver, recvrKlass, link_info, true, CHECK);
   methodHandle method = callinfo.selected_method();
@@ -220,7 +220,7 @@
 
 void JavaCalls::call_special(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
   CallInfo callinfo;
-  LinkInfo link_info(klass, name, signature);
+  LinkInfo link_info(klass, name, signature, KlassHandle(), /*check_access*/false);
   LinkResolver::resolve_special_call(callinfo, link_info, CHECK);
   methodHandle method = callinfo.selected_method();
   assert(method.not_null(), "should have thrown exception");
@@ -255,7 +255,7 @@
 
 void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
   CallInfo callinfo;
-  LinkInfo link_info(klass, name, signature);
+  LinkInfo link_info(klass, name, signature, KlassHandle(), /*check_access*/false);
   LinkResolver::resolve_static_call(callinfo, link_info, true, CHECK);
   methodHandle method = callinfo.selected_method();
   assert(method.not_null(), "should have thrown exception");
--- a/hotspot/src/share/vm/runtime/reflection.cpp	Wed Nov 18 22:00:09 2015 +0000
+++ b/hotspot/src/share/vm/runtime/reflection.cpp	Thu Nov 19 10:34:11 2015 -0800
@@ -830,7 +830,7 @@
   Symbol*  signature  = method->signature();
   Symbol*  name       = method->name();
   LinkResolver::resolve_interface_call(info, receiver, recv_klass,
-                                       LinkInfo(klass, name, signature),
+                                       LinkInfo(klass, name, signature, KlassHandle(), false),
                                        true,
                                        CHECK_(methodHandle()));
   return info.selected_method();
--- a/hotspot/test/runtime/8087223/BadMethodHandles.java	Wed Nov 18 22:00:09 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,250 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * $bug 8087223
- * @summary Adding constantTag to keep method call consistent with it.
- * @compile -XDignore.symbol.file BadMethodHandles.java
- * @run main/othervm BadMethodHandles
- */
-
-import jdk.internal.org.objectweb.asm.*;
-import java.io.FileOutputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodHandles;
-import java.lang.invoke.MethodType;
-import static jdk.internal.org.objectweb.asm.Opcodes.*;
-
-public class BadMethodHandles {
-
-    static byte[] dumpBadInterfaceMethodref() {
-        ClassWriter cw = new ClassWriter(0);
-        cw.visit(52, ACC_PUBLIC | ACC_SUPER, "BadInterfaceMethodref", null, "java/lang/Object", null);
-        Handle handle1 =
-            new Handle(Opcodes.H_INVOKEINTERFACE, "BadInterfaceMethodref", "m", "()V");
-        Handle handle2 =
-            new Handle(Opcodes.H_INVOKEINTERFACE, "BadInterfaceMethodref", "staticM", "()V");
-
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
-            mv.visitCode();
-            mv.visitVarInsn(ALOAD, 0);
-            mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(1, 1);
-            mv.visitEnd();
-        }
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "m", "()V", null, null);
-            mv.visitCode();
-            mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
-            mv.visitLdcInsn("hello from m");
-            mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false/*intf*/);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(3, 1);
-            mv.visitEnd();
-        }
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "staticM", "()V", null, null);
-            mv.visitCode();
-            mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
-            mv.visitLdcInsn("hello from staticM");
-            mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false/*intf*/);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(3, 1);
-            mv.visitEnd();
-        }
-
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "runm", "()V", null, null);
-            mv.visitCode();
-            // REF_invokeStatic
-            mv.visitLdcInsn(handle1);
-            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invoke", "()V", false);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(1, 1);
-            mv.visitEnd();
-        }
-
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "runStaticM", "()V", null, null);
-            mv.visitCode();
-            // REF_invokeStatic
-            mv.visitLdcInsn(handle2);
-            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invoke", "()V", false);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(1, 1);
-            mv.visitEnd();
-        }
-
-        cw.visitEnd();
-        return cw.toByteArray();
-    }
-
-    static byte[] dumpIBad() {
-        ClassWriter cw = new ClassWriter(0);
-        cw.visit(52, ACC_PUBLIC | ACC_ABSTRACT | ACC_INTERFACE, "IBad", null, "java/lang/Object", null);
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "m", "()V", null, null);
-            mv.visitCode();
-            mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
-            mv.visitLdcInsn("hello from m");
-            mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false/*intf*/);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(3, 1);
-            mv.visitEnd();
-        }
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "staticM", "()V", null, null);
-            mv.visitCode();
-            mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
-            mv.visitLdcInsn("hello from staticM");
-            mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false/*intf*/);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(3, 1);
-            mv.visitEnd();
-        }
-        cw.visitEnd();
-        return cw.toByteArray();
-    }
-
-    static byte[] dumpBadMethodref() {
-        ClassWriter cw = new ClassWriter(0);
-        cw.visit(52, ACC_PUBLIC | ACC_SUPER,  "BadMethodref", null, "java/lang/Object", new String[]{"IBad"});
-        Handle handle1 =
-            new Handle(Opcodes.H_INVOKEINTERFACE, "BadMethodref", "m", "()V");
-        Handle handle2 =
-            new Handle(Opcodes.H_INVOKEINTERFACE, "BadMethodref", "staticM", "()V");
-
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
-            mv.visitCode();
-            mv.visitVarInsn(ALOAD, 0);
-            mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(1, 1);
-            mv.visitEnd();
-        }
-
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "runm", "()V", null, null);
-            mv.visitCode();
-            // REF_invokeStatic
-            mv.visitLdcInsn(handle1);
-            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invoke", "()V", false);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(1, 1);
-            mv.visitEnd();
-        }
-
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "runStaticM", "()V", null, null);
-            mv.visitCode();
-            // REF_invokeStatic
-            mv.visitLdcInsn(handle2);
-            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invoke", "()V", false);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(1, 1);
-            mv.visitEnd();
-        }
-
-        cw.visitEnd();
-        return cw.toByteArray();
-    }
-    static class CL extends ClassLoader {
-        @Override
-        protected Class<?> findClass(String name) throws ClassNotFoundException {
-            byte[] classBytes = null;
-            switch (name) {
-            case "BadInterfaceMethodref": classBytes = dumpBadInterfaceMethodref(); break;
-            case "BadMethodref"         : classBytes = dumpBadMethodref(); break;
-            case "IBad"                 : classBytes = dumpIBad(); break;
-            default                     : throw new ClassNotFoundException(name);
-            }
-            return defineClass(name, classBytes, 0, classBytes.length);
-        }
-    }
-
-    public static void main(String[] args) throws Throwable {
-        try (FileOutputStream fos = new FileOutputStream("BadInterfaceMethodref.class")) {
-          fos.write(dumpBadInterfaceMethodref());
-        }
-        try (FileOutputStream fos = new FileOutputStream("IBad.class")) {
-          fos.write(dumpIBad());
-        }
-        try (FileOutputStream fos = new FileOutputStream("BadMethodref.class")) {
-          fos.write(dumpBadMethodref());
-        }
-
-        Class<?> cls = (new CL()).loadClass("BadInterfaceMethodref");
-        String[] methods = {"runm", "runStaticM"};
-        System.out.println("Test BadInterfaceMethodref:");
-        int success = 0;
-        for (String name : methods) {
-            try {
-                System.out.printf("invoke %s: \n", name);
-                cls.getMethod(name).invoke(cls.newInstance());
-                System.out.println("FAILED (no exception)"); // ICCE should be thrown
-            } catch (Throwable e) {
-                if (e instanceof InvocationTargetException && e.getCause() != null &&
-                    e.getCause() instanceof IncompatibleClassChangeError) {
-                    System.out.println("PASSED");
-                    success++;
-                    continue;
-                } else {
-                    System.out.println("FAILED with exception");
-                    throw e;
-                }
-            }
-        }
-        if (success != methods.length) {
-           throw new Exception("BadInterfaceMethodRef Failed to catch IncompatibleClassChangeError");
-        }
-        System.out.println("Test BadMethodref:");
-        cls = (new CL()).loadClass("BadMethodref");
-        success = 0;
-        for (String name : methods) {
-            try {
-                System.out.printf("invoke %s: \n", name);
-                cls.getMethod(name).invoke(cls.newInstance());
-                System.out.println("FAILED (no exception)"); // ICCE should be thrown
-            } catch (Throwable e) {
-                if (e instanceof InvocationTargetException && e.getCause() != null &&
-                    e.getCause() instanceof IncompatibleClassChangeError) {
-                    System.out.println("PASSED");
-                    success++;
-                    continue;
-                } else {
-                    System.out.println("FAILED with exception");
-                    throw e;
-                }
-            }
-         }
-         if (success != methods.length) {
-            throw new Exception("BadMethodRef Failed to catch IncompatibleClassChangeError");
-         }
-
-    }
-}
--- a/hotspot/test/runtime/8087223/IntfMethod.java	Wed Nov 18 22:00:09 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,156 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * $bug 8087223
- * @summary Adding constantTag to keep method call consistent with it.
- * @compile -XDignore.symbol.file IntfMethod.java
- * @run main/othervm IntfMethod
- * @run main/othervm -Xint IntfMethod
- * @run main/othervm -Xcomp IntfMethod
- */
-
-
-import jdk.internal.org.objectweb.asm.*;
-import java.io.FileOutputStream;
-import java.lang.reflect.InvocationTargetException;
-import static jdk.internal.org.objectweb.asm.Opcodes.*;
-
-public class IntfMethod {
-    static byte[] dumpC() {
-        ClassWriter cw = new ClassWriter(0);
-        cw.visit(52, ACC_PUBLIC | ACC_SUPER, "C", null, "java/lang/Object", new String[]{"I"});
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
-            mv.visitCode();
-            mv.visitVarInsn(ALOAD, 0);
-            mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(1, 1);
-            mv.visitEnd();
-        }
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "testSpecialIntf", "()V", null, null);
-            mv.visitCode();
-            mv.visitVarInsn(ALOAD, 0);
-            mv.visitMethodInsn(INVOKESPECIAL, "I", "f1", "()V", /*itf=*/false);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(1, 1);
-            mv.visitEnd();
-        }
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "testStaticIntf", "()V", null, null);
-            mv.visitCode();
-            mv.visitMethodInsn(INVOKESTATIC, "I", "f2", "()V", /*itf=*/false);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(1, 1);
-            mv.visitEnd();
-        }
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "testSpecialClass", "()V", null, null);
-            mv.visitCode();
-            mv.visitVarInsn(ALOAD, 0);
-            mv.visitMethodInsn(INVOKESPECIAL, "C", "f1", "()V", /*itf=*/true);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(1, 1);
-            mv.visitEnd();
-        }
-
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "f2", "()V", null, null);
-            mv.visitCode();
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(0, 1);
-            mv.visitEnd();
-        }
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "testStaticClass", "()V", null, null);
-            mv.visitCode();
-            mv.visitMethodInsn(INVOKESTATIC, "C", "f2", "()V", /*itf=*/true);
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(1, 1);
-            mv.visitEnd();
-        }
-        cw.visitEnd();
-        return cw.toByteArray();
-    }
-
-    static byte[] dumpI() {
-        ClassWriter cw = new ClassWriter(0);
-        cw.visit(52, ACC_PUBLIC | ACC_ABSTRACT | ACC_INTERFACE, "I", null, "java/lang/Object", null);
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "f1", "()V", null, null);
-            mv.visitCode();
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(0, 1);
-            mv.visitEnd();
-        }
-        {
-            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "f2", "()V", null, null);
-            mv.visitCode();
-            mv.visitInsn(RETURN);
-            mv.visitMaxs(0, 1);
-            mv.visitEnd();
-        }
-        cw.visitEnd();
-        return cw.toByteArray();
-    }
-
-    static class CL extends ClassLoader {
-        @Override
-        protected Class<?> findClass(String name) throws ClassNotFoundException {
-            byte[] classFile;
-            switch (name) {
-                case "I": classFile = dumpI(); break;
-                case "C": classFile = dumpC(); break;
-                default:
-                    throw new ClassNotFoundException(name);
-            }
-            return defineClass(name, classFile, 0, classFile.length);
-        }
-    }
-
-    public static void main(String[] args) throws Throwable {
-        Class<?> cls = (new CL()).loadClass("C");
-        try (FileOutputStream fos = new FileOutputStream("I.class")) { fos.write(dumpI()); }
-        try (FileOutputStream fos = new FileOutputStream("C.class")) { fos.write(dumpC()); }
-
-        int success = 0;
-        for (String name : new String[] { "testSpecialIntf", "testStaticIntf", "testSpecialClass", "testStaticClass"}) {
-            System.out.printf("%s: ", name);
-            try {
-                cls.getMethod(name).invoke(cls.newInstance());
-                System.out.println("FAILED");
-            } catch (Throwable e) {
-                if (e instanceof InvocationTargetException &&
-                    e.getCause() != null && e.getCause() instanceof IncompatibleClassChangeError) {
-                    System.out.println("PASSED");
-                    success++;
-                    continue;
-                }
-            }
-        }
-        if (success != 4) throw new Exception("Failed to catch ICCE");
-    }
-}