src/share/vm/interpreter/linkResolver.cpp

Sat, 01 May 2010 02:42:18 -0700

author
jrose
date
Sat, 01 May 2010 02:42:18 -0700
changeset 1862
cd5dbf694d45
parent 1577
4ce7240d622c
child 1863
2ffde6cfe049
permissions
-rw-r--r--

6939134: JSR 292 adjustments to method handle invocation
Summary: split MethodHandle.invoke into invokeExact and invokeGeneric; also clean up JVM-to-Java interfaces
Reviewed-by: twisti

     1 /*
     2  * Copyright 1997-2009 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
    21  * have any questions.
    22  *
    23  */
    25 #include "incls/_precompiled.incl"
    26 #include "incls/_linkResolver.cpp.incl"
    28 //------------------------------------------------------------------------------------------------------------------------
    29 // Implementation of FieldAccessInfo
    31 void FieldAccessInfo::set(KlassHandle klass, symbolHandle name, int field_index, int field_offset,
    32 BasicType field_type, AccessFlags access_flags) {
    33   _klass        = klass;
    34   _name         = name;
    35   _field_index  = field_index;
    36   _field_offset = field_offset;
    37   _field_type   = field_type;
    38   _access_flags = access_flags;
    39 }
    42 //------------------------------------------------------------------------------------------------------------------------
    43 // Implementation of CallInfo
    46 void CallInfo::set_static(KlassHandle resolved_klass, methodHandle resolved_method, TRAPS) {
    47   int vtable_index = methodOopDesc::nonvirtual_vtable_index;
    48   set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, vtable_index, CHECK);
    49 }
    52 void CallInfo::set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, TRAPS) {
    53   // This is only called for interface methods. If the resolved_method
    54   // comes from java/lang/Object, it can be the subject of a virtual call, so
    55   // we should pick the vtable index from the resolved method.
    56   // Other than that case, there is no valid vtable index to specify.
    57   int vtable_index = methodOopDesc::invalid_vtable_index;
    58   if (resolved_method->method_holder() == SystemDictionary::Object_klass()) {
    59     assert(resolved_method->vtable_index() == selected_method->vtable_index(), "sanity check");
    60     vtable_index = resolved_method->vtable_index();
    61   }
    62   set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
    63 }
    65 void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
    66   assert(vtable_index >= 0 || vtable_index == methodOopDesc::nonvirtual_vtable_index, "valid index");
    67   set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
    68 }
    70 void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
    71   assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
    72   _resolved_klass  = resolved_klass;
    73   _selected_klass  = selected_klass;
    74   _resolved_method = resolved_method;
    75   _selected_method = selected_method;
    76   _vtable_index    = vtable_index;
    77   if (CompilationPolicy::mustBeCompiled(selected_method)) {
    78     // This path is unusual, mostly used by the '-Xcomp' stress test mode.
    80     // Note: with several active threads, the mustBeCompiled may be true
    81     //       while canBeCompiled is false; remove assert
    82     // assert(CompilationPolicy::canBeCompiled(selected_method), "cannot compile");
    83     if (THREAD->is_Compiler_thread()) {
    84       // don't force compilation, resolve was on behalf of compiler
    85       return;
    86     }
    87     if (instanceKlass::cast(selected_method->method_holder())->is_not_initialized()) {
    88       // 'is_not_initialized' means not only '!is_initialized', but also that
    89       // initialization has not been started yet ('!being_initialized')
    90       // Do not force compilation of methods in uninitialized classes.
    91       // Note that doing this would throw an assert later,
    92       // in CompileBroker::compile_method.
    93       // We sometimes use the link resolver to do reflective lookups
    94       // even before classes are initialized.
    95       return;
    96     }
    97     CompileBroker::compile_method(selected_method, InvocationEntryBci,
    98                                   methodHandle(), 0, "mustBeCompiled", CHECK);
    99   }
   100 }
   103 //------------------------------------------------------------------------------------------------------------------------
   104 // Klass resolution
   106 void LinkResolver::check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS) {
   107   if (!Reflection::verify_class_access(ref_klass->as_klassOop(),
   108                                        sel_klass->as_klassOop(),
   109                                        true)) {
   110     ResourceMark rm(THREAD);
   111     Exceptions::fthrow(
   112       THREAD_AND_LOCATION,
   113       vmSymbolHandles::java_lang_IllegalAccessError(),
   114       "tried to access class %s from class %s",
   115       sel_klass->external_name(),
   116       ref_klass->external_name()
   117     );
   118     return;
   119   }
   120 }
   122 void LinkResolver::resolve_klass(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
   123   klassOop result_oop = pool->klass_ref_at(index, CHECK);
   124   result = KlassHandle(THREAD, result_oop);
   125 }
   127 void LinkResolver::resolve_klass_no_update(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
   128   klassOop result_oop =
   129          constantPoolOopDesc::klass_ref_at_if_loaded_check(pool, index, CHECK);
   130   result = KlassHandle(THREAD, result_oop);
   131 }
   134 //------------------------------------------------------------------------------------------------------------------------
   135 // Method resolution
   136 //
   137 // According to JVM spec. $5.4.3c & $5.4.3d
   139 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
   140   methodOop result_oop = klass->uncached_lookup_method(name(), signature());
   141   if (EnableMethodHandles && result_oop != NULL) {
   142     switch (result_oop->intrinsic_id()) {
   143     case vmIntrinsics::_invokeExact:
   144     case vmIntrinsics::_invokeGeneric:
   145     case vmIntrinsics::_invokeDynamic:
   146       // Do not link directly to these.  The VM must produce a synthetic one using lookup_implicit_method.
   147       return;
   148     }
   149   }
   150   result = methodHandle(THREAD, result_oop);
   151 }
   153 // returns first instance method
   154 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
   155   methodOop result_oop = klass->uncached_lookup_method(name(), signature());
   156   result = methodHandle(THREAD, result_oop);
   157   while (!result.is_null() && result->is_static()) {
   158     klass = KlassHandle(THREAD, Klass::cast(result->method_holder())->super());
   159     result = methodHandle(THREAD, klass->uncached_lookup_method(name(), signature()));
   160   }
   161 }
   164 int LinkResolver::vtable_index_of_miranda_method(KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
   165   ResourceMark rm(THREAD);
   166   klassVtable *vt = instanceKlass::cast(klass())->vtable();
   167   return vt->index_of_miranda(name(), signature());
   168 }
   170 void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
   171   instanceKlass *ik = instanceKlass::cast(klass());
   172   result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name(), signature()));
   173 }
   175 void LinkResolver::lookup_implicit_method(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
   176   if (EnableMethodHandles && MethodHandles::enabled() &&
   177       klass() == SystemDictionary::MethodHandle_klass() &&
   178       methodOopDesc::is_method_handle_invoke_name(name())) {
   179     methodOop result_oop = SystemDictionary::find_method_handle_invoke(name,
   180                                                                        signature,
   181                                                                        Handle(),
   182                                                                        Handle(),
   183                                                                        CHECK);
   184     if (result_oop != NULL) {
   185       assert(result_oop->is_method_handle_invoke() && result_oop->signature() == signature(), "consistent");
   186       result = methodHandle(THREAD, result_oop);
   187     }
   188   }
   189 }
   191 void LinkResolver::check_method_accessability(KlassHandle ref_klass,
   192                                               KlassHandle resolved_klass,
   193                                               KlassHandle sel_klass,
   194                                               methodHandle sel_method,
   195                                               TRAPS) {
   197   AccessFlags flags = sel_method->access_flags();
   199   // Special case:  arrays always override "clone". JVMS 2.15.
   200   // If the resolved klass is an array class, and the declaring class
   201   // is java.lang.Object and the method is "clone", set the flags
   202   // to public.
   203   //
   204   // We'll check for the method name first, as that's most likely
   205   // to be false (so we'll short-circuit out of these tests).
   206   if (sel_method->name() == vmSymbols::clone_name() &&
   207       sel_klass() == SystemDictionary::Object_klass() &&
   208       resolved_klass->oop_is_array()) {
   209     // We need to change "protected" to "public".
   210     assert(flags.is_protected(), "clone not protected?");
   211     jint new_flags = flags.as_int();
   212     new_flags = new_flags & (~JVM_ACC_PROTECTED);
   213     new_flags = new_flags | JVM_ACC_PUBLIC;
   214     flags.set_flags(new_flags);
   215   }
   217   if (!Reflection::verify_field_access(ref_klass->as_klassOop(),
   218                                        resolved_klass->as_klassOop(),
   219                                        sel_klass->as_klassOop(),
   220                                        flags,
   221                                        true)) {
   222     ResourceMark rm(THREAD);
   223     Exceptions::fthrow(
   224       THREAD_AND_LOCATION,
   225       vmSymbolHandles::java_lang_IllegalAccessError(),
   226       "tried to access method %s.%s%s from class %s",
   227       sel_klass->external_name(),
   228       sel_method->name()->as_C_string(),
   229       sel_method->signature()->as_C_string(),
   230       ref_klass->external_name()
   231     );
   232     return;
   233   }
   234 }
   236 void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle& resolved_klass,
   237                                   constantPoolHandle pool, int index, TRAPS) {
   239   // resolve klass
   240   resolve_klass(resolved_klass, pool, index, CHECK);
   242   symbolHandle method_name      (THREAD, pool->name_ref_at(index));
   243   symbolHandle method_signature (THREAD, pool->signature_ref_at(index));
   244   KlassHandle  current_klass(THREAD, pool->pool_holder());
   246   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
   247 }
   249 void LinkResolver::resolve_dynamic_method(methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS) {
   250   // The class is java.dyn.MethodHandle
   251   resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
   253   symbolHandle method_name = vmSymbolHandles::invokeExact_name();
   255   symbolHandle method_signature(THREAD, pool->signature_ref_at(index));
   256   KlassHandle  current_klass   (THREAD, pool->pool_holder());
   258   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
   259 }
   261 void LinkResolver::resolve_interface_method(methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS) {
   263   // resolve klass
   264   resolve_klass(resolved_klass, pool, index, CHECK);
   265   symbolHandle method_name      (THREAD, pool->name_ref_at(index));
   266   symbolHandle method_signature (THREAD, pool->signature_ref_at(index));
   267   KlassHandle  current_klass(THREAD, pool->pool_holder());
   269   resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
   270 }
   273 void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
   274                                   symbolHandle method_name, symbolHandle method_signature,
   275                                   KlassHandle current_klass, bool check_access, TRAPS) {
   277   // 1. check if klass is not interface
   278   if (resolved_klass->is_interface()) {
   279     char buf[200];
   280     jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected", Klass::cast(resolved_klass())->external_name());
   281     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   282   }
   284   // 2. lookup method in resolved klass and its super klasses
   285   lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK);
   287   if (resolved_method.is_null()) { // not found in the class hierarchy
   288     // 3. lookup method in all the interfaces implemented by the resolved klass
   289     lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
   291     if (resolved_method.is_null()) {
   292       // JSR 292:  see if this is an implicitly generated method MethodHandle.invoke(*...)
   293       lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, CHECK);
   294     }
   296     if (resolved_method.is_null()) {
   297       // 4. method lookup failed
   298       ResourceMark rm(THREAD);
   299       THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(),
   300                 methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
   301                                                         method_name(),
   302                                                         method_signature()));
   303     }
   304   }
   306   // 5. check if method is concrete
   307   if (resolved_method->is_abstract() && !resolved_klass->is_abstract()) {
   308     ResourceMark rm(THREAD);
   309     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
   310               methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
   311                                                       method_name(),
   312                                                       method_signature()));
   313   }
   315   // 6. access checks, access checking may be turned off when calling from within the VM.
   316   if (check_access) {
   317     assert(current_klass.not_null() , "current_klass should not be null");
   319     // check if method can be accessed by the referring class
   320     check_method_accessability(current_klass,
   321                                resolved_klass,
   322                                KlassHandle(THREAD, resolved_method->method_holder()),
   323                                resolved_method,
   324                                CHECK);
   326     // check loader constraints
   327     Handle loader (THREAD, instanceKlass::cast(current_klass())->class_loader());
   328     Handle class_loader (THREAD, instanceKlass::cast(resolved_method->method_holder())->class_loader());
   329     {
   330       ResourceMark rm(THREAD);
   331       char* failed_type_name =
   332         SystemDictionary::check_signature_loaders(method_signature, loader,
   333                                                   class_loader, true, CHECK);
   334       if (failed_type_name != NULL) {
   335         const char* msg = "loader constraint violation: when resolving method"
   336           " \"%s\" the class loader (instance of %s) of the current class, %s,"
   337           " and the class loader (instance of %s) for resolved class, %s, have"
   338           " different Class objects for the type %s used in the signature";
   339         char* sig = methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),method_name(),method_signature());
   340         const char* loader1 = SystemDictionary::loader_name(loader());
   341         char* current = instanceKlass::cast(current_klass())->name()->as_C_string();
   342         const char* loader2 = SystemDictionary::loader_name(class_loader());
   343         char* resolved = instanceKlass::cast(resolved_klass())->name()->as_C_string();
   344         size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
   345           strlen(current) + strlen(loader2) + strlen(resolved) +
   346           strlen(failed_type_name);
   347         char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
   348         jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
   349                      resolved, failed_type_name);
   350         THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
   351       }
   352     }
   353   }
   354 }
   356 void LinkResolver::resolve_interface_method(methodHandle& resolved_method,
   357                                             KlassHandle resolved_klass,
   358                                             symbolHandle method_name,
   359                                             symbolHandle method_signature,
   360                                             KlassHandle current_klass,
   361                                             bool check_access, TRAPS) {
   363  // check if klass is interface
   364   if (!resolved_klass->is_interface()) {
   365     char buf[200];
   366     jio_snprintf(buf, sizeof(buf), "Found class %s, but interface was expected", Klass::cast(resolved_klass())->external_name());
   367     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   368   }
   370   // lookup method in this interface or its super, java.lang.Object
   371   lookup_instance_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK);
   373   if (resolved_method.is_null()) {
   374     // lookup method in all the super-interfaces
   375     lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
   376     if (resolved_method.is_null()) {
   377       // no method found
   378       ResourceMark rm(THREAD);
   379       THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(),
   380                 methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
   381                                                         method_name(),
   382                                                         method_signature()));
   383     }
   384   }
   386   if (check_access) {
   387     HandleMark hm(THREAD);
   388     Handle loader (THREAD, instanceKlass::cast(current_klass())->class_loader());
   389     Handle class_loader (THREAD, instanceKlass::cast(resolved_method->method_holder())->class_loader());
   390     {
   391       ResourceMark rm(THREAD);
   392       char* failed_type_name =
   393         SystemDictionary::check_signature_loaders(method_signature, loader,
   394                                                   class_loader, true, CHECK);
   395       if (failed_type_name != NULL) {
   396         const char* msg = "loader constraint violation: when resolving "
   397           "interface method \"%s\" the class loader (instance of %s) of the "
   398           "current class, %s, and the class loader (instance of %s) for "
   399           "resolved class, %s, have different Class objects for the type %s "
   400           "used in the signature";
   401         char* sig = methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),method_name(),method_signature());
   402         const char* loader1 = SystemDictionary::loader_name(loader());
   403         char* current = instanceKlass::cast(current_klass())->name()->as_C_string();
   404         const char* loader2 = SystemDictionary::loader_name(class_loader());
   405         char* resolved = instanceKlass::cast(resolved_klass())->name()->as_C_string();
   406         size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
   407           strlen(current) + strlen(loader2) + strlen(resolved) +
   408           strlen(failed_type_name);
   409         char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
   410         jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
   411                      resolved, failed_type_name);
   412         THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
   413       }
   414     }
   415   }
   416 }
   418 //------------------------------------------------------------------------------------------------------------------------
   419 // Field resolution
   421 void LinkResolver::check_field_accessability(KlassHandle ref_klass,
   422                                              KlassHandle resolved_klass,
   423                                              KlassHandle sel_klass,
   424                                              fieldDescriptor& fd,
   425                                              TRAPS) {
   426   if (!Reflection::verify_field_access(ref_klass->as_klassOop(),
   427                                        resolved_klass->as_klassOop(),
   428                                        sel_klass->as_klassOop(),
   429                                        fd.access_flags(),
   430                                        true)) {
   431     ResourceMark rm(THREAD);
   432     Exceptions::fthrow(
   433       THREAD_AND_LOCATION,
   434       vmSymbolHandles::java_lang_IllegalAccessError(),
   435       "tried to access field %s.%s from class %s",
   436       sel_klass->external_name(),
   437       fd.name()->as_C_string(),
   438       ref_klass->external_name()
   439     );
   440     return;
   441   }
   442 }
   444 void LinkResolver::resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, TRAPS) {
   445   resolve_field(result, pool, index, byte, check_only, true, CHECK);
   446 }
   448 void LinkResolver::resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, bool update_pool, TRAPS) {
   449   assert(byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic ||
   450          byte == Bytecodes::_getfield  || byte == Bytecodes::_putfield, "bad bytecode");
   452   bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
   453   bool is_put    = (byte == Bytecodes::_putfield  || byte == Bytecodes::_putstatic);
   455   // resolve specified klass
   456   KlassHandle resolved_klass;
   457   if (update_pool) {
   458     resolve_klass(resolved_klass, pool, index, CHECK);
   459   } else {
   460     resolve_klass_no_update(resolved_klass, pool, index, CHECK);
   461   }
   462   // Load these early in case the resolve of the containing klass fails
   463   symbolOop field = pool->name_ref_at(index);
   464   symbolHandle field_h (THREAD, field); // preserve in case we need the name
   465   symbolOop sig   = pool->signature_ref_at(index);
   466   // Check if there's a resolved klass containing the field
   467   if( resolved_klass.is_null() ) {
   468     ResourceMark rm(THREAD);
   469     THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
   470   }
   472   // Resolve instance field
   473   fieldDescriptor fd; // find_field initializes fd if found
   474   KlassHandle sel_klass(THREAD, instanceKlass::cast(resolved_klass())->find_field(field, sig, &fd));
   475   // check if field exists; i.e., if a klass containing the field def has been selected
   476   if (sel_klass.is_null()){
   477     ResourceMark rm(THREAD);
   478     THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
   479   }
   481   // check access
   482   KlassHandle ref_klass(THREAD, pool->pool_holder());
   483   check_field_accessability(ref_klass, resolved_klass, sel_klass, fd, CHECK);
   485   // check for errors
   486   if (is_static != fd.is_static()) {
   487     char msg[200];
   488     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());
   489     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), msg);
   490   }
   492   // Final fields can only be accessed from its own class.
   493   if (is_put && fd.access_flags().is_final() && sel_klass() != pool->pool_holder()) {
   494     THROW(vmSymbols::java_lang_IllegalAccessError());
   495   }
   497   // initialize resolved_klass if necessary
   498   // note 1: the klass which declared the field must be initialized (i.e, sel_klass)
   499   //         according to the newest JVM spec (5.5, p.170) - was bug (gri 7/28/99)
   500   //
   501   // note 2: we don't want to force initialization if we are just checking
   502   //         if the field access is legal; e.g., during compilation
   503   if (is_static && !check_only) {
   504     sel_klass->initialize(CHECK);
   505   }
   507   {
   508     HandleMark hm(THREAD);
   509     Handle ref_loader (THREAD, instanceKlass::cast(ref_klass())->class_loader());
   510     Handle sel_loader (THREAD, instanceKlass::cast(sel_klass())->class_loader());
   511     symbolHandle signature_ref (THREAD, pool->signature_ref_at(index));
   512     {
   513       ResourceMark rm(THREAD);
   514       char* failed_type_name =
   515         SystemDictionary::check_signature_loaders(signature_ref,
   516                                                   ref_loader, sel_loader,
   517                                                   false,
   518                                                   CHECK);
   519       if (failed_type_name != NULL) {
   520         const char* msg = "loader constraint violation: when resolving field"
   521           " \"%s\" the class loader (instance of %s) of the referring class, "
   522           "%s, and the class loader (instance of %s) for the field's resolved "
   523           "type, %s, have different Class objects for that type";
   524         char* field_name = field_h()->as_C_string();
   525         const char* loader1 = SystemDictionary::loader_name(ref_loader());
   526         char* sel = instanceKlass::cast(sel_klass())->name()->as_C_string();
   527         const char* loader2 = SystemDictionary::loader_name(sel_loader());
   528         size_t buflen = strlen(msg) + strlen(field_name) + strlen(loader1) +
   529           strlen(sel) + strlen(loader2) + strlen(failed_type_name);
   530         char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
   531         jio_snprintf(buf, buflen, msg, field_name, loader1, sel, loader2,
   532                      failed_type_name);
   533         THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
   534       }
   535     }
   536   }
   538   // return information. note that the klass is set to the actual klass containing the
   539   // field, otherwise access of static fields in superclasses will not work.
   540   KlassHandle holder (THREAD, fd.field_holder());
   541   symbolHandle name  (THREAD, fd.name());
   542   result.set(holder, name, fd.index(), fd.offset(), fd.field_type(), fd.access_flags());
   543 }
   546 //------------------------------------------------------------------------------------------------------------------------
   547 // Invoke resolution
   548 //
   549 // Naming conventions:
   550 //
   551 // resolved_method    the specified method (i.e., static receiver specified via constant pool index)
   552 // sel_method         the selected method  (selected via run-time lookup; e.g., based on dynamic receiver class)
   553 // resolved_klass     the specified klass  (i.e., specified via constant pool index)
   554 // recv_klass         the receiver klass
   557 void LinkResolver::resolve_static_call(CallInfo& result, KlassHandle& resolved_klass, symbolHandle method_name,
   558                                        symbolHandle method_signature, KlassHandle current_klass,
   559                                        bool check_access, bool initialize_class, TRAPS) {
   560   methodHandle resolved_method;
   561   linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
   562   resolved_klass = KlassHandle(THREAD, Klass::cast(resolved_method->method_holder()));
   564   // Initialize klass (this should only happen if everything is ok)
   565   if (initialize_class && resolved_klass->should_be_initialized()) {
   566     resolved_klass->initialize(CHECK);
   567     linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
   568   }
   570   // setup result
   571   result.set_static(resolved_klass, resolved_method, CHECK);
   572 }
   574 // throws linktime exceptions
   575 void LinkResolver::linktime_resolve_static_method(methodHandle& resolved_method, KlassHandle resolved_klass,
   576                                                   symbolHandle method_name, symbolHandle method_signature,
   577                                                   KlassHandle current_klass, bool check_access, TRAPS) {
   579   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
   580   assert(resolved_method->name() != vmSymbols::class_initializer_name(), "should have been checked in verifier");
   582   // check if static
   583   if (!resolved_method->is_static()) {
   584     char buf[200];
   585     jio_snprintf(buf, sizeof(buf), "Expected static method %s", methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
   586                                                       resolved_method->name(),
   587                                                       resolved_method->signature()));
   588     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   589   }
   590 }
   593 void LinkResolver::resolve_special_call(CallInfo& result, KlassHandle resolved_klass, symbolHandle method_name,
   594                                         symbolHandle method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
   595   methodHandle resolved_method;
   596   linktime_resolve_special_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
   597   runtime_resolve_special_method(result, resolved_method, resolved_klass, current_klass, check_access, CHECK);
   598 }
   600 // throws linktime exceptions
   601 void LinkResolver::linktime_resolve_special_method(methodHandle& resolved_method, KlassHandle resolved_klass,
   602                                                    symbolHandle method_name, symbolHandle method_signature,
   603                                                    KlassHandle current_klass, bool check_access, TRAPS) {
   605   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
   607   // check if method name is <init>, that it is found in same klass as static type
   608   if (resolved_method->name() == vmSymbols::object_initializer_name() &&
   609       resolved_method->method_holder() != resolved_klass()) {
   610     ResourceMark rm(THREAD);
   611     Exceptions::fthrow(
   612       THREAD_AND_LOCATION,
   613       vmSymbolHandles::java_lang_NoSuchMethodError(),
   614       "%s: method %s%s not found",
   615       resolved_klass->external_name(),
   616       resolved_method->name()->as_C_string(),
   617       resolved_method->signature()->as_C_string()
   618     );
   619     return;
   620   }
   622   // check if not static
   623   if (resolved_method->is_static()) {
   624     char buf[200];
   625     jio_snprintf(buf, sizeof(buf),
   626                  "Expecting non-static method %s",
   627                  methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
   628                                                          resolved_method->name(),
   629                                                          resolved_method->signature()));
   630     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   631   }
   632 }
   634 // throws runtime exceptions
   635 void LinkResolver::runtime_resolve_special_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
   636                                                   KlassHandle current_klass, bool check_access, TRAPS) {
   638   // resolved method is selected method unless we have an old-style lookup
   639   methodHandle sel_method(THREAD, resolved_method());
   641   // check if this is an old-style super call and do a new lookup if so
   642   { KlassHandle method_klass  = KlassHandle(THREAD,
   643                                             resolved_method->method_holder());
   645     if (check_access &&
   646         // a) check if ACC_SUPER flag is set for the current class
   647         current_klass->is_super() &&
   648         // b) check if the method class is a superclass of the current class (superclass relation is not reflexive!)
   649         current_klass->is_subtype_of(method_klass()) && current_klass() != method_klass() &&
   650         // c) check if the method is not <init>
   651         resolved_method->name() != vmSymbols::object_initializer_name()) {
   652       // Lookup super method
   653       KlassHandle super_klass(THREAD, current_klass->super());
   654       lookup_instance_method_in_klasses(sel_method, super_klass,
   655                            symbolHandle(THREAD, resolved_method->name()),
   656                            symbolHandle(THREAD, resolved_method->signature()), CHECK);
   657       // check if found
   658       if (sel_method.is_null()) {
   659         ResourceMark rm(THREAD);
   660         THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
   661                   methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
   662                                             resolved_method->name(),
   663                                             resolved_method->signature()));
   664       }
   665     }
   666   }
   668   // check if not static
   669   if (sel_method->is_static()) {
   670     char buf[200];
   671     jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
   672                                                                                                              resolved_method->name(),
   673                                                                                                              resolved_method->signature()));
   674     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   675   }
   677   // check if abstract
   678   if (sel_method->is_abstract()) {
   679     ResourceMark rm(THREAD);
   680     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
   681               methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
   682                                                       sel_method->name(),
   683                                                       sel_method->signature()));
   684   }
   686   // setup result
   687   result.set_static(resolved_klass, sel_method, CHECK);
   688 }
   690 void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, KlassHandle receiver_klass, KlassHandle resolved_klass,
   691                                         symbolHandle method_name, symbolHandle method_signature, KlassHandle current_klass,
   692                                         bool check_access, bool check_null_and_abstract, TRAPS) {
   693   methodHandle resolved_method;
   694   linktime_resolve_virtual_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
   695   runtime_resolve_virtual_method(result, resolved_method, resolved_klass, recv, receiver_klass, check_null_and_abstract, CHECK);
   696 }
   698 // throws linktime exceptions
   699 void LinkResolver::linktime_resolve_virtual_method(methodHandle &resolved_method, KlassHandle resolved_klass,
   700                                                    symbolHandle method_name, symbolHandle method_signature,
   701                                                    KlassHandle current_klass, bool check_access, TRAPS) {
   702   // normal method resolution
   703   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
   705   assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
   706   assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
   708   // check if not static
   709   if (resolved_method->is_static()) {
   710     char buf[200];
   711     jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
   712                                                                                                              resolved_method->name(),
   713                                                                                                              resolved_method->signature()));
   714     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   715   }
   716 }
   718 // throws runtime exceptions
   719 void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
   720                                                   methodHandle resolved_method,
   721                                                   KlassHandle resolved_klass,
   722                                                   Handle recv,
   723                                                   KlassHandle recv_klass,
   724                                                   bool check_null_and_abstract,
   725                                                   TRAPS) {
   727   // setup default return values
   728   int vtable_index = methodOopDesc::invalid_vtable_index;
   729   methodHandle selected_method;
   731   assert(recv.is_null() || recv->is_oop(), "receiver is not an oop");
   733   // runtime method resolution
   734   if (check_null_and_abstract && recv.is_null()) { // check if receiver exists
   735     THROW(vmSymbols::java_lang_NullPointerException());
   736   }
   738   // Virtual methods cannot be resolved before its klass has been linked, for otherwise the methodOop's
   739   // has not been rewritten, and the vtable initialized.
   740   assert(instanceKlass::cast(resolved_method->method_holder())->is_linked(), "must be linked");
   742   // Virtual methods cannot be resolved before its klass has been linked, for otherwise the methodOop's
   743   // has not been rewritten, and the vtable initialized. Make sure to do this after the nullcheck, since
   744   // a missing receiver might result in a bogus lookup.
   745   assert(instanceKlass::cast(resolved_method->method_holder())->is_linked(), "must be linked");
   747   // do lookup based on receiver klass using the vtable index
   748   if (resolved_method->method_holder()->klass_part()->is_interface()) { // miranda method
   749     vtable_index = vtable_index_of_miranda_method(resolved_klass,
   750                            symbolHandle(THREAD, resolved_method->name()),
   751                            symbolHandle(THREAD, resolved_method->signature()), CHECK);
   752     assert(vtable_index >= 0 , "we should have valid vtable index at this point");
   754     instanceKlass* inst = instanceKlass::cast(recv_klass());
   755     selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
   756   } else {
   757     // at this point we are sure that resolved_method is virtual and not
   758     // a miranda method; therefore, it must have a valid vtable index.
   759     vtable_index = resolved_method->vtable_index();
   760     // We could get a negative vtable_index for final methods,
   761     // because as an optimization they are they are never put in the vtable,
   762     // unless they override an existing method.
   763     // If we do get a negative, it means the resolved method is the the selected
   764     // method, and it can never be changed by an override.
   765     if (vtable_index == methodOopDesc::nonvirtual_vtable_index) {
   766       assert(resolved_method->can_be_statically_bound(), "cannot override this method");
   767       selected_method = resolved_method;
   768     } else {
   769       // recv_klass might be an arrayKlassOop but all vtables start at
   770       // the same place. The cast is to avoid virtual call and assertion.
   771       instanceKlass* inst = (instanceKlass*)recv_klass()->klass_part();
   772       selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
   773     }
   774   }
   776   // check if method exists
   777   if (selected_method.is_null()) {
   778     ResourceMark rm(THREAD);
   779     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
   780               methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
   781                                                       resolved_method->name(),
   782                                                       resolved_method->signature()));
   783   }
   785   // check if abstract
   786   if (check_null_and_abstract && selected_method->is_abstract()) {
   787     ResourceMark rm(THREAD);
   788     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
   789               methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
   790                                                       selected_method->name(),
   791                                                       selected_method->signature()));
   792   }
   794   // setup result
   795   result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK);
   796 }
   798 void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass,
   799                                           symbolHandle method_name, symbolHandle method_signature, KlassHandle current_klass,
   800                                           bool check_access, bool check_null_and_abstract, TRAPS) {
   801   methodHandle resolved_method;
   802   linktime_resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
   803   runtime_resolve_interface_method(result, resolved_method, resolved_klass, recv, recv_klass, check_null_and_abstract, CHECK);
   804 }
   806 // throws linktime exceptions
   807 void LinkResolver::linktime_resolve_interface_method(methodHandle& resolved_method, KlassHandle resolved_klass, symbolHandle method_name,
   808                                                      symbolHandle method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
   809   // normal interface method resolution
   810   resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
   812   assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
   813   assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
   814 }
   816 // throws runtime exceptions
   817 void LinkResolver::runtime_resolve_interface_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
   818                                                     Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS) {
   819   // check if receiver exists
   820   if (check_null_and_abstract && recv.is_null()) {
   821     THROW(vmSymbols::java_lang_NullPointerException());
   822   }
   824   // check if receiver klass implements the resolved interface
   825   if (!recv_klass->is_subtype_of(resolved_klass())) {
   826     char buf[200];
   827     jio_snprintf(buf, sizeof(buf), "Class %s does not implement the requested interface %s",
   828                  (Klass::cast(recv_klass()))->external_name(),
   829                  (Klass::cast(resolved_klass()))->external_name());
   830     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   831   }
   832   // do lookup based on receiver klass
   833   methodHandle sel_method;
   834   lookup_instance_method_in_klasses(sel_method, recv_klass,
   835             symbolHandle(THREAD, resolved_method->name()),
   836             symbolHandle(THREAD, resolved_method->signature()), CHECK);
   837   // check if method exists
   838   if (sel_method.is_null()) {
   839     ResourceMark rm(THREAD);
   840     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
   841               methodOopDesc::name_and_sig_as_C_string(Klass::cast(recv_klass()),
   842                                                       resolved_method->name(),
   843                                                       resolved_method->signature()));
   844   }
   845   // check if public
   846   if (!sel_method->is_public()) {
   847     ResourceMark rm(THREAD);
   848     THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
   849               methodOopDesc::name_and_sig_as_C_string(Klass::cast(recv_klass()),
   850                                                       sel_method->name(),
   851                                                       sel_method->signature()));
   852   }
   853   // check if abstract
   854   if (check_null_and_abstract && sel_method->is_abstract()) {
   855     ResourceMark rm(THREAD);
   856     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
   857               methodOopDesc::name_and_sig_as_C_string(Klass::cast(recv_klass()),
   858                                                       sel_method->name(),
   859                                                       sel_method->signature()));
   860   }
   861   // setup result
   862   result.set_interface(resolved_klass, recv_klass, resolved_method, sel_method, CHECK);
   863 }
   866 methodHandle LinkResolver::linktime_resolve_interface_method_or_null(
   867                                                  KlassHandle resolved_klass,
   868                                                  symbolHandle method_name,
   869                                                  symbolHandle method_signature,
   870                                                  KlassHandle current_klass,
   871                                                  bool check_access) {
   872   EXCEPTION_MARK;
   873   methodHandle method_result;
   874   linktime_resolve_interface_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
   875   if (HAS_PENDING_EXCEPTION) {
   876     CLEAR_PENDING_EXCEPTION;
   877     return methodHandle();
   878   } else {
   879     return method_result;
   880   }
   881 }
   883 methodHandle LinkResolver::linktime_resolve_virtual_method_or_null(
   884                                                  KlassHandle resolved_klass,
   885                                                  symbolHandle method_name,
   886                                                  symbolHandle method_signature,
   887                                                  KlassHandle current_klass,
   888                                                  bool check_access) {
   889   EXCEPTION_MARK;
   890   methodHandle method_result;
   891   linktime_resolve_virtual_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
   892   if (HAS_PENDING_EXCEPTION) {
   893     CLEAR_PENDING_EXCEPTION;
   894     return methodHandle();
   895   } else {
   896     return method_result;
   897   }
   898 }
   900 methodHandle LinkResolver::resolve_virtual_call_or_null(
   901                                                  KlassHandle receiver_klass,
   902                                                  KlassHandle resolved_klass,
   903                                                  symbolHandle name,
   904                                                  symbolHandle signature,
   905                                                  KlassHandle current_klass) {
   906   EXCEPTION_MARK;
   907   CallInfo info;
   908   resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
   909   if (HAS_PENDING_EXCEPTION) {
   910     CLEAR_PENDING_EXCEPTION;
   911     return methodHandle();
   912   }
   913   return info.selected_method();
   914 }
   916 methodHandle LinkResolver::resolve_interface_call_or_null(
   917                                                  KlassHandle receiver_klass,
   918                                                  KlassHandle resolved_klass,
   919                                                  symbolHandle name,
   920                                                  symbolHandle signature,
   921                                                  KlassHandle current_klass) {
   922   EXCEPTION_MARK;
   923   CallInfo info;
   924   resolve_interface_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
   925   if (HAS_PENDING_EXCEPTION) {
   926     CLEAR_PENDING_EXCEPTION;
   927     return methodHandle();
   928   }
   929   return info.selected_method();
   930 }
   932 int LinkResolver::resolve_virtual_vtable_index(
   933                                                KlassHandle receiver_klass,
   934                                                KlassHandle resolved_klass,
   935                                                symbolHandle name,
   936                                                symbolHandle signature,
   937                                                KlassHandle current_klass) {
   938   EXCEPTION_MARK;
   939   CallInfo info;
   940   resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
   941   if (HAS_PENDING_EXCEPTION) {
   942     CLEAR_PENDING_EXCEPTION;
   943     return methodOopDesc::invalid_vtable_index;
   944   }
   945   return info.vtable_index();
   946 }
   948 methodHandle LinkResolver::resolve_static_call_or_null(
   949                                                   KlassHandle resolved_klass,
   950                                                   symbolHandle name,
   951                                                   symbolHandle signature,
   952                                                   KlassHandle current_klass) {
   953   EXCEPTION_MARK;
   954   CallInfo info;
   955   resolve_static_call(info, resolved_klass, name, signature, current_klass, true, false, THREAD);
   956   if (HAS_PENDING_EXCEPTION) {
   957     CLEAR_PENDING_EXCEPTION;
   958     return methodHandle();
   959   }
   960   return info.selected_method();
   961 }
   963 methodHandle LinkResolver::resolve_special_call_or_null(KlassHandle resolved_klass, symbolHandle name, symbolHandle signature,
   964                                                         KlassHandle current_klass) {
   965   EXCEPTION_MARK;
   966   CallInfo info;
   967   resolve_special_call(info, resolved_klass, name, signature, current_klass, true, THREAD);
   968   if (HAS_PENDING_EXCEPTION) {
   969     CLEAR_PENDING_EXCEPTION;
   970     return methodHandle();
   971   }
   972   return info.selected_method();
   973 }
   977 //------------------------------------------------------------------------------------------------------------------------
   978 // ConstantPool entries
   980 void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
   981   switch (byte) {
   982     case Bytecodes::_invokestatic   : resolve_invokestatic   (result,       pool, index, CHECK); break;
   983     case Bytecodes::_invokespecial  : resolve_invokespecial  (result,       pool, index, CHECK); break;
   984     case Bytecodes::_invokevirtual  : resolve_invokevirtual  (result, recv, pool, index, CHECK); break;
   985     case Bytecodes::_invokedynamic  : resolve_invokedynamic  (result,       pool, index, CHECK); break;
   986     case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break;
   987   }
   988   return;
   989 }
   991 void LinkResolver::resolve_pool(KlassHandle& resolved_klass, symbolHandle& method_name, symbolHandle& method_signature,
   992                                 KlassHandle& current_klass, constantPoolHandle pool, int index, TRAPS) {
   993    // resolve klass
   994   resolve_klass(resolved_klass, pool, index, CHECK);
   996   // Get name, signature, and static klass
   997   method_name      = symbolHandle(THREAD, pool->name_ref_at(index));
   998   method_signature = symbolHandle(THREAD, pool->signature_ref_at(index));
   999   current_klass    = KlassHandle(THREAD, pool->pool_holder());
  1003 void LinkResolver::resolve_invokestatic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
  1004   KlassHandle  resolved_klass;
  1005   symbolHandle method_name;
  1006   symbolHandle method_signature;
  1007   KlassHandle  current_klass;
  1008   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
  1009   resolve_static_call(result, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
  1013 void LinkResolver::resolve_invokespecial(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
  1014   KlassHandle  resolved_klass;
  1015   symbolHandle method_name;
  1016   symbolHandle method_signature;
  1017   KlassHandle  current_klass;
  1018   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
  1019   resolve_special_call(result, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
  1023 void LinkResolver::resolve_invokevirtual(CallInfo& result, Handle recv,
  1024                                           constantPoolHandle pool, int index,
  1025                                           TRAPS) {
  1027   KlassHandle  resolved_klass;
  1028   symbolHandle method_name;
  1029   symbolHandle method_signature;
  1030   KlassHandle  current_klass;
  1031   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
  1032   KlassHandle recvrKlass (THREAD, recv.is_null() ? (klassOop)NULL : recv->klass());
  1033   resolve_virtual_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
  1037 void LinkResolver::resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS) {
  1038   KlassHandle  resolved_klass;
  1039   symbolHandle method_name;
  1040   symbolHandle method_signature;
  1041   KlassHandle  current_klass;
  1042   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
  1043   KlassHandle recvrKlass (THREAD, recv.is_null() ? (klassOop)NULL : recv->klass());
  1044   resolve_interface_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
  1048 void LinkResolver::resolve_invokedynamic(CallInfo& result, constantPoolHandle pool, int raw_index, TRAPS) {
  1049   assert(EnableInvokeDynamic, "");
  1051   // This guy is reached from InterpreterRuntime::resolve_invokedynamic.
  1053   // At this point, we only need the signature, and can ignore the name.
  1054   symbolHandle method_signature(THREAD, pool->signature_ref_at(raw_index));  // raw_index works directly
  1055   symbolHandle method_name = vmSymbolHandles::invokeExact_name();
  1056   KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
  1058   // JSR 292:  this must be an implicitly generated method MethodHandle.invokeExact(*...)
  1059   // The extra MH receiver will be inserted into the stack on every call.
  1060   methodHandle resolved_method;
  1061   lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, CHECK);
  1062   if (resolved_method.is_null()) {
  1063     THROW(vmSymbols::java_lang_InternalError());
  1065   result.set_virtual(resolved_klass, KlassHandle(), resolved_method, resolved_method, resolved_method->vtable_index(), CHECK);
  1068 //------------------------------------------------------------------------------------------------------------------------
  1069 #ifndef PRODUCT
  1071 void FieldAccessInfo::print() {
  1072   ResourceMark rm;
  1073   tty->print_cr("Field %s@%d", name()->as_C_string(), field_offset());
  1076 #endif

mercurial