hotspot/src/share/vm/interpreter/linkResolver.cpp
changeset 46329 53ccc37bda19
parent 46262 83280d968b96
child 46408 70aab0c2ea8b
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -55,14 +55,14 @@
 // Implementation of CallInfo
 
 
-void CallInfo::set_static(KlassHandle resolved_klass, const methodHandle& resolved_method, TRAPS) {
+void CallInfo::set_static(Klass* resolved_klass, const methodHandle& resolved_method, TRAPS) {
   int vtable_index = Method::nonvirtual_vtable_index;
   set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK);
 }
 
 
-void CallInfo::set_interface(KlassHandle resolved_klass,
-                             KlassHandle selected_klass,
+void CallInfo::set_interface(Klass* resolved_klass,
+                             Klass* selected_klass,
                              const methodHandle& resolved_method,
                              const methodHandle& selected_method,
                              int itable_index, TRAPS) {
@@ -75,8 +75,8 @@
   set_common(resolved_klass, selected_klass, resolved_method, selected_method, CallInfo::itable_call, itable_index, CHECK);
 }
 
-void CallInfo::set_virtual(KlassHandle resolved_klass,
-                           KlassHandle selected_klass,
+void CallInfo::set_virtual(Klass* resolved_klass,
+                           Klass* selected_klass,
                            const methodHandle& resolved_method,
                            const methodHandle& selected_method,
                            int vtable_index, TRAPS) {
@@ -93,7 +93,7 @@
   set_handle(SystemDictionary::MethodHandle_klass(), resolved_method, resolved_appendix, resolved_method_type, CHECK);
 }
 
-void CallInfo::set_handle(KlassHandle resolved_klass,
+void CallInfo::set_handle(Klass* resolved_klass,
                           const methodHandle& resolved_method,
                           Handle resolved_appendix,
                           Handle resolved_method_type, TRAPS) {
@@ -110,8 +110,8 @@
   _resolved_method_type = resolved_method_type;
 }
 
-void CallInfo::set_common(KlassHandle resolved_klass,
-                          KlassHandle selected_klass,
+void CallInfo::set_common(Klass* resolved_klass,
+                          Klass* selected_klass,
                           const methodHandle& resolved_method,
                           const methodHandle& selected_method,
                           CallKind kind,
@@ -162,8 +162,8 @@
 
 #ifdef ASSERT
     // Ensure that this is really the case.
-    KlassHandle object_klass = SystemDictionary::Object_klass();
-    Method * object_resolved_method = object_klass()->vtable()->method_at(index);
+    Klass* object_klass = SystemDictionary::Object_klass();
+    Method * object_resolved_method = object_klass->vtable()->method_at(index);
     assert(object_resolved_method->name() == resolved_method->name(),
       "Object and interface method names should match at vtable index %d, %s != %s",
       index, object_resolved_method->name()->as_C_string(), resolved_method->name()->as_C_string());
@@ -225,14 +225,13 @@
 
 LinkInfo::LinkInfo(const constantPoolHandle& pool, int index, methodHandle current_method, TRAPS) {
    // resolve klass
-  Klass* result = pool->klass_ref_at(index, CHECK);
-  _resolved_klass = KlassHandle(THREAD, result);
+  _resolved_klass = pool->klass_ref_at(index, CHECK);
 
   // 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());
+  _current_klass = pool->pool_holder();
   _current_method = current_method;
 
   // Coming from the constant pool always checks access
@@ -241,14 +240,13 @@
 
 LinkInfo::LinkInfo(const constantPoolHandle& pool, int index, TRAPS) {
    // resolve klass
-  Klass* result = pool->klass_ref_at(index, CHECK);
-  _resolved_klass = KlassHandle(THREAD, result);
+  _resolved_klass = pool->klass_ref_at(index, CHECK);
 
   // 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());
+  _current_klass = pool->pool_holder();
   _current_method = methodHandle();
 
   // Coming from the constant pool always checks access
@@ -256,7 +254,7 @@
 }
 
 char* LinkInfo::method_string() const {
-  return Method::name_and_sig_as_C_string(_resolved_klass(), _name, _signature);
+  return Method::name_and_sig_as_C_string(_resolved_klass, _name, _signature);
 }
 
 #ifndef PRODUCT
@@ -266,20 +264,20 @@
                 _resolved_klass->name()->as_C_string(),
                 _name->as_C_string(),
                 _signature->as_C_string(),
-                _current_klass.is_null() ? "(none)" : _current_klass->name()->as_C_string(),
+                _current_klass == NULL ? "(none)" : _current_klass->name()->as_C_string(),
                 _check_access ? "true" : "false");
 }
 #endif // PRODUCT
 //------------------------------------------------------------------------------------------------------------------------
 // Klass resolution
 
-void LinkResolver::check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS) {
+void LinkResolver::check_klass_accessability(Klass* ref_klass, Klass* sel_klass, TRAPS) {
   Reflection::VerifyClassAccessResults vca_result =
-    Reflection::verify_class_access(ref_klass(), InstanceKlass::cast(sel_klass()), true);
+    Reflection::verify_class_access(ref_klass, InstanceKlass::cast(sel_klass), true);
   if (vca_result != Reflection::ACCESS_OK) {
     ResourceMark rm(THREAD);
-    char* msg = Reflection::verify_class_access_msg(ref_klass(),
-                                                    InstanceKlass::cast(sel_klass()),
+    char* msg = Reflection::verify_class_access_msg(ref_klass,
+                                                    InstanceKlass::cast(sel_klass),
                                                     vca_result);
     if (msg == NULL) {
       Exceptions::fthrow(
@@ -308,7 +306,7 @@
 methodHandle LinkResolver::lookup_method_in_klasses(const LinkInfo& link_info,
                                                     bool checkpolymorphism,
                                                     bool in_imethod_resolve, TRAPS) {
-  KlassHandle klass = link_info.resolved_klass();
+  Klass* klass = link_info.resolved_klass();
   Symbol* name = link_info.name();
   Symbol* signature = link_info.signature();
 
@@ -320,7 +318,7 @@
     return methodHandle(THREAD, result);
   }
 
-  InstanceKlass* ik = InstanceKlass::cast(klass());
+  InstanceKlass* ik = InstanceKlass::cast(klass);
 
   // JDK 8, JVMS 5.4.3.4: Interface method resolution should
   // ignore static and non-public methods of java.lang.Object,
@@ -358,7 +356,7 @@
 
 // returns first instance method
 // Looks up method in classes, then looks up local default methods
-methodHandle LinkResolver::lookup_instance_method_in_klasses(KlassHandle klass,
+methodHandle LinkResolver::lookup_instance_method_in_klasses(Klass* klass,
                                                              Symbol* name,
                                                              Symbol* signature, TRAPS) {
   Method* result = klass->uncached_lookup_method(name, signature, Klass::find_overpass);
@@ -374,7 +372,7 @@
   }
 
   if (result == NULL) {
-    Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
+    Array<Method*>* default_methods = InstanceKlass::cast(klass)->default_methods();
     if (default_methods != NULL) {
       result = InstanceKlass::find_method(default_methods, name, signature);
       assert(result == NULL || !result->is_static(), "static defaults not allowed");
@@ -383,13 +381,13 @@
   return methodHandle(THREAD, result);
 }
 
-int LinkResolver::vtable_index_of_interface_method(KlassHandle klass,
+int LinkResolver::vtable_index_of_interface_method(Klass* klass,
                                                    const methodHandle& resolved_method) {
 
   int vtable_index = Method::invalid_vtable_index;
   Symbol* name = resolved_method->name();
   Symbol* signature = resolved_method->signature();
-  InstanceKlass* ik = InstanceKlass::cast(klass());
+  InstanceKlass* ik = InstanceKlass::cast(klass);
 
   // First check in default method array
   if (!resolved_method->is_abstract() && ik->default_methods() != NULL) {
@@ -410,7 +408,7 @@
 }
 
 methodHandle LinkResolver::lookup_method_in_interfaces(const LinkInfo& cp_info, TRAPS) {
-  InstanceKlass *ik = InstanceKlass::cast(cp_info.resolved_klass()());
+  InstanceKlass *ik = InstanceKlass::cast(cp_info.resolved_klass());
 
   // Specify 'true' in order to skip default methods when searching the
   // interfaces.  Function lookup_method_in_klasses() already looked for
@@ -425,7 +423,7 @@
                                              Handle *appendix_result_or_null,
                                              Handle *method_type_result,
                                              TRAPS) {
-  KlassHandle klass = link_info.resolved_klass();
+  Klass* klass = link_info.resolved_klass();
   Symbol* name = link_info.name();
   Symbol* full_signature = link_info.signature();
 
@@ -436,8 +434,8 @@
                   vmIntrinsics::name_at(iid), klass->external_name(),
                   name->as_C_string(), full_signature->as_C_string());
   }
-  if ((klass() == SystemDictionary::MethodHandle_klass() ||
-       klass() == SystemDictionary::VarHandle_klass()) &&
+  if ((klass == SystemDictionary::MethodHandle_klass() ||
+       klass == SystemDictionary::VarHandle_klass()) &&
       iid != vmIntrinsics::_none) {
     if (MethodHandles::is_signature_polymorphic_intrinsic(iid)) {
       // Most of these do not need an up-call to Java to resolve, so can be done anywhere.
@@ -531,9 +529,9 @@
   return NULL;
 }
 
-void LinkResolver::check_method_accessability(KlassHandle ref_klass,
-                                              KlassHandle resolved_klass,
-                                              KlassHandle sel_klass,
+void LinkResolver::check_method_accessability(Klass* ref_klass,
+                                              Klass* resolved_klass,
+                                              Klass* sel_klass,
                                               const methodHandle& sel_method,
                                               TRAPS) {
 
@@ -547,7 +545,7 @@
   // We'll check for the method name first, as that's most likely
   // to be false (so we'll short-circuit out of these tests).
   if (sel_method->name() == vmSymbols::clone_name() &&
-      sel_klass() == SystemDictionary::Object_klass() &&
+      sel_klass == SystemDictionary::Object_klass() &&
       resolved_klass->is_array_klass()) {
     // We need to change "protected" to "public".
     assert(flags.is_protected(), "clone not protected?");
@@ -558,9 +556,9 @@
   }
 //  assert(extra_arg_result_or_null != NULL, "must be able to return extra argument");
 
-  if (!Reflection::verify_field_access(ref_klass(),
-                                       resolved_klass(),
-                                       sel_klass(),
+  if (!Reflection::verify_field_access(ref_klass,
+                                       resolved_klass,
+                                       sel_klass,
                                        flags,
                                        true)) {
     ResourceMark rm(THREAD);
@@ -586,22 +584,21 @@
   // It appears to fail when applied to an invokeinterface call site.
   // FIXME: Remove this method and ciMethod::check_call; refactor to use the other LinkResolver entry points.
   // resolve klass
-  KlassHandle resolved_klass;
   if (code == Bytecodes::_invokedynamic) {
-    resolved_klass = SystemDictionary::MethodHandle_klass();
+    Klass* resolved_klass = SystemDictionary::MethodHandle_klass();
     Symbol* method_name = vmSymbols::invoke_name();
     Symbol* method_signature = pool->signature_ref_at(index);
-    KlassHandle  current_klass(THREAD, pool->pool_holder());
+    Klass*  current_klass = pool->pool_holder();
     LinkInfo link_info(resolved_klass, method_name, method_signature, current_klass);
     return resolve_method(link_info, code, THREAD);
   }
 
   LinkInfo link_info(pool, index, methodHandle(), CHECK_NULL);
-  resolved_klass = link_info.resolved_klass();
+  Klass* resolved_klass = link_info.resolved_klass();
 
   if (pool->has_preresolution()
-      || (resolved_klass() == SystemDictionary::MethodHandle_klass() &&
-          MethodHandles::is_signature_polymorphic_name(resolved_klass(), link_info.name()))) {
+      || (resolved_klass == SystemDictionary::MethodHandle_klass() &&
+          MethodHandles::is_signature_polymorphic_name(resolved_klass, link_info.name()))) {
     Method* result = ConstantPool::method_at_if_loaded(pool, index);
     if (result != NULL) {
       return methodHandle(THREAD, result);
@@ -652,8 +649,8 @@
 }
 
 void LinkResolver::check_field_loader_constraints(Symbol* field, Symbol* sig,
-                                                  KlassHandle current_klass,
-                                                  KlassHandle sel_klass, TRAPS) {
+                                                  Klass* current_klass,
+                                                  Klass* sel_klass, TRAPS) {
   Handle ref_loader(THREAD, current_klass->class_loader());
   Handle sel_loader(THREAD, sel_klass->class_loader());
 
@@ -686,14 +683,14 @@
                                           Bytecodes::Code code, TRAPS) {
 
   Handle nested_exception;
-  KlassHandle resolved_klass = link_info.resolved_klass();
+  Klass* resolved_klass = link_info.resolved_klass();
 
   // 1. For invokevirtual, cannot call an interface method
   if (code == Bytecodes::_invokevirtual && resolved_klass->is_interface()) {
     ResourceMark rm(THREAD);
     char buf[200];
     jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected",
-        resolved_klass()->external_name());
+        resolved_klass->external_name());
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
@@ -727,21 +724,21 @@
   if (resolved_method.is_null()) {
     ResourceMark rm(THREAD);
     THROW_MSG_CAUSE_(vmSymbols::java_lang_NoSuchMethodError(),
-                    Method::name_and_sig_as_C_string(resolved_klass(),
+                    Method::name_and_sig_as_C_string(resolved_klass,
                                                      link_info.name(),
                                                      link_info.signature()),
                     nested_exception, NULL);
   }
 
-  // 6. access checks, access checking may be turned off when calling from within the VM.
-  KlassHandle current_klass = link_info.current_klass();
+  // 5. access checks, access checking may be turned off when calling from within the VM.
+  Klass* current_klass = link_info.current_klass();
   if (link_info.check_access()) {
-    assert(current_klass.not_null() , "current_klass should not be null");
+    assert(current_klass != NULL , "current_klass should not be null");
 
     // check if method can be accessed by the referring class
     check_method_accessability(current_klass,
                                resolved_klass,
-                               KlassHandle(THREAD, resolved_method->method_holder()),
+                               resolved_method->method_holder(),
                                resolved_method,
                                CHECK_NULL);
 
@@ -753,8 +750,8 @@
 }
 
 static void trace_method_resolution(const char* prefix,
-                                    KlassHandle klass,
-                                    KlassHandle resolved_klass,
+                                    Klass* klass,
+                                    Klass* resolved_klass,
                                     const methodHandle& method,
                                     bool logitables,
                                     int index = -1) {
@@ -768,9 +765,9 @@
   }
   st->print("%s%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
             prefix,
-            (klass.is_null() ? "<NULL>" : klass->internal_name()),
-            (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
-            Method::name_and_sig_as_C_string(resolved_klass(),
+            (klass == NULL ? "<NULL>" : klass->internal_name()),
+            (resolved_klass == NULL ? "<NULL>" : resolved_klass->internal_name()),
+            Method::name_and_sig_as_C_string(resolved_klass,
                                              method->name(),
                                              method->signature()),
             method->method_holder()->internal_name());
@@ -785,13 +782,13 @@
 // Do linktime resolution of a method in the interface within the context of the specied bytecode.
 methodHandle LinkResolver::resolve_interface_method(const LinkInfo& link_info, Bytecodes::Code code, TRAPS) {
 
-  KlassHandle resolved_klass = link_info.resolved_klass();
+  Klass* resolved_klass = link_info.resolved_klass();
 
   // check if klass is interface
   if (!resolved_klass->is_interface()) {
     ResourceMark rm(THREAD);
     char buf[200];
-    jio_snprintf(buf, sizeof(buf), "Found class %s, but interface was expected", resolved_klass()->external_name());
+    jio_snprintf(buf, sizeof(buf), "Found class %s, but interface was expected", resolved_klass->external_name());
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
@@ -816,21 +813,21 @@
     // no method found
     ResourceMark rm(THREAD);
     THROW_MSG_NULL(vmSymbols::java_lang_NoSuchMethodError(),
-                   Method::name_and_sig_as_C_string(resolved_klass(),
+                   Method::name_and_sig_as_C_string(resolved_klass,
                                                     link_info.name(),
                                                     link_info.signature()));
   }
 
   if (link_info.check_access()) {
     // JDK8 adds non-public interface methods, and accessability check requirement
-    KlassHandle current_klass = link_info.current_klass();
+    Klass* current_klass = link_info.current_klass();
 
-    assert(current_klass.not_null() , "current_klass should not be null");
+    assert(current_klass != NULL , "current_klass should not be null");
 
     // check if method can be accessed by the referring class
     check_method_accessability(current_klass,
                                resolved_klass,
-                               KlassHandle(THREAD, resolved_method->method_holder()),
+                               resolved_method->method_holder(),
                                resolved_method,
                                CHECK_NULL);
 
@@ -841,7 +838,7 @@
     ResourceMark rm(THREAD);
     char buf[200];
     jio_snprintf(buf, sizeof(buf), "Expected instance not static method %s",
-                 Method::name_and_sig_as_C_string(resolved_klass(),
+                 Method::name_and_sig_as_C_string(resolved_klass,
                  resolved_method->name(), resolved_method->signature()));
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
@@ -850,12 +847,12 @@
     ResourceMark rm(THREAD);
     char buf[200];
 
-    KlassHandle current_klass = link_info.current_klass();
+    Klass* current_klass = link_info.current_klass();
     jio_snprintf(buf, sizeof(buf), "private interface method requires invokespecial, not invokeinterface: method %s, caller-class:%s",
-                 Method::name_and_sig_as_C_string(resolved_klass(),
+                 Method::name_and_sig_as_C_string(resolved_klass,
                                                   resolved_method->name(),
                                                   resolved_method->signature()),
-                                                  (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()));
+                                                  (current_klass == NULL ? "<NULL>" : current_klass->internal_name()));
      THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
@@ -873,14 +870,14 @@
 //------------------------------------------------------------------------------------------------------------------------
 // Field resolution
 
-void LinkResolver::check_field_accessability(KlassHandle ref_klass,
-                                             KlassHandle resolved_klass,
-                                             KlassHandle sel_klass,
+void LinkResolver::check_field_accessability(Klass* ref_klass,
+                                             Klass* resolved_klass,
+                                             Klass* sel_klass,
                                              const fieldDescriptor& fd,
                                              TRAPS) {
-  if (!Reflection::verify_field_access(ref_klass(),
-                                       resolved_klass(),
-                                       sel_klass(),
+  if (!Reflection::verify_field_access(ref_klass,
+                                       resolved_klass,
+                                       sel_klass,
                                        fd.access_flags(),
                                        true)) {
     ResourceMark rm(THREAD);
@@ -913,19 +910,19 @@
   bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
   bool is_put    = (byte == Bytecodes::_putfield  || byte == Bytecodes::_putstatic || byte == Bytecodes::_nofast_putfield);
   // Check if there's a resolved klass containing the field
-  KlassHandle resolved_klass = link_info.resolved_klass();
+  Klass* resolved_klass = link_info.resolved_klass();
   Symbol* field = link_info.name();
   Symbol* sig = link_info.signature();
 
-  if (resolved_klass.is_null()) {
+  if (resolved_klass == NULL) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
   }
 
   // Resolve instance field
-  KlassHandle sel_klass(THREAD, resolved_klass->find_field(field, sig, &fd));
+  Klass* sel_klass = resolved_klass->find_field(field, sig, &fd);
   // check if field exists; i.e., if a klass containing the field def has been selected
-  if (sel_klass.is_null()) {
+  if (sel_klass == NULL) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
   }
@@ -935,14 +932,14 @@
     return;
 
   // check access
-  KlassHandle current_klass = link_info.current_klass();
+  Klass* current_klass = link_info.current_klass();
   check_field_accessability(current_klass, resolved_klass, sel_klass, fd, CHECK);
 
   // check for errors
   if (is_static != fd.is_static()) {
     ResourceMark rm(THREAD);
     char msg[200];
-    jio_snprintf(msg, sizeof(msg), "Expected %s field %s.%s", is_static ? "static" : "non-static", resolved_klass()->external_name(), fd.name()->as_C_string());
+    jio_snprintf(msg, sizeof(msg), "Expected %s field %s.%s", is_static ? "static" : "non-static", resolved_klass->external_name(), fd.name()->as_C_string());
     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), msg);
   }
 
@@ -954,10 +951,10 @@
     ResourceMark rm(THREAD);
     stringStream ss;
 
-    if (sel_klass() != current_klass()) {
+    if (sel_klass != current_klass) {
       ss.print("Update to %s final field %s.%s attempted from a different class (%s) than the field's declaring class",
-                is_static ? "static" : "non-static", resolved_klass()->external_name(), fd.name()->as_C_string(),
-                current_klass()->external_name());
+                is_static ? "static" : "non-static", resolved_klass->external_name(), fd.name()->as_C_string(),
+                current_klass->external_name());
       THROW_MSG(vmSymbols::java_lang_IllegalAccessError(), ss.as_string());
     }
 
@@ -973,7 +970,7 @@
 
       if (is_initialized_static_final_update || is_initialized_instance_final_update) {
         ss.print("Update to %s final field %s.%s attempted from a different method (%s) than the initializer method %s ",
-                 is_static ? "static" : "non-static", resolved_klass()->external_name(), fd.name()->as_C_string(),
+                 is_static ? "static" : "non-static", resolved_klass->external_name(), fd.name()->as_C_string(),
                  m()->name()->as_C_string(),
                  is_static ? "<clinit>" : "<init>");
         THROW_MSG(vmSymbols::java_lang_IllegalAccessError(), ss.as_string());
@@ -991,7 +988,7 @@
     sel_klass->initialize(CHECK);
   }
 
-  if (sel_klass() != current_klass()) {
+  if (sel_klass != current_klass) {
     check_field_loader_constraints(field, sig, current_klass, sel_klass, CHECK);
   }
 
@@ -1017,7 +1014,7 @@
   methodHandle resolved_method = linktime_resolve_static_method(link_info, CHECK);
 
   // The resolved class can change as a result of this resolution.
-  KlassHandle resolved_klass(THREAD, resolved_method->method_holder());
+  Klass* resolved_klass = resolved_method->method_holder();
 
   // Initialize klass (this should only happen if everything is ok)
   if (initialize_class && resolved_klass->should_be_initialized()) {
@@ -1036,7 +1033,7 @@
 // throws linktime exceptions
 methodHandle LinkResolver::linktime_resolve_static_method(const LinkInfo& link_info, TRAPS) {
 
-  KlassHandle resolved_klass = link_info.resolved_klass();
+  Klass* resolved_klass = link_info.resolved_klass();
   methodHandle resolved_method;
   if (!resolved_klass->is_interface()) {
     resolved_method = resolve_method(link_info, Bytecodes::_invokestatic, CHECK_NULL);
@@ -1049,7 +1046,7 @@
   if (!resolved_method->is_static()) {
     ResourceMark rm(THREAD);
     char buf[200];
-    jio_snprintf(buf, sizeof(buf), "Expected static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
+    jio_snprintf(buf, sizeof(buf), "Expected static method %s", Method::name_and_sig_as_C_string(resolved_klass,
                                                       resolved_method->name(),
                                                       resolved_method->signature()));
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
@@ -1078,7 +1075,7 @@
   // superclass.method, which can also resolve to a default method
   // and the selected method is recalculated relative to the direct superclass
   // superinterface.method, which explicitly does not check shadowing
-  KlassHandle resolved_klass = link_info.resolved_klass();
+  Klass* resolved_klass = link_info.resolved_klass();
   methodHandle resolved_method;
 
   if (!resolved_klass->is_interface()) {
@@ -1089,7 +1086,7 @@
 
   // check if method name is <init>, that it is found in same klass as static type
   if (resolved_method->name() == vmSymbols::object_initializer_name() &&
-      resolved_method->method_holder() != resolved_klass()) {
+      resolved_method->method_holder() != resolved_klass) {
     ResourceMark rm(THREAD);
     Exceptions::fthrow(
       THREAD_AND_LOCATION,
@@ -1103,24 +1100,25 @@
   }
 
   // check if invokespecial's interface method reference is in an indirect superinterface
-  KlassHandle current_klass = link_info.current_klass();
-  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();
+  Klass* current_klass = link_info.current_klass();
+  if (current_klass != NULL && resolved_klass->is_interface()) {
+    InstanceKlass* ck = InstanceKlass::cast(current_klass);
+    InstanceKlass *klass_to_check = !ck->is_anonymous() ?
+                                    ck :
+                                    InstanceKlass::cast(ck->host_klass());
     // Disable verification for the dynamically-generated reflection bytecodes.
     bool is_reflect = klass_to_check->is_subclass_of(
                         SystemDictionary::reflect_MagicAccessorImpl_klass());
 
     if (!is_reflect &&
-        !InstanceKlass::cast(klass_to_check)->is_same_or_direct_interface(resolved_klass())) {
+        !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()),
+                   Method::name_and_sig_as_C_string(resolved_klass,
+                                                    resolved_method->name(),
+                                                    resolved_method->signature()),
                    current_klass->external_name());
       THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
     }
@@ -1132,7 +1130,7 @@
     char buf[200];
     jio_snprintf(buf, sizeof(buf),
                  "Expecting non-static method %s",
-                 Method::name_and_sig_as_C_string(resolved_klass(),
+                 Method::name_and_sig_as_C_string(resolved_klass,
                                                   resolved_method->name(),
                                                   resolved_method->signature()));
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
@@ -1149,8 +1147,8 @@
 // throws runtime exceptions
 void LinkResolver::runtime_resolve_special_method(CallInfo& result,
                                                   const methodHandle& resolved_method,
-                                                  KlassHandle resolved_klass,
-                                                  KlassHandle current_klass,
+                                                  Klass* resolved_klass,
+                                                  Klass* current_klass,
                                                   bool check_access, TRAPS) {
 
   // resolved method is selected method unless we have an old-style lookup
@@ -1160,33 +1158,29 @@
   methodHandle sel_method(THREAD, resolved_method());
 
   // check if this is an old-style super call and do a new lookup if so
-  { KlassHandle method_klass  = KlassHandle(THREAD,
-                                            resolved_method->method_holder());
-
-    if (check_access &&
-        // a) check if ACC_SUPER flag is set for the current class
-        (current_klass->is_super() || !AllowNonVirtualCalls) &&
-        // b) check if the class of the resolved_klass is a superclass
-        // (not supertype in order to exclude interface classes) of the current class.
-        // This check is not performed for super.invoke for interface methods
-        // in super interfaces.
-        current_klass->is_subclass_of(resolved_klass()) &&
-        current_klass() != resolved_klass() &&
-        // c) check if the method is not <init>
-        resolved_method->name() != vmSymbols::object_initializer_name()) {
-      // Lookup super method
-      KlassHandle super_klass(THREAD, current_klass->super());
-      sel_method = lookup_instance_method_in_klasses(super_klass,
-                           resolved_method->name(),
-                           resolved_method->signature(), CHECK);
-      // check if found
-      if (sel_method.is_null()) {
-        ResourceMark rm(THREAD);
-        THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
-                  Method::name_and_sig_as_C_string(resolved_klass(),
-                                            resolved_method->name(),
-                                            resolved_method->signature()));
-      }
+  if (check_access &&
+      // a) check if ACC_SUPER flag is set for the current class
+      (current_klass->is_super() || !AllowNonVirtualCalls) &&
+      // b) check if the class of the resolved_klass is a superclass
+      // (not supertype in order to exclude interface classes) of the current class.
+      // This check is not performed for super.invoke for interface methods
+      // in super interfaces.
+      current_klass->is_subclass_of(resolved_klass) &&
+      current_klass != resolved_klass &&
+      // c) check if the method is not <init>
+      resolved_method->name() != vmSymbols::object_initializer_name()) {
+    // Lookup super method
+    Klass* super_klass = current_klass->super();
+    sel_method = lookup_instance_method_in_klasses(super_klass,
+                         resolved_method->name(),
+                         resolved_method->signature(), CHECK);
+    // check if found
+    if (sel_method.is_null()) {
+      ResourceMark rm(THREAD);
+      THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
+                Method::name_and_sig_as_C_string(resolved_klass,
+                                          resolved_method->name(),
+                                          resolved_method->signature()));
     }
   }
 
@@ -1194,9 +1188,9 @@
   if (sel_method->is_static()) {
     ResourceMark rm(THREAD);
     char buf[200];
-    jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
-                                                                                                             resolved_method->name(),
-                                                                                                             resolved_method->signature()));
+    jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass,
+                                                                                      resolved_method->name(),
+                                                                                      resolved_method->signature()));
     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
@@ -1204,7 +1198,7 @@
   if (sel_method->is_abstract()) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
-              Method::name_and_sig_as_C_string(resolved_klass(),
+              Method::name_and_sig_as_C_string(resolved_klass,
                                                sel_method->name(),
                                                sel_method->signature()));
   }
@@ -1218,7 +1212,7 @@
   result.set_static(resolved_klass, sel_method, CHECK);
 }
 
-void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, KlassHandle receiver_klass,
+void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, Klass* receiver_klass,
                                         const LinkInfo& link_info,
                                         bool check_null_and_abstract, TRAPS) {
   methodHandle resolved_method = linktime_resolve_virtual_method(link_info, CHECK);
@@ -1238,18 +1232,18 @@
   assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
 
   // check if private interface method
-  KlassHandle resolved_klass = link_info.resolved_klass();
-  KlassHandle current_klass = link_info.current_klass();
+  Klass* resolved_klass = link_info.resolved_klass();
+  Klass* current_klass = link_info.current_klass();
 
   // This is impossible, if resolve_klass is an interface, we've thrown icce in resolve_method
   if (resolved_klass->is_interface() && resolved_method->is_private()) {
     ResourceMark rm(THREAD);
     char buf[200];
     jio_snprintf(buf, sizeof(buf), "private interface method requires invokespecial, not invokevirtual: method %s, caller-class:%s",
-                 Method::name_and_sig_as_C_string(resolved_klass(),
+                 Method::name_and_sig_as_C_string(resolved_klass,
                                                   resolved_method->name(),
                                                   resolved_method->signature()),
-                   (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()));
+                   (current_klass == NULL ? "<NULL>" : current_klass->internal_name()));
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
@@ -1257,9 +1251,9 @@
   if (resolved_method->is_static()) {
     ResourceMark rm(THREAD);
     char buf[200];
-    jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
-                                                                                                             resolved_method->name(),
-                                                                                                             resolved_method->signature()));
+    jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass,
+                                                                                           resolved_method->name(),
+                                                                                           resolved_method->signature()));
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
@@ -1274,9 +1268,9 @@
 // throws runtime exceptions
 void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
                                                   const methodHandle& resolved_method,
-                                                  KlassHandle resolved_klass,
+                                                  Klass* resolved_klass,
                                                   Handle recv,
-                                                  KlassHandle recv_klass,
+                                                  Klass* recv_klass,
                                                   bool check_null_and_abstract,
                                                   TRAPS) {
 
@@ -1325,18 +1319,18 @@
   if (selected_method.is_null()) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
-              Method::name_and_sig_as_C_string(resolved_klass(),
-                                                      resolved_method->name(),
-                                                      resolved_method->signature()));
+              Method::name_and_sig_as_C_string(resolved_klass,
+                                               resolved_method->name(),
+                                               resolved_method->signature()));
   }
 
   // check if abstract
   if (check_null_and_abstract && selected_method->is_abstract()) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
-              Method::name_and_sig_as_C_string(resolved_klass(),
-                                                      selected_method->name(),
-                                                      selected_method->signature()));
+              Method::name_and_sig_as_C_string(resolved_klass,
+                                               selected_method->name(),
+                                               selected_method->signature()));
   }
 
   if (log_develop_is_enabled(Trace, vtables)) {
@@ -1348,7 +1342,7 @@
   result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK);
 }
 
-void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass,
+void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, Klass* recv_klass,
                                           const LinkInfo& link_info,
                                           bool check_null_and_abstract, TRAPS) {
   // throws linktime exceptions
@@ -1370,9 +1364,9 @@
 // throws runtime exceptions
 void LinkResolver::runtime_resolve_interface_method(CallInfo& result,
                                                     const methodHandle& resolved_method,
-                                                    KlassHandle resolved_klass,
+                                                    Klass* resolved_klass,
                                                     Handle recv,
-                                                    KlassHandle recv_klass,
+                                                    Klass* recv_klass,
                                                     bool check_null_and_abstract, TRAPS) {
   // check if receiver exists
   if (check_null_and_abstract && recv.is_null()) {
@@ -1380,12 +1374,12 @@
   }
 
   // check if receiver klass implements the resolved interface
-  if (!recv_klass->is_subtype_of(resolved_klass())) {
+  if (!recv_klass->is_subtype_of(resolved_klass)) {
     ResourceMark rm(THREAD);
     char buf[200];
     jio_snprintf(buf, sizeof(buf), "Class %s does not implement the requested interface %s",
-                 recv_klass()->external_name(),
-                 resolved_klass()->external_name());
+                 recv_klass->external_name(),
+                 resolved_klass->external_name());
     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
@@ -1405,7 +1399,7 @@
   if (sel_method.is_null()) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
-                   Method::name_and_sig_as_C_string(recv_klass(),
+                   Method::name_and_sig_as_C_string(recv_klass,
                                                     resolved_method->name(),
                                                     resolved_method->signature()));
   }
@@ -1414,7 +1408,7 @@
   if (!sel_method->is_public()) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
-              Method::name_and_sig_as_C_string(recv_klass(),
+              Method::name_and_sig_as_C_string(recv_klass,
                                                sel_method->name(),
                                                sel_method->signature()));
   }
@@ -1422,9 +1416,9 @@
   if (check_null_and_abstract && sel_method->is_abstract()) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
-              Method::name_and_sig_as_C_string(recv_klass(),
-                                                      sel_method->name(),
-                                                      sel_method->signature()));
+              Method::name_and_sig_as_C_string(recv_klass,
+                                               sel_method->name(),
+                                               sel_method->signature()));
   }
 
   if (log_develop_is_enabled(Trace, itables)) {
@@ -1468,7 +1462,7 @@
 }
 
 methodHandle LinkResolver::resolve_virtual_call_or_null(
-                                                 KlassHandle receiver_klass,
+                                                 Klass* receiver_klass,
                                                  const LinkInfo& link_info) {
   EXCEPTION_MARK;
   CallInfo info;
@@ -1481,7 +1475,7 @@
 }
 
 methodHandle LinkResolver::resolve_interface_call_or_null(
-                                                 KlassHandle receiver_klass,
+                                                 Klass* receiver_klass,
                                                  const LinkInfo& link_info) {
   EXCEPTION_MARK;
   CallInfo info;
@@ -1493,7 +1487,7 @@
   return info.selected_method();
 }
 
-int LinkResolver::resolve_virtual_vtable_index(KlassHandle receiver_klass,
+int LinkResolver::resolve_virtual_vtable_index(Klass* receiver_klass,
                                                const LinkInfo& link_info) {
   EXCEPTION_MARK;
   CallInfo info;
@@ -1548,7 +1542,7 @@
 void LinkResolver::resolve_invoke(CallInfo& result, Handle& recv,
                              const methodHandle& attached_method,
                              Bytecodes::Code byte, TRAPS) {
-  KlassHandle defc = attached_method->method_holder();
+  Klass* defc = attached_method->method_holder();
   Symbol* name = attached_method->name();
   Symbol* type = attached_method->signature();
   LinkInfo link_info(defc, name, type);
@@ -1589,14 +1583,14 @@
                                           TRAPS) {
 
   LinkInfo link_info(pool, index, CHECK);
-  KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
+  Klass* recvrKlass = recv.is_null() ? (Klass*)NULL : recv->klass();
   resolve_virtual_call(result, recv, recvrKlass, link_info, /*check_null_or_abstract*/true, CHECK);
 }
 
 
 void LinkResolver::resolve_invokeinterface(CallInfo& result, Handle recv, const constantPoolHandle& pool, int index, TRAPS) {
   LinkInfo link_info(pool, index, CHECK);
-  KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
+  Klass* recvrKlass = recv.is_null() ? (Klass*)NULL : recv->klass();
   resolve_interface_call(result, recv, recvrKlass, link_info, true, CHECK);
 }
 
@@ -1616,9 +1610,9 @@
                                        const LinkInfo& link_info,
                                        TRAPS) {
   // JSR 292:  this must be an implicitly generated method MethodHandle.invokeExact(*...) or similar
-  KlassHandle resolved_klass = link_info.resolved_klass();
-  assert(resolved_klass() == SystemDictionary::MethodHandle_klass() ||
-         resolved_klass() == SystemDictionary::VarHandle_klass(), "");
+  Klass* resolved_klass = link_info.resolved_klass();
+  assert(resolved_klass == SystemDictionary::MethodHandle_klass() ||
+         resolved_klass == SystemDictionary::VarHandle_klass(), "");
   assert(MethodHandles::is_signature_polymorphic_name(link_info.name()), "");
   Handle       resolved_appendix;
   Handle       resolved_method_type;
@@ -1655,7 +1649,7 @@
 void LinkResolver::resolve_invokedynamic(CallInfo& result, const constantPoolHandle& pool, int index, TRAPS) {
   Symbol* method_name       = pool->name_ref_at(index);
   Symbol* method_signature  = pool->signature_ref_at(index);
-  KlassHandle current_klass = KlassHandle(THREAD, pool->pool_holder());
+  Klass* current_klass = pool->pool_holder();
 
   // Resolve the bootstrap specifier (BSM + optional arguments).
   Handle bootstrap_specifier;
@@ -1693,7 +1687,7 @@
 void LinkResolver::resolve_dynamic_call(CallInfo& result,
                                         Handle bootstrap_specifier,
                                         Symbol* method_name, Symbol* method_signature,
-                                        KlassHandle current_klass,
+                                        Klass* current_klass,
                                         TRAPS) {
   // JSR 292:  this must resolve to an implicitly generated method MH.linkToCallSite(*...)
   // The appendix argument is likely to be a freshly-created CallSite.