src/share/vm/interpreter/linkResolver.cpp
author jrose
Wed Jun 01 23:25:20 2011 -0700 (23 months ago)
changeset 2512 ba550512d3b2
parent 2422acf5e660c71a
permissions -rw-r--r--
7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
Summary: Delegate invokedynamic linkage errors to MethodHandleNatives.raiseException.
Reviewed-by: never
        1 /*
        2  * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
        3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        4  *
        5  * This code is free software; you can redistribute it and/or modify it
        6  * under the terms of the GNU General Public License version 2 only, as
        7  * published by the Free Software Foundation.
        8  *
        9  * This code is distributed in the hope that it will be useful, but WITHOUT
       10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       12  * version 2 for more details (a copy is included in the LICENSE file that
       13  * accompanied this code).
       14  *
       15  * You should have received a copy of the GNU General Public License version
       16  * 2 along with this work; if not, write to the Free Software Foundation,
       17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       18  *
       19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       20  * or visit www.oracle.com if you need additional information or have any
       21  * questions.
       22  *
       23  */
       24 
       25 #include "precompiled.hpp"
       26 #include "classfile/systemDictionary.hpp"
       27 #include "classfile/vmSymbols.hpp"
       28 #include "compiler/compileBroker.hpp"
       29 #include "gc_interface/collectedHeap.inline.hpp"
       30 #include "interpreter/bytecode.hpp"
       31 #include "interpreter/interpreterRuntime.hpp"
       32 #include "interpreter/linkResolver.hpp"
       33 #include "memory/resourceArea.hpp"
       34 #include "memory/universe.inline.hpp"
       35 #include "oops/instanceKlass.hpp"
       36 #include "oops/objArrayOop.hpp"
       37 #include "prims/methodHandles.hpp"
       38 #include "prims/nativeLookup.hpp"
       39 #include "runtime/compilationPolicy.hpp"
       40 #include "runtime/fieldDescriptor.hpp"
       41 #include "runtime/frame.inline.hpp"
       42 #include "runtime/handles.inline.hpp"
       43 #include "runtime/reflection.hpp"
       44 #include "runtime/signature.hpp"
       45 #include "runtime/vmThread.hpp"
       46 #ifdef TARGET_OS_FAMILY_linux
       47 # include "thread_linux.inline.hpp"
       48 #endif
       49 #ifdef TARGET_OS_FAMILY_solaris
       50 # include "thread_solaris.inline.hpp"
       51 #endif
       52 #ifdef TARGET_OS_FAMILY_windows
       53 # include "thread_windows.inline.hpp"
       54 #endif
       55 
       56 //------------------------------------------------------------------------------------------------------------------------
       57 // Implementation of FieldAccessInfo
       58 
       59 void FieldAccessInfo::set(KlassHandle klass, Symbol* name, int field_index, int field_offset,
       60 BasicType field_type, AccessFlags access_flags) {
       61   _klass        = klass;
       62   _name         = name;
       63   _field_index  = field_index;
       64   _field_offset = field_offset;
       65   _field_type   = field_type;
       66   _access_flags = access_flags;
       67 }
       68 
       69 
       70 //------------------------------------------------------------------------------------------------------------------------
       71 // Implementation of CallInfo
       72 
       73 
       74 void CallInfo::set_static(KlassHandle resolved_klass, methodHandle resolved_method, TRAPS) {
       75   int vtable_index = methodOopDesc::nonvirtual_vtable_index;
       76   set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, vtable_index, CHECK);
       77 }
       78 
       79 
       80 void CallInfo::set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, TRAPS) {
       81   // This is only called for interface methods. If the resolved_method
       82   // comes from java/lang/Object, it can be the subject of a virtual call, so
       83   // we should pick the vtable index from the resolved method.
       84   // Other than that case, there is no valid vtable index to specify.
       85   int vtable_index = methodOopDesc::invalid_vtable_index;
       86   if (resolved_method->method_holder() == SystemDictionary::Object_klass()) {
       87     assert(resolved_method->vtable_index() == selected_method->vtable_index(), "sanity check");
       88     vtable_index = resolved_method->vtable_index();
       89   }
       90   set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
       91 }
       92 
       93 void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
       94   assert(vtable_index >= 0 || vtable_index == methodOopDesc::nonvirtual_vtable_index, "valid index");
       95   set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
       96 }
       97 
       98 void CallInfo::set_dynamic(methodHandle resolved_method, TRAPS) {
       99   assert(resolved_method->is_method_handle_invoke(), "");
      100   KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
      101   assert(resolved_klass == resolved_method->method_holder(), "");
      102   int vtable_index = methodOopDesc::nonvirtual_vtable_index;
      103   assert(resolved_method->vtable_index() == vtable_index, "");
      104   set_common(resolved_klass, KlassHandle(), resolved_method, resolved_method, vtable_index, CHECK);
      105 }
      106 
      107 void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
      108   assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
      109   _resolved_klass  = resolved_klass;
      110   _selected_klass  = selected_klass;
      111   _resolved_method = resolved_method;
      112   _selected_method = selected_method;
      113   _vtable_index    = vtable_index;
      114   if (CompilationPolicy::must_be_compiled(selected_method)) {
      115     // This path is unusual, mostly used by the '-Xcomp' stress test mode.
      116 
      117     // Note: with several active threads, the must_be_compiled may be true
      118     //       while can_be_compiled is false; remove assert
      119     // assert(CompilationPolicy::can_be_compiled(selected_method), "cannot compile");
      120     if (THREAD->is_Compiler_thread()) {
      121       // don't force compilation, resolve was on behalf of compiler
      122       return;
      123     }
      124     if (instanceKlass::cast(selected_method->method_holder())->is_not_initialized()) {
      125       // 'is_not_initialized' means not only '!is_initialized', but also that
      126       // initialization has not been started yet ('!being_initialized')
      127       // Do not force compilation of methods in uninitialized classes.
      128       // Note that doing this would throw an assert later,
      129       // in CompileBroker::compile_method.
      130       // We sometimes use the link resolver to do reflective lookups
      131       // even before classes are initialized.
      132       return;
      133     }
      134     CompileBroker::compile_method(selected_method, InvocationEntryBci,
      135                                   CompLevel_initial_compile,
      136                                   methodHandle(), 0, "must_be_compiled", CHECK);
      137   }
      138 }
      139 
      140 
      141 //------------------------------------------------------------------------------------------------------------------------
      142 // Klass resolution
      143 
      144 void LinkResolver::check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS) {
      145   if (!Reflection::verify_class_access(ref_klass->as_klassOop(),
      146                                        sel_klass->as_klassOop(),
      147                                        true)) {
      148     ResourceMark rm(THREAD);
      149     Exceptions::fthrow(
      150       THREAD_AND_LOCATION,
      151       vmSymbols::java_lang_IllegalAccessError(),
      152       "tried to access class %s from class %s",
      153       sel_klass->external_name(),
      154       ref_klass->external_name()
      155     );
      156     return;
      157   }
      158 }
      159 
      160 void LinkResolver::resolve_klass(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
      161   klassOop result_oop = pool->klass_ref_at(index, CHECK);
      162   result = KlassHandle(THREAD, result_oop);
      163 }
      164 
      165 void LinkResolver::resolve_klass_no_update(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
      166   klassOop result_oop =
      167          constantPoolOopDesc::klass_ref_at_if_loaded_check(pool, index, CHECK);
      168   result = KlassHandle(THREAD, result_oop);
      169 }
      170 
      171 
      172 //------------------------------------------------------------------------------------------------------------------------
      173 // Method resolution
      174 //
      175 // According to JVM spec. $5.4.3c & $5.4.3d
      176 
      177 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
      178   methodOop result_oop = klass->uncached_lookup_method(name, signature);
      179   if (EnableInvokeDynamic && result_oop != NULL) {
      180     switch (result_oop->intrinsic_id()) {
      181     case vmIntrinsics::_invokeExact:
      182     case vmIntrinsics::_invokeGeneric:
      183     case vmIntrinsics::_invokeDynamic:
      184       // Do not link directly to these.  The VM must produce a synthetic one using lookup_implicit_method.
      185       return;
      186     }
      187   }
      188   result = methodHandle(THREAD, result_oop);
      189 }
      190 
      191 // returns first instance method
      192 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
      193   methodOop result_oop = klass->uncached_lookup_method(name, signature);
      194   result = methodHandle(THREAD, result_oop);
      195   while (!result.is_null() && result->is_static()) {
      196     klass = KlassHandle(THREAD, Klass::cast(result->method_holder())->super());
      197     result = methodHandle(THREAD, klass->uncached_lookup_method(name, signature));
      198   }
      199 }
      200 
      201 
      202 int LinkResolver::vtable_index_of_miranda_method(KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
      203   ResourceMark rm(THREAD);
      204   klassVtable *vt = instanceKlass::cast(klass())->vtable();
      205   return vt->index_of_miranda(name, signature);
      206 }
      207 
      208 void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
      209   instanceKlass *ik = instanceKlass::cast(klass());
      210   result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature));
      211 }
      212 
      213 void LinkResolver::lookup_implicit_method(methodHandle& result,
      214                                           KlassHandle klass, Symbol* name, Symbol* signature,
      215                                           KlassHandle current_klass,
      216                                           TRAPS) {
      217   if (EnableInvokeDynamic &&
      218       klass() == SystemDictionary::MethodHandle_klass() &&
      219       methodOopDesc::is_method_handle_invoke_name(name)) {
      220     if (!THREAD->is_Compiler_thread() && !MethodHandles::enabled()) {
      221       // Make sure the Java part of the runtime has been booted up.
      222       klassOop natives = SystemDictionary::MethodHandleNatives_klass();
      223       if (natives == NULL || instanceKlass::cast(natives)->is_not_initialized()) {
      224         SystemDictionary::resolve_or_fail(vmSymbols::java_lang_invoke_MethodHandleNatives(),
      225                                           Handle(),
      226                                           Handle(),
      227                                           true,
      228                                           CHECK);
      229       }
      230     }
      231     methodOop result_oop = SystemDictionary::find_method_handle_invoke(name,
      232                                                                        signature,
      233                                                                        current_klass,
      234                                                                        CHECK);
      235     if (result_oop != NULL) {
      236       assert(result_oop->is_method_handle_invoke() && result_oop->signature() == signature, "consistent");
      237       result = methodHandle(THREAD, result_oop);
      238     }
      239   }
      240 }
      241 
      242 void LinkResolver::check_method_accessability(KlassHandle ref_klass,
      243                                               KlassHandle resolved_klass,
      244                                               KlassHandle sel_klass,
      245                                               methodHandle sel_method,
      246                                               TRAPS) {
      247 
      248   AccessFlags flags = sel_method->access_flags();
      249 
      250   // Special case:  arrays always override "clone". JVMS 2.15.
      251   // If the resolved klass is an array class, and the declaring class
      252   // is java.lang.Object and the method is "clone", set the flags
      253   // to public.
      254   //
      255   // We'll check for the method name first, as that's most likely
      256   // to be false (so we'll short-circuit out of these tests).
      257   if (sel_method->name() == vmSymbols::clone_name() &&
      258       sel_klass() == SystemDictionary::Object_klass() &&
      259       resolved_klass->oop_is_array()) {
      260     // We need to change "protected" to "public".
      261     assert(flags.is_protected(), "clone not protected?");
      262     jint new_flags = flags.as_int();
      263     new_flags = new_flags & (~JVM_ACC_PROTECTED);
      264     new_flags = new_flags | JVM_ACC_PUBLIC;
      265     flags.set_flags(new_flags);
      266   }
      267 
      268   if (!Reflection::verify_field_access(ref_klass->as_klassOop(),
      269                                        resolved_klass->as_klassOop(),
      270                                        sel_klass->as_klassOop(),
      271                                        flags,
      272                                        true)) {
      273     ResourceMark rm(THREAD);
      274     Exceptions::fthrow(
      275       THREAD_AND_LOCATION,
      276       vmSymbols::java_lang_IllegalAccessError(),
      277       "tried to access method %s.%s%s from class %s",
      278       sel_klass->external_name(),
      279       sel_method->name()->as_C_string(),
      280       sel_method->signature()->as_C_string(),
      281       ref_klass->external_name()
      282     );
      283     return;
      284   }
      285 }
      286 
      287 void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle& resolved_klass,
      288                                   constantPoolHandle pool, int index, TRAPS) {
      289 
      290   // resolve klass
      291   resolve_klass(resolved_klass, pool, index, CHECK);
      292 
      293   Symbol*  method_name       = pool->name_ref_at(index);
      294   Symbol*  method_signature  = pool->signature_ref_at(index);
      295   KlassHandle  current_klass(THREAD, pool->pool_holder());
      296 
      297   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
      298 }
      299 
      300 void LinkResolver::resolve_dynamic_method(methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS) {
      301   // The class is java.lang.invoke.MethodHandle
      302   resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
      303 
      304   Symbol* method_name = vmSymbols::invokeExact_name();
      305 
      306   Symbol*  method_signature = pool->signature_ref_at(index);
      307   KlassHandle  current_klass   (THREAD, pool->pool_holder());
      308 
      309   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
      310 }
      311 
      312 void LinkResolver::resolve_interface_method(methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS) {
      313 
      314   // resolve klass
      315   resolve_klass(resolved_klass, pool, index, CHECK);
      316   Symbol*  method_name       = pool->name_ref_at(index);
      317   Symbol*  method_signature  = pool->signature_ref_at(index);
      318   KlassHandle  current_klass(THREAD, pool->pool_holder());
      319 
      320   resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
      321 }
      322 
      323 
      324 void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
      325                                   Symbol* method_name, Symbol* method_signature,
      326                                   KlassHandle current_klass, bool check_access, TRAPS) {
      327 
      328   // 1. check if klass is not interface
      329   if (resolved_klass->is_interface()) {
      330     ResourceMark rm(THREAD);
      331     char buf[200];
      332     jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected", Klass::cast(resolved_klass())->external_name());
      333     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
      334   }
      335 
      336   // 2. lookup method in resolved klass and its super klasses
      337   lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK);
      338 
      339   if (resolved_method.is_null()) { // not found in the class hierarchy
      340     // 3. lookup method in all the interfaces implemented by the resolved klass
      341     lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
      342 
      343     if (resolved_method.is_null()) {
      344       // JSR 292:  see if this is an implicitly generated method MethodHandle.invoke(*...)
      345       lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, CHECK);
      346     }
      347 
      348     if (resolved_method.is_null()) {
      349       // 4. method lookup failed
      350       ResourceMark rm(THREAD);
      351       THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(),
      352                 methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
      353                                                         method_name,
      354                                                         method_signature));
      355     }
      356   }
      357 
      358   // 5. check if method is concrete
      359   if (resolved_method->is_abstract() && !resolved_klass->is_abstract()) {
      360     ResourceMark rm(THREAD);
      361     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
      362               methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
      363                                                       method_name,
      364                                                       method_signature));
      365   }
      366 
      367   // 6. access checks, access checking may be turned off when calling from within the VM.
      368   if (check_access) {
      369     assert(current_klass.not_null() , "current_klass should not be null");
      370 
      371     // check if method can be accessed by the referring class
      372     check_method_accessability(current_klass,
      373                                resolved_klass,
      374                                KlassHandle(THREAD, resolved_method->method_holder()),
      375                                resolved_method,
      376                                CHECK);
      377 
      378     // check loader constraints
      379     Handle loader (THREAD, instanceKlass::cast(current_klass())->class_loader());
      380     Handle class_loader (THREAD, instanceKlass::cast(resolved_method->method_holder())->class_loader());
      381     {
      382       ResourceMark rm(THREAD);
      383       char* failed_type_name =
      384         SystemDictionary::check_signature_loaders(method_signature, loader,
      385                                                   class_loader, true, CHECK);
      386       if (failed_type_name != NULL) {
      387         const char* msg = "loader constraint violation: when resolving method"
      388           " \"%s\" the class loader (instance of %s) of the current class, %s,"
      389           " and the class loader (instance of %s) for resolved class, %s, have"
      390           " different Class objects for the type %s used in the signature";
      391         char* sig = methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),method_name,method_signature);
      392         const char* loader1 = SystemDictionary::loader_name(loader());
      393         char* current = instanceKlass::cast(current_klass())->name()->as_C_string();
      394         const char* loader2 = SystemDictionary::loader_name(class_loader());
      395         char* resolved = instanceKlass::cast(resolved_klass())->name()->as_C_string();
      396         size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
      397           strlen(current) + strlen(loader2) + strlen(resolved) +
      398           strlen(failed_type_name);
      399         char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
      400         jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
      401                      resolved, failed_type_name);
      402         THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
      403       }
      404     }
      405   }
      406 }
      407 
      408 void LinkResolver::resolve_interface_method(methodHandle& resolved_method,
      409                                             KlassHandle resolved_klass,
      410                                             Symbol* method_name,
      411                                             Symbol* method_signature,
      412                                             KlassHandle current_klass,
      413                                             bool check_access, TRAPS) {
      414 
      415  // check if klass is interface
      416   if (!resolved_klass->is_interface()) {
      417     ResourceMark rm(THREAD);
      418     char buf[200];
      419     jio_snprintf(buf, sizeof(buf), "Found class %s, but interface was expected", Klass::cast(resolved_klass())->external_name());
      420     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
      421   }
      422 
      423   // lookup method in this interface or its super, java.lang.Object
      424   lookup_instance_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK);
      425 
      426   if (resolved_method.is_null()) {
      427     // lookup method in all the super-interfaces
      428     lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
      429     if (resolved_method.is_null()) {
      430       // no method found
      431       ResourceMark rm(THREAD);
      432       THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(),
      433                 methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
      434                                                         method_name,
      435                                                         method_signature));
      436     }
      437   }
      438 
      439   if (check_access) {
      440     HandleMark hm(THREAD);
      441     Handle loader (THREAD, instanceKlass::cast(current_klass())->class_loader());
      442     Handle class_loader (THREAD, instanceKlass::cast(resolved_method->method_holder())->class_loader());
      443     {
      444       ResourceMark rm(THREAD);
      445       char* failed_type_name =
      446         SystemDictionary::check_signature_loaders(method_signature, loader,
      447                                                   class_loader, true, CHECK);
      448       if (failed_type_name != NULL) {
      449         const char* msg = "loader constraint violation: when resolving "
      450           "interface method \"%s\" the class loader (instance of %s) of the "
      451           "current class, %s, and the class loader (instance of %s) for "
      452           "resolved class, %s, have different Class objects for the type %s "
      453           "used in the signature";
      454         char* sig = methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),method_name,method_signature);
      455         const char* loader1 = SystemDictionary::loader_name(loader());
      456         char* current = instanceKlass::cast(current_klass())->name()->as_C_string();
      457         const char* loader2 = SystemDictionary::loader_name(class_loader());
      458         char* resolved = instanceKlass::cast(resolved_klass())->name()->as_C_string();
      459         size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
      460           strlen(current) + strlen(loader2) + strlen(resolved) +
      461           strlen(failed_type_name);
      462         char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
      463         jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
      464                      resolved, failed_type_name);
      465         THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
      466       }
      467     }
      468   }
      469 }
      470 
      471 //------------------------------------------------------------------------------------------------------------------------
      472 // Field resolution
      473 
      474 void LinkResolver::check_field_accessability(KlassHandle ref_klass,
      475                                              KlassHandle resolved_klass,
      476                                              KlassHandle sel_klass,
      477                                              fieldDescriptor& fd,
      478                                              TRAPS) {
      479   if (!Reflection::verify_field_access(ref_klass->as_klassOop(),
      480                                        resolved_klass->as_klassOop(),
      481                                        sel_klass->as_klassOop(),
      482                                        fd.access_flags(),
      483                                        true)) {
      484     ResourceMark rm(THREAD);
      485     Exceptions::fthrow(
      486       THREAD_AND_LOCATION,
      487       vmSymbols::java_lang_IllegalAccessError(),
      488       "tried to access field %s.%s from class %s",
      489       sel_klass->external_name(),
      490       fd.name()->as_C_string(),
      491       ref_klass->external_name()
      492     );
      493     return;
      494   }
      495 }
      496 
      497 void LinkResolver::resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, TRAPS) {
      498   resolve_field(result, pool, index, byte, check_only, true, CHECK);
      499 }
      500 
      501 void LinkResolver::resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, bool update_pool, TRAPS) {
      502   assert(byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic ||
      503          byte == Bytecodes::_getfield  || byte == Bytecodes::_putfield, "bad bytecode");
      504 
      505   bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
      506   bool is_put    = (byte == Bytecodes::_putfield  || byte == Bytecodes::_putstatic);
      507 
      508   // resolve specified klass
      509   KlassHandle resolved_klass;
      510   if (update_pool) {
      511     resolve_klass(resolved_klass, pool, index, CHECK);
      512   } else {
      513     resolve_klass_no_update(resolved_klass, pool, index, CHECK);
      514   }
      515   // Load these early in case the resolve of the containing klass fails
      516   Symbol* field = pool->name_ref_at(index);
      517   Symbol* sig   = pool->signature_ref_at(index);
      518   // Check if there's a resolved klass containing the field
      519   if( resolved_klass.is_null() ) {
      520     ResourceMark rm(THREAD);
      521     THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
      522   }
      523 
      524   // Resolve instance field
      525   fieldDescriptor fd; // find_field initializes fd if found
      526   KlassHandle sel_klass(THREAD, instanceKlass::cast(resolved_klass())->find_field(field, sig, &fd));
      527   // check if field exists; i.e., if a klass containing the field def has been selected
      528   if (sel_klass.is_null()){
      529     ResourceMark rm(THREAD);
      530     THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
      531   }
      532 
      533   // check access
      534   KlassHandle ref_klass(THREAD, pool->pool_holder());
      535   check_field_accessability(ref_klass, resolved_klass, sel_klass, fd, CHECK);
      536 
      537   // check for errors
      538   if (is_static != fd.is_static()) {
      539     ResourceMark rm(THREAD);
      540     char msg[200];
      541     jio_snprintf(msg, sizeof(msg), "Expected %s field %s.%s", is_static ? "static" : "non-static", Klass::cast(resolved_klass())->external_name(), fd.name()->as_C_string());
      542     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), msg);
      543   }
      544 
      545   // Final fields can only be accessed from its own class.
      546   if (is_put && fd.access_flags().is_final() && sel_klass() != pool->pool_holder()) {
      547     THROW(vmSymbols::java_lang_IllegalAccessError());
      548   }
      549 
      550   // initialize resolved_klass if necessary
      551   // note 1: the klass which declared the field must be initialized (i.e, sel_klass)
      552   //         according to the newest JVM spec (5.5, p.170) - was bug (gri 7/28/99)
      553   //
      554   // note 2: we don't want to force initialization if we are just checking
      555   //         if the field access is legal; e.g., during compilation
      556   if (is_static && !check_only) {
      557     sel_klass->initialize(CHECK);
      558   }
      559 
      560   {
      561     HandleMark hm(THREAD);
      562     Handle ref_loader (THREAD, instanceKlass::cast(ref_klass())->class_loader());
      563     Handle sel_loader (THREAD, instanceKlass::cast(sel_klass())->class_loader());
      564     Symbol*  signature_ref  = pool->signature_ref_at(index);
      565     {
      566       ResourceMark rm(THREAD);
      567       char* failed_type_name =
      568         SystemDictionary::check_signature_loaders(signature_ref,
      569                                                   ref_loader, sel_loader,
      570                                                   false,
      571                                                   CHECK);
      572       if (failed_type_name != NULL) {
      573         const char* msg = "loader constraint violation: when resolving field"
      574           " \"%s\" the class loader (instance of %s) of the referring class, "
      575           "%s, and the class loader (instance of %s) for the field's resolved "
      576           "type, %s, have different Class objects for that type";
      577         char* field_name = field->as_C_string();
      578         const char* loader1 = SystemDictionary::loader_name(ref_loader());
      579         char* sel = instanceKlass::cast(sel_klass())->name()->as_C_string();
      580         const char* loader2 = SystemDictionary::loader_name(sel_loader());
      581         size_t buflen = strlen(msg) + strlen(field_name) + strlen(loader1) +
      582           strlen(sel) + strlen(loader2) + strlen(failed_type_name);
      583         char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
      584         jio_snprintf(buf, buflen, msg, field_name, loader1, sel, loader2,
      585                      failed_type_name);
      586         THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
      587       }
      588     }
      589   }
      590 
      591   // return information. note that the klass is set to the actual klass containing the
      592   // field, otherwise access of static fields in superclasses will not work.
      593   KlassHandle holder (THREAD, fd.field_holder());
      594   Symbol*  name   = fd.name();
      595   result.set(holder, name, fd.index(), fd.offset(), fd.field_type(), fd.access_flags());
      596 }
      597 
      598 
      599 //------------------------------------------------------------------------------------------------------------------------
      600 // Invoke resolution
      601 //
      602 // Naming conventions:
      603 //
      604 // resolved_method    the specified method (i.e., static receiver specified via constant pool index)
      605 // sel_method         the selected method  (selected via run-time lookup; e.g., based on dynamic receiver class)
      606 // resolved_klass     the specified klass  (i.e., specified via constant pool index)
      607 // recv_klass         the receiver klass
      608 
      609 
      610 void LinkResolver::resolve_static_call(CallInfo& result, KlassHandle& resolved_klass, Symbol* method_name,
      611                                        Symbol* method_signature, KlassHandle current_klass,
      612                                        bool check_access, bool initialize_class, TRAPS) {
      613   methodHandle resolved_method;
      614   linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
      615   resolved_klass = KlassHandle(THREAD, Klass::cast(resolved_method->method_holder()));
      616 
      617   // Initialize klass (this should only happen if everything is ok)
      618   if (initialize_class && resolved_klass->should_be_initialized()) {
      619     resolved_klass->initialize(CHECK);
      620     linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
      621   }
      622 
      623   // setup result
      624   result.set_static(resolved_klass, resolved_method, CHECK);
      625 }
      626 
      627 // throws linktime exceptions
      628 void LinkResolver::linktime_resolve_static_method(methodHandle& resolved_method, KlassHandle resolved_klass,
      629                                                   Symbol* method_name, Symbol* method_signature,
      630                                                   KlassHandle current_klass, bool check_access, TRAPS) {
      631 
      632   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
      633   assert(resolved_method->name() != vmSymbols::class_initializer_name(), "should have been checked in verifier");
      634 
      635   // check if static
      636   if (!resolved_method->is_static()) {
      637     ResourceMark rm(THREAD);
      638     char buf[200];
      639     jio_snprintf(buf, sizeof(buf), "Expected static method %s", methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
      640                                                       resolved_method->name(),
      641                                                       resolved_method->signature()));
      642     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
      643   }
      644 }
      645 
      646 
      647 void LinkResolver::resolve_special_call(CallInfo& result, KlassHandle resolved_klass, Symbol* method_name,
      648                                         Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
      649   methodHandle resolved_method;
      650   linktime_resolve_special_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
      651   runtime_resolve_special_method(result, resolved_method, resolved_klass, current_klass, check_access, CHECK);
      652 }
      653 
      654 // throws linktime exceptions
      655 void LinkResolver::linktime_resolve_special_method(methodHandle& resolved_method, KlassHandle resolved_klass,
      656                                                    Symbol* method_name, Symbol* method_signature,
      657                                                    KlassHandle current_klass, bool check_access, TRAPS) {
      658 
      659   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
      660 
      661   // check if method name is <init>, that it is found in same klass as static type
      662   if (resolved_method->name() == vmSymbols::object_initializer_name() &&
      663       resolved_method->method_holder() != resolved_klass()) {
      664     ResourceMark rm(THREAD);
      665     Exceptions::fthrow(
      666       THREAD_AND_LOCATION,
      667       vmSymbols::java_lang_NoSuchMethodError(),
      668       "%s: method %s%s not found",
      669       resolved_klass->external_name(),
      670       resolved_method->name()->as_C_string(),
      671       resolved_method->signature()->as_C_string()
      672     );
      673     return;
      674   }
      675 
      676   // check if not static
      677   if (resolved_method->is_static()) {
      678     ResourceMark rm(THREAD);
      679     char buf[200];
      680     jio_snprintf(buf, sizeof(buf),
      681                  "Expecting non-static method %s",
      682                  methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
      683                                                          resolved_method->name(),
      684                                                          resolved_method->signature()));
      685     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
      686   }
      687 }
      688 
      689 // throws runtime exceptions
      690 void LinkResolver::runtime_resolve_special_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
      691                                                   KlassHandle current_klass, bool check_access, TRAPS) {
      692 
      693   // resolved method is selected method unless we have an old-style lookup
      694   methodHandle sel_method(THREAD, resolved_method());
      695 
      696   // check if this is an old-style super call and do a new lookup if so
      697   { KlassHandle method_klass  = KlassHandle(THREAD,
      698                                             resolved_method->method_holder());
      699 
      700     if (check_access &&
      701         // a) check if ACC_SUPER flag is set for the current class
      702         current_klass->is_super() &&
      703         // b) check if the method class is a superclass of the current class (superclass relation is not reflexive!)
      704         current_klass->is_subtype_of(method_klass()) && current_klass() != method_klass() &&
      705         // c) check if the method is not <init>
      706         resolved_method->name() != vmSymbols::object_initializer_name()) {
      707       // Lookup super method
      708       KlassHandle super_klass(THREAD, current_klass->super());
      709       lookup_instance_method_in_klasses(sel_method, super_klass,
      710                            resolved_method->name(),
      711                            resolved_method->signature(), CHECK);
      712       // check if found
      713       if (sel_method.is_null()) {
      714         ResourceMark rm(THREAD);
      715         THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
      716                   methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
      717                                             resolved_method->name(),
      718                                             resolved_method->signature()));
      719       }
      720     }
      721   }
      722 
      723   // check if not static
      724   if (sel_method->is_static()) {
      725     ResourceMark rm(THREAD);
      726     char buf[200];
      727     jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
      728                                                                                                              resolved_method->name(),
      729                                                                                                              resolved_method->signature()));
      730     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
      731   }
      732 
      733   // check if abstract
      734   if (sel_method->is_abstract()) {
      735     ResourceMark rm(THREAD);
      736     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
      737               methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
      738                                                       sel_method->name(),
      739                                                       sel_method->signature()));
      740   }
      741 
      742   // setup result
      743   result.set_static(resolved_klass, sel_method, CHECK);
      744 }
      745 
      746 void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, KlassHandle receiver_klass, KlassHandle resolved_klass,
      747                                         Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
      748                                         bool check_access, bool check_null_and_abstract, TRAPS) {
      749   methodHandle resolved_method;
      750   linktime_resolve_virtual_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
      751   runtime_resolve_virtual_method(result, resolved_method, resolved_klass, recv, receiver_klass, check_null_and_abstract, CHECK);
      752 }
      753 
      754 // throws linktime exceptions
      755 void LinkResolver::linktime_resolve_virtual_method(methodHandle &resolved_method, KlassHandle resolved_klass,
      756                                                    Symbol* method_name, Symbol* method_signature,
      757                                                    KlassHandle current_klass, bool check_access, TRAPS) {
      758   // normal method resolution
      759   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
      760 
      761   assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
      762   assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
      763 
      764   // check if not static
      765   if (resolved_method->is_static()) {
      766     ResourceMark rm(THREAD);
      767     char buf[200];
      768     jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
      769                                                                                                              resolved_method->name(),
      770                                                                                                              resolved_method->signature()));
      771     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
      772   }
      773 }
      774 
      775 // throws runtime exceptions
      776 void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
      777                                                   methodHandle resolved_method,
      778                                                   KlassHandle resolved_klass,
      779                                                   Handle recv,
      780                                                   KlassHandle recv_klass,
      781                                                   bool check_null_and_abstract,
      782                                                   TRAPS) {
      783 
      784   // setup default return values
      785   int vtable_index = methodOopDesc::invalid_vtable_index;
      786   methodHandle selected_method;
      787 
      788   assert(recv.is_null() || recv->is_oop(), "receiver is not an oop");
      789 
      790   // runtime method resolution
      791   if (check_null_and_abstract && recv.is_null()) { // check if receiver exists
      792     THROW(vmSymbols::java_lang_NullPointerException());
      793   }
      794 
      795   // Virtual methods cannot be resolved before its klass has been linked, for otherwise the methodOop's
      796   // has not been rewritten, and the vtable initialized.
      797   assert(instanceKlass::cast(resolved_method->method_holder())->is_linked(), "must be linked");
      798 
      799   // Virtual methods cannot be resolved before its klass has been linked, for otherwise the methodOop's
      800   // has not been rewritten, and the vtable initialized. Make sure to do this after the nullcheck, since
      801   // a missing receiver might result in a bogus lookup.
      802   assert(instanceKlass::cast(resolved_method->method_holder())->is_linked(), "must be linked");
      803 
      804   // do lookup based on receiver klass using the vtable index
      805   if (resolved_method->method_holder()->klass_part()->is_interface()) { // miranda method
      806     vtable_index = vtable_index_of_miranda_method(resolved_klass,
      807                            resolved_method->name(),
      808                            resolved_method->signature(), CHECK);
      809     assert(vtable_index >= 0 , "we should have valid vtable index at this point");
      810 
      811     instanceKlass* inst = instanceKlass::cast(recv_klass());
      812     selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
      813   } else {
      814     // at this point we are sure that resolved_method is virtual and not
      815     // a miranda method; therefore, it must have a valid vtable index.
      816     vtable_index = resolved_method->vtable_index();
      817     // We could get a negative vtable_index for final methods,
      818     // because as an optimization they are they are never put in the vtable,
      819     // unless they override an existing method.
      820     // If we do get a negative, it means the resolved method is the the selected
      821     // method, and it can never be changed by an override.
      822     if (vtable_index == methodOopDesc::nonvirtual_vtable_index) {
      823       assert(resolved_method->can_be_statically_bound(), "cannot override this method");
      824       selected_method = resolved_method;
      825     } else {
      826       // recv_klass might be an arrayKlassOop but all vtables start at
      827       // the same place. The cast is to avoid virtual call and assertion.
      828       instanceKlass* inst = (instanceKlass*)recv_klass()->klass_part();
      829       selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
      830     }
      831   }
      832 
      833   // check if method exists
      834   if (selected_method.is_null()) {
      835     ResourceMark rm(THREAD);
      836     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
      837               methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
      838                                                       resolved_method->name(),
      839                                                       resolved_method->signature()));
      840   }
      841 
      842   // check if abstract
      843   if (check_null_and_abstract && selected_method->is_abstract()) {
      844     ResourceMark rm(THREAD);
      845     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
      846               methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
      847                                                       selected_method->name(),
      848                                                       selected_method->signature()));
      849   }
      850 
      851   // setup result
      852   result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK);
      853 }
      854 
      855 void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass,
      856                                           Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
      857                                           bool check_access, bool check_null_and_abstract, TRAPS) {
      858   methodHandle resolved_method;
      859   linktime_resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
      860   runtime_resolve_interface_method(result, resolved_method, resolved_klass, recv, recv_klass, check_null_and_abstract, CHECK);
      861 }
      862 
      863 // throws linktime exceptions
      864 void LinkResolver::linktime_resolve_interface_method(methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name,
      865                                                      Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
      866   // normal interface method resolution
      867   resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
      868 
      869   assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
      870   assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
      871 }
      872 
      873 // throws runtime exceptions
      874 void LinkResolver::runtime_resolve_interface_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
      875                                                     Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS) {
      876   // check if receiver exists
      877   if (check_null_and_abstract && recv.is_null()) {
      878     THROW(vmSymbols::java_lang_NullPointerException());
      879   }
      880 
      881   // check if receiver klass implements the resolved interface
      882   if (!recv_klass->is_subtype_of(resolved_klass())) {
      883     ResourceMark rm(THREAD);
      884     char buf[200];
      885     jio_snprintf(buf, sizeof(buf), "Class %s does not implement the requested interface %s",
      886                  (Klass::cast(recv_klass()))->external_name(),
      887                  (Klass::cast(resolved_klass()))->external_name());
      888     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
      889   }
      890   // do lookup based on receiver klass
      891   methodHandle sel_method;
      892   lookup_instance_method_in_klasses(sel_method, recv_klass,
      893             resolved_method->name(),
      894             resolved_method->signature(), CHECK);
      895   // check if method exists
      896   if (sel_method.is_null()) {
      897     ResourceMark rm(THREAD);
      898     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
      899               methodOopDesc::name_and_sig_as_C_string(Klass::cast(recv_klass()),
      900                                                       resolved_method->name(),
      901                                                       resolved_method->signature()));
      902   }
      903   // check if public
      904   if (!sel_method->is_public()) {
      905     ResourceMark rm(THREAD);
      906     THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
      907               methodOopDesc::name_and_sig_as_C_string(Klass::cast(recv_klass()),
      908                                                       sel_method->name(),
      909                                                       sel_method->signature()));
      910   }
      911   // check if abstract
      912   if (check_null_and_abstract && sel_method->is_abstract()) {
      913     ResourceMark rm(THREAD);
      914     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
      915               methodOopDesc::name_and_sig_as_C_string(Klass::cast(recv_klass()),
      916                                                       sel_method->name(),
      917                                                       sel_method->signature()));
      918   }
      919   // setup result
      920   result.set_interface(resolved_klass, recv_klass, resolved_method, sel_method, CHECK);
      921 }
      922 
      923 
      924 methodHandle LinkResolver::linktime_resolve_interface_method_or_null(
      925                                                  KlassHandle resolved_klass,
      926                                                  Symbol* method_name,
      927                                                  Symbol* method_signature,
      928                                                  KlassHandle current_klass,
      929                                                  bool check_access) {
      930   EXCEPTION_MARK;
      931   methodHandle method_result;
      932   linktime_resolve_interface_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
      933   if (HAS_PENDING_EXCEPTION) {
      934     CLEAR_PENDING_EXCEPTION;
      935     return methodHandle();
      936   } else {
      937     return method_result;
      938   }
      939 }
      940 
      941 methodHandle LinkResolver::linktime_resolve_virtual_method_or_null(
      942                                                  KlassHandle resolved_klass,
      943                                                  Symbol* method_name,
      944                                                  Symbol* method_signature,
      945                                                  KlassHandle current_klass,
      946                                                  bool check_access) {
      947   EXCEPTION_MARK;
      948   methodHandle method_result;
      949   linktime_resolve_virtual_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
      950   if (HAS_PENDING_EXCEPTION) {
      951     CLEAR_PENDING_EXCEPTION;
      952     return methodHandle();
      953   } else {
      954     return method_result;
      955   }
      956 }
      957 
      958 methodHandle LinkResolver::resolve_virtual_call_or_null(
      959                                                  KlassHandle receiver_klass,
      960                                                  KlassHandle resolved_klass,
      961                                                  Symbol* name,
      962                                                  Symbol* signature,
      963                                                  KlassHandle current_klass) {
      964   EXCEPTION_MARK;
      965   CallInfo info;
      966   resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
      967   if (HAS_PENDING_EXCEPTION) {
      968     CLEAR_PENDING_EXCEPTION;
      969     return methodHandle();
      970   }
      971   return info.selected_method();
      972 }
      973 
      974 methodHandle LinkResolver::resolve_interface_call_or_null(
      975                                                  KlassHandle receiver_klass,
      976                                                  KlassHandle resolved_klass,
      977                                                  Symbol* name,
      978                                                  Symbol* signature,
      979                                                  KlassHandle current_klass) {
      980   EXCEPTION_MARK;
      981   CallInfo info;
      982   resolve_interface_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
      983   if (HAS_PENDING_EXCEPTION) {
      984     CLEAR_PENDING_EXCEPTION;
      985     return methodHandle();
      986   }
      987   return info.selected_method();
      988 }
      989 
      990 int LinkResolver::resolve_virtual_vtable_index(
      991                                                KlassHandle receiver_klass,
      992                                                KlassHandle resolved_klass,
      993                                                Symbol* name,
      994                                                Symbol* signature,
      995                                                KlassHandle current_klass) {
      996   EXCEPTION_MARK;
      997   CallInfo info;
      998   resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
      999   if (HAS_PENDING_EXCEPTION) {
     1000     CLEAR_PENDING_EXCEPTION;
     1001     return methodOopDesc::invalid_vtable_index;
     1002   }
     1003   return info.vtable_index();
     1004 }
     1005 
     1006 methodHandle LinkResolver::resolve_static_call_or_null(
     1007                                                   KlassHandle resolved_klass,
     1008                                                   Symbol* name,
     1009                                                   Symbol* signature,
     1010                                                   KlassHandle current_klass) {
     1011   EXCEPTION_MARK;
     1012   CallInfo info;
     1013   resolve_static_call(info, resolved_klass, name, signature, current_klass, true, false, THREAD);
     1014   if (HAS_PENDING_EXCEPTION) {
     1015     CLEAR_PENDING_EXCEPTION;
     1016     return methodHandle();
     1017   }
     1018   return info.selected_method();
     1019 }
     1020 
     1021 methodHandle LinkResolver::resolve_special_call_or_null(KlassHandle resolved_klass, Symbol* name, Symbol* signature,
     1022                                                         KlassHandle current_klass) {
     1023   EXCEPTION_MARK;
     1024   CallInfo info;
     1025   resolve_special_call(info, resolved_klass, name, signature, current_klass, true, THREAD);
     1026   if (HAS_PENDING_EXCEPTION) {
     1027     CLEAR_PENDING_EXCEPTION;
     1028     return methodHandle();
     1029   }
     1030   return info.selected_method();
     1031 }
     1032 
     1033 
     1034 
     1035 //------------------------------------------------------------------------------------------------------------------------
     1036 // ConstantPool entries
     1037 
     1038 void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
     1039   switch (byte) {
     1040     case Bytecodes::_invokestatic   : resolve_invokestatic   (result,       pool, index, CHECK); break;
     1041     case Bytecodes::_invokespecial  : resolve_invokespecial  (result,       pool, index, CHECK); break;
     1042     case Bytecodes::_invokevirtual  : resolve_invokevirtual  (result, recv, pool, index, CHECK); break;
     1043     case Bytecodes::_invokedynamic  : resolve_invokedynamic  (result,       pool, index, CHECK); break;
     1044     case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break;
     1045   }
     1046   return;
     1047 }
     1048 
     1049 void LinkResolver::resolve_pool(KlassHandle& resolved_klass, Symbol*& method_name, Symbol*& method_signature,
     1050                                 KlassHandle& current_klass, constantPoolHandle pool, int index, TRAPS) {
     1051    // resolve klass
     1052   resolve_klass(resolved_klass, pool, index, CHECK);
     1053 
     1054   // Get name, signature, and static klass
     1055   method_name      = pool->name_ref_at(index);
     1056   method_signature = pool->signature_ref_at(index);
     1057   current_klass    = KlassHandle(THREAD, pool->pool_holder());
     1058 }
     1059 
     1060 
     1061 void LinkResolver::resolve_invokestatic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
     1062   KlassHandle  resolved_klass;
     1063   Symbol* method_name = NULL;
     1064   Symbol* method_signature = NULL;
     1065   KlassHandle  current_klass;
     1066   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
     1067   resolve_static_call(result, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
     1068 }
     1069 
     1070 
     1071 void LinkResolver::resolve_invokespecial(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
     1072   KlassHandle  resolved_klass;
     1073   Symbol* method_name = NULL;
     1074   Symbol* method_signature = NULL;
     1075   KlassHandle  current_klass;
     1076   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
     1077   resolve_special_call(result, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
     1078 }
     1079 
     1080 
     1081 void LinkResolver::resolve_invokevirtual(CallInfo& result, Handle recv,
     1082                                           constantPoolHandle pool, int index,
     1083                                           TRAPS) {
     1084 
     1085   KlassHandle  resolved_klass;
     1086   Symbol* method_name = NULL;
     1087   Symbol* method_signature = NULL;
     1088   KlassHandle  current_klass;
     1089   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
     1090   KlassHandle recvrKlass (THREAD, recv.is_null() ? (klassOop)NULL : recv->klass());
     1091   resolve_virtual_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
     1092 }
     1093 
     1094 
     1095 void LinkResolver::resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS) {
     1096   KlassHandle  resolved_klass;
     1097   Symbol* method_name = NULL;
     1098   Symbol* method_signature = NULL;
     1099   KlassHandle  current_klass;
     1100   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
     1101   KlassHandle recvrKlass (THREAD, recv.is_null() ? (klassOop)NULL : recv->klass());
     1102   resolve_interface_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
     1103 }
     1104 
     1105 
     1106 void LinkResolver::resolve_invokedynamic(CallInfo& result, constantPoolHandle pool, int raw_index, TRAPS) {
     1107   assert(EnableInvokeDynamic, "");
     1108 
     1109   // This guy is reached from InterpreterRuntime::resolve_invokedynamic.
     1110 
     1111   // At this point, we only need the signature, and can ignore the name.
     1112   Symbol*  method_signature = pool->signature_ref_at(raw_index);  // raw_index works directly
     1113   Symbol* method_name = vmSymbols::invokeExact_name();
     1114   KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
     1115 
     1116   // JSR 292:  this must be an implicitly generated method MethodHandle.invokeExact(*...)
     1117   // The extra MH receiver will be inserted into the stack on every call.
     1118   methodHandle resolved_method;
     1119   KlassHandle current_klass(THREAD, pool->pool_holder());
     1120   lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, THREAD);
     1121   if (HAS_PENDING_EXCEPTION) {
     1122     if (PENDING_EXCEPTION->is_a(SystemDictionary::BootstrapMethodError_klass())) {
     1123       // throw these guys, since they are already wrapped
     1124       return;
     1125     }
     1126     if (!PENDING_EXCEPTION->is_a(SystemDictionary::LinkageError_klass())) {
     1127       // intercept only LinkageErrors which might have failed to wrap
     1128       return;
     1129     }
     1130     // See the "Linking Exceptions" section for the invokedynamic instruction in the JVMS.
     1131     Handle ex(THREAD, PENDING_EXCEPTION);
     1132     CLEAR_PENDING_EXCEPTION;
     1133     oop bsme = Klass::cast(SystemDictionary::BootstrapMethodError_klass())->java_mirror();
     1134     MethodHandles::raise_exception(Bytecodes::_athrow, ex(), bsme, CHECK);
     1135     // java code should not return, but if it does throw out anyway
     1136     THROW(vmSymbols::java_lang_InternalError());
     1137   }
     1138   if (resolved_method.is_null()) {
     1139     THROW(vmSymbols::java_lang_InternalError());
     1140   }
     1141   result.set_dynamic(resolved_method, CHECK);
     1142 }
     1143 
     1144 //------------------------------------------------------------------------------------------------------------------------
     1145 #ifndef PRODUCT
     1146 
     1147 void FieldAccessInfo::print() {
     1148   ResourceMark rm;
     1149   tty->print_cr("Field %s@%d", name()->as_C_string(), field_offset());
     1150 }
     1151 
     1152 #endif