1 /*
   2  * Copyright (c) 1997, 2013, 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/defaultMethods.hpp"
  27 #include "classfile/systemDictionary.hpp"
  28 #include "classfile/vmSymbols.hpp"
  29 #include "compiler/compileBroker.hpp"
  30 #include "gc_interface/collectedHeap.inline.hpp"
  31 #include "interpreter/bytecode.hpp"
  32 #include "interpreter/interpreterRuntime.hpp"
  33 #include "interpreter/linkResolver.hpp"
  34 #include "memory/resourceArea.hpp"
  35 #include "memory/universe.inline.hpp"
  36 #include "oops/instanceKlass.hpp"
  37 #include "oops/objArrayOop.hpp"
  38 #include "prims/methodHandles.hpp"
  39 #include "prims/nativeLookup.hpp"
  40 #include "runtime/compilationPolicy.hpp"
  41 #include "runtime/fieldDescriptor.hpp"
  42 #include "runtime/frame.inline.hpp"
  43 #include "runtime/handles.inline.hpp"
  44 #include "runtime/reflection.hpp"
  45 #include "runtime/signature.hpp"
  46 #include "runtime/thread.inline.hpp"
  47 #include "runtime/vmThread.hpp"
  48 
  49 //------------------------------------------------------------------------------------------------------------------------
  50 // Implementation of FieldAccessInfo
  51 
  52 void FieldAccessInfo::set(KlassHandle klass, Symbol* name, int field_index, int field_offset,
  53 BasicType field_type, AccessFlags access_flags) {
  54   _klass        = klass;
  55   _name         = name;
  56   _field_index  = field_index;
  57   _field_offset = field_offset;
  58   _field_type   = field_type;
  59   _access_flags = access_flags;
  60 }
  61 
  62 
  63 //------------------------------------------------------------------------------------------------------------------------
  64 // Implementation of CallInfo
  65 
  66 
  67 void CallInfo::set_static(KlassHandle resolved_klass, methodHandle resolved_method, TRAPS) {
  68   int vtable_index = Method::nonvirtual_vtable_index;
  69   set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, vtable_index, CHECK);
  70 }
  71 
  72 
  73 void CallInfo::set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, TRAPS) {
  74   // This is only called for interface methods. If the resolved_method
  75   // comes from java/lang/Object, it can be the subject of a virtual call, so
  76   // we should pick the vtable index from the resolved method.
  77   // Other than that case, there is no valid vtable index to specify.
  78   int vtable_index = Method::invalid_vtable_index;
  79   if (resolved_method->method_holder() == SystemDictionary::Object_klass()) {
  80     assert(resolved_method->vtable_index() == selected_method->vtable_index(), "sanity check");
  81     vtable_index = resolved_method->vtable_index();
  82   }
  83   set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
  84 }
  85 
  86 void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
  87   assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index, "valid index");
  88   set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
  89   assert(!resolved_method->is_compiled_lambda_form(), "these must be handled via an invokehandle call");
  90 }
  91 
  92 void CallInfo::set_handle(methodHandle resolved_method, Handle resolved_appendix, Handle resolved_method_type, TRAPS) {
  93   if (resolved_method.is_null()) {
  94     THROW_MSG(vmSymbols::java_lang_InternalError(), "resolved method is null");
  95   }
  96   KlassHandle resolved_klass = SystemDictionary::MethodHandle_klass();
  97   assert(resolved_method->intrinsic_id() == vmIntrinsics::_invokeBasic ||
  98          resolved_method->is_compiled_lambda_form(),
  99          "linkMethod must return one of these");
 100   int vtable_index = Method::nonvirtual_vtable_index;
 101   assert(resolved_method->vtable_index() == vtable_index, "");
 102   set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, vtable_index, CHECK);
 103   _resolved_appendix    = resolved_appendix;
 104   _resolved_method_type = resolved_method_type;
 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   _resolved_appendix = Handle();
 115   if (CompilationPolicy::must_be_compiled(selected_method)) {
 116     // This path is unusual, mostly used by the '-Xcomp' stress test mode.
 117 
 118     // Note: with several active threads, the must_be_compiled may be true
 119     //       while can_be_compiled is false; remove assert
 120     // assert(CompilationPolicy::can_be_compiled(selected_method), "cannot compile");
 121     if (THREAD->is_Compiler_thread()) {
 122       // don't force compilation, resolve was on behalf of compiler
 123       return;
 124     }
 125     if (selected_method->method_holder()->is_not_initialized()) {
 126       // 'is_not_initialized' means not only '!is_initialized', but also that
 127       // initialization has not been started yet ('!being_initialized')
 128       // Do not force compilation of methods in uninitialized classes.
 129       // Note that doing this would throw an assert later,
 130       // in CompileBroker::compile_method.
 131       // We sometimes use the link resolver to do reflective lookups
 132       // even before classes are initialized.
 133       return;
 134     }
 135     CompileBroker::compile_method(selected_method, InvocationEntryBci,
 136                                   CompilationPolicy::policy()->initial_compile_level(),
 137                                   methodHandle(), 0, "must_be_compiled", CHECK);
 138   }
 139 }
 140 
 141 
 142 //------------------------------------------------------------------------------------------------------------------------
 143 // Klass resolution
 144 
 145 void LinkResolver::check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS) {
 146   if (!Reflection::verify_class_access(ref_klass(),
 147                                        sel_klass(),
 148                                        true)) {
 149     ResourceMark rm(THREAD);
 150     Exceptions::fthrow(
 151       THREAD_AND_LOCATION,
 152       vmSymbols::java_lang_IllegalAccessError(),
 153       "tried to access class %s from class %s",
 154       sel_klass->external_name(),
 155       ref_klass->external_name()
 156     );
 157     return;
 158   }
 159 }
 160 
 161 void LinkResolver::resolve_klass(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
 162   Klass* result_oop = pool->klass_ref_at(index, CHECK);
 163   result = KlassHandle(THREAD, result_oop);
 164 }
 165 
 166 void LinkResolver::resolve_klass_no_update(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
 167   Klass* result_oop =
 168          ConstantPool::klass_ref_at_if_loaded_check(pool, index, CHECK);
 169   result = KlassHandle(THREAD, result_oop);
 170 }
 171 
 172 
 173 //------------------------------------------------------------------------------------------------------------------------
 174 // Method resolution
 175 //
 176 // According to JVM spec. $5.4.3c & $5.4.3d
 177 
 178 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 179   Method* result_oop = klass->uncached_lookup_method(name, signature);
 180   if (EnableInvokeDynamic && result_oop != NULL) {
 181     vmIntrinsics::ID iid = result_oop->intrinsic_id();
 182     if (MethodHandles::is_signature_polymorphic(iid)) {
 183       // Do not link directly to these.  The VM must produce a synthetic one using lookup_polymorphic_method.
 184       return;
 185     }
 186   }
 187   result = methodHandle(THREAD, result_oop);
 188 }
 189 
 190 // returns first instance method
 191 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 192   Method* result_oop = klass->uncached_lookup_method(name, signature);
 193   result = methodHandle(THREAD, result_oop);
 194   while (!result.is_null() && result->is_static()) {
 195     klass = KlassHandle(THREAD, result->method_holder()->super());
 196     result = methodHandle(THREAD, klass->uncached_lookup_method(name, signature));
 197   }
 198 }
 199 
 200 
 201 int LinkResolver::vtable_index_of_miranda_method(KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 202   ResourceMark rm(THREAD);
 203   klassVtable *vt = InstanceKlass::cast(klass())->vtable();
 204   return vt->index_of_miranda(name, signature);
 205 }
 206 
 207 void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 208   InstanceKlass *ik = InstanceKlass::cast(klass());
 209   result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature));
 210 }
 211 
 212 void LinkResolver::lookup_polymorphic_method(methodHandle& result,
 213                                              KlassHandle klass, Symbol* name, Symbol* full_signature,
 214                                              KlassHandle current_klass,
 215                                              Handle *appendix_result_or_null,
 216                                              Handle *method_type_result,
 217                                              TRAPS) {
 218   vmIntrinsics::ID iid = MethodHandles::signature_polymorphic_name_id(name);
 219   if (TraceMethodHandles) {
 220     ResourceMark rm(THREAD);
 221     tty->print_cr("lookup_polymorphic_method iid=%s %s.%s%s",
 222                   vmIntrinsics::name_at(iid), klass->external_name(),
 223                   name->as_C_string(), full_signature->as_C_string());
 224   }
 225   if (EnableInvokeDynamic &&
 226       klass() == SystemDictionary::MethodHandle_klass() &&
 227       iid != vmIntrinsics::_none) {
 228     if (MethodHandles::is_signature_polymorphic_intrinsic(iid)) {
 229       // Most of these do not need an up-call to Java to resolve, so can be done anywhere.
 230       // Do not erase last argument type (MemberName) if it is a static linkTo method.
 231       bool keep_last_arg = MethodHandles::is_signature_polymorphic_static(iid);
 232       TempNewSymbol basic_signature =
 233         MethodHandles::lookup_basic_type_signature(full_signature, keep_last_arg, CHECK);
 234       if (TraceMethodHandles) {
 235         ResourceMark rm(THREAD);
 236         tty->print_cr("lookup_polymorphic_method %s %s => basic %s",
 237                       name->as_C_string(),
 238                       full_signature->as_C_string(),
 239                       basic_signature->as_C_string());
 240       }
 241       result = SystemDictionary::find_method_handle_intrinsic(iid,
 242                                                               basic_signature,
 243                                                               CHECK);
 244       if (result.not_null()) {
 245         assert(result->is_method_handle_intrinsic(), "MH.invokeBasic or MH.linkTo* intrinsic");
 246         assert(result->intrinsic_id() != vmIntrinsics::_invokeGeneric, "wrong place to find this");
 247         assert(basic_signature == result->signature(), "predict the result signature");
 248         if (TraceMethodHandles) {
 249           tty->print("lookup_polymorphic_method => intrinsic ");
 250           result->print_on(tty);
 251         }
 252         return;
 253       }
 254     } else if (iid == vmIntrinsics::_invokeGeneric
 255                && !THREAD->is_Compiler_thread()
 256                && appendix_result_or_null != NULL) {
 257       // This is a method with type-checking semantics.
 258       // We will ask Java code to spin an adapter method for it.
 259       if (!MethodHandles::enabled()) {
 260         // Make sure the Java part of the runtime has been booted up.
 261         Klass* natives = SystemDictionary::MethodHandleNatives_klass();
 262         if (natives == NULL || InstanceKlass::cast(natives)->is_not_initialized()) {
 263           SystemDictionary::resolve_or_fail(vmSymbols::java_lang_invoke_MethodHandleNatives(),
 264                                             Handle(),
 265                                             Handle(),
 266                                             true,
 267                                             CHECK);
 268         }
 269       }
 270 
 271       Handle appendix;
 272       Handle method_type;
 273       result = SystemDictionary::find_method_handle_invoker(name,
 274                                                             full_signature,
 275                                                             current_klass,
 276                                                             &appendix,
 277                                                             &method_type,
 278                                                             CHECK);
 279       if (TraceMethodHandles) {
 280         tty->print("lookup_polymorphic_method => (via Java) ");
 281         result->print_on(tty);
 282         tty->print("  lookup_polymorphic_method => appendix = ");
 283         if (appendix.is_null())  tty->print_cr("(none)");
 284         else                     appendix->print_on(tty);
 285       }
 286       if (result.not_null()) {
 287 #ifdef ASSERT
 288         ResourceMark rm(THREAD);
 289 
 290         TempNewSymbol basic_signature =
 291           MethodHandles::lookup_basic_type_signature(full_signature, CHECK);
 292         int actual_size_of_params = result->size_of_parameters();
 293         int expected_size_of_params = ArgumentSizeComputer(basic_signature).size();
 294         // +1 for MethodHandle.this, +1 for trailing MethodType
 295         if (!MethodHandles::is_signature_polymorphic_static(iid))  expected_size_of_params += 1;
 296         if (appendix.not_null())                                   expected_size_of_params += 1;
 297         if (actual_size_of_params != expected_size_of_params) {
 298           tty->print_cr("*** basic_signature=%s", basic_signature->as_C_string());
 299           tty->print_cr("*** result for %s: ", vmIntrinsics::name_at(iid));
 300           result->print();
 301         }
 302         assert(actual_size_of_params == expected_size_of_params,
 303                err_msg("%d != %d", actual_size_of_params, expected_size_of_params));
 304 #endif //ASSERT
 305 
 306         assert(appendix_result_or_null != NULL, "");
 307         (*appendix_result_or_null) = appendix;
 308         (*method_type_result)      = method_type;
 309         return;
 310       }
 311     }
 312   }
 313 }
 314 
 315 void LinkResolver::check_method_accessability(KlassHandle ref_klass,
 316                                               KlassHandle resolved_klass,
 317                                               KlassHandle sel_klass,
 318                                               methodHandle sel_method,
 319                                               TRAPS) {
 320 
 321   AccessFlags flags = sel_method->access_flags();
 322 
 323   // Special case:  arrays always override "clone". JVMS 2.15.
 324   // If the resolved klass is an array class, and the declaring class
 325   // is java.lang.Object and the method is "clone", set the flags
 326   // to public.
 327   //
 328   // We'll check for the method name first, as that's most likely
 329   // to be false (so we'll short-circuit out of these tests).
 330   if (sel_method->name() == vmSymbols::clone_name() &&
 331       sel_klass() == SystemDictionary::Object_klass() &&
 332       resolved_klass->oop_is_array()) {
 333     // We need to change "protected" to "public".
 334     assert(flags.is_protected(), "clone not protected?");
 335     jint new_flags = flags.as_int();
 336     new_flags = new_flags & (~JVM_ACC_PROTECTED);
 337     new_flags = new_flags | JVM_ACC_PUBLIC;
 338     flags.set_flags(new_flags);
 339   }
 340 //  assert(extra_arg_result_or_null != NULL, "must be able to return extra argument");
 341 
 342   if (!Reflection::verify_field_access(ref_klass(),
 343                                        resolved_klass(),
 344                                        sel_klass(),
 345                                        flags,
 346                                        true)) {
 347     ResourceMark rm(THREAD);
 348     Exceptions::fthrow(
 349       THREAD_AND_LOCATION,
 350       vmSymbols::java_lang_IllegalAccessError(),
 351       "tried to access method %s.%s%s from class %s",
 352       sel_klass->external_name(),
 353       sel_method->name()->as_C_string(),
 354       sel_method->signature()->as_C_string(),
 355       ref_klass->external_name()
 356     );
 357     return;
 358   }
 359 }
 360 
 361 void LinkResolver::resolve_method_statically(methodHandle& resolved_method, KlassHandle& resolved_klass,
 362                                              Bytecodes::Code code, constantPoolHandle pool, int index, TRAPS) {
 363 
 364   // resolve klass
 365   if (code == Bytecodes::_invokedynamic) {
 366     resolved_klass = SystemDictionary::MethodHandle_klass();
 367     Symbol* method_name = vmSymbols::invoke_name();
 368     Symbol* method_signature = pool->signature_ref_at(index);
 369     KlassHandle  current_klass(THREAD, pool->pool_holder());
 370     resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
 371     return;
 372   }
 373 
 374   resolve_klass(resolved_klass, pool, index, CHECK);
 375 
 376   Symbol*  method_name       = pool->name_ref_at(index);
 377   Symbol*  method_signature  = pool->signature_ref_at(index);
 378   KlassHandle  current_klass(THREAD, pool->pool_holder());
 379 
 380   if (pool->has_preresolution()
 381       || (resolved_klass() == SystemDictionary::MethodHandle_klass() &&
 382           MethodHandles::is_signature_polymorphic_name(resolved_klass(), method_name))) {
 383     Method* result_oop = ConstantPool::method_at_if_loaded(pool, index);
 384     if (result_oop != NULL) {
 385       resolved_method = methodHandle(THREAD, result_oop);
 386       return;
 387     }
 388   }
 389 
 390   if (code == Bytecodes::_invokeinterface) {
 391     resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
 392   } else {
 393     resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
 394   }
 395 }
 396 
 397 void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
 398                                   Symbol* method_name, Symbol* method_signature,
 399                                   KlassHandle current_klass, bool check_access, TRAPS) {
 400 
 401   Handle nested_exception;
 402 
 403   // 1. lookup method in resolved klass and its super klasses
 404   lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK);
 405 
 406   if (resolved_method.is_null()) { // not found in the class hierarchy
 407     // 2. lookup method in all the interfaces implemented by the resolved klass
 408     lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
 409 
 410     if (resolved_method.is_null()) {
 411       // JSR 292:  see if this is an implicitly generated method MethodHandle.linkToVirtual(*...), etc
 412       lookup_polymorphic_method(resolved_method, resolved_klass, method_name, method_signature,
 413                                 current_klass, (Handle*)NULL, (Handle*)NULL, THREAD);
 414       if (HAS_PENDING_EXCEPTION) {
 415         nested_exception = Handle(THREAD, PENDING_EXCEPTION);
 416         CLEAR_PENDING_EXCEPTION;
 417       }
 418     }
 419 
 420     if (resolved_method.is_null()) {
 421       // 3. method lookup failed
 422       ResourceMark rm(THREAD);
 423       THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(),
 424                       Method::name_and_sig_as_C_string(resolved_klass(),
 425                                                               method_name,
 426                                                               method_signature),
 427                       nested_exception);
 428     }
 429   }
 430 
 431   // 4. check if klass is not interface
 432   if (resolved_klass->is_interface() && resolved_method->is_abstract()) {
 433     ResourceMark rm(THREAD);
 434     char buf[200];
 435     jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected",
 436         resolved_klass()->external_name());
 437     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
 438   }
 439 
 440   // 5. check if method is concrete
 441   if (resolved_method->is_abstract() && !resolved_klass->is_abstract()) {
 442     ResourceMark rm(THREAD);
 443     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
 444               Method::name_and_sig_as_C_string(resolved_klass(),
 445                                                       method_name,
 446                                                       method_signature));
 447   }
 448 
 449   // 6. access checks, access checking may be turned off when calling from within the VM.
 450   if (check_access) {
 451     assert(current_klass.not_null() , "current_klass should not be null");
 452 
 453     // check if method can be accessed by the referring class
 454     check_method_accessability(current_klass,
 455                                resolved_klass,
 456                                KlassHandle(THREAD, resolved_method->method_holder()),
 457                                resolved_method,
 458                                CHECK);
 459 
 460     // check loader constraints
 461     Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
 462     Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
 463     {
 464       ResourceMark rm(THREAD);
 465       Symbol* failed_type_symbol =
 466         SystemDictionary::check_signature_loaders(method_signature, loader,
 467                                                   class_loader, true, CHECK);
 468       if (failed_type_symbol != NULL) {
 469         const char* msg = "loader constraint violation: when resolving method"
 470           " \"%s\" the class loader (instance of %s) of the current class, %s,"
 471           " and the class loader (instance of %s) for the method's defining class, %s, have"
 472           " different Class objects for the type %s used in the signature";
 473         char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
 474         const char* loader1 = SystemDictionary::loader_name(loader());
 475         char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
 476         const char* loader2 = SystemDictionary::loader_name(class_loader());
 477         char* target = InstanceKlass::cast(resolved_method->method_holder())
 478                        ->name()->as_C_string();
 479         char* failed_type_name = failed_type_symbol->as_C_string();
 480         size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
 481           strlen(current) + strlen(loader2) + strlen(target) +
 482           strlen(failed_type_name) + 1;
 483         char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
 484         jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
 485                      target, failed_type_name);
 486         THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
 487       }
 488     }
 489   }
 490 }
 491 
 492 void LinkResolver::resolve_interface_method(methodHandle& resolved_method,
 493                                             KlassHandle resolved_klass,
 494                                             Symbol* method_name,
 495                                             Symbol* method_signature,
 496                                             KlassHandle current_klass,
 497                                             bool check_access, TRAPS) {
 498 
 499  // check if klass is interface
 500   if (!resolved_klass->is_interface()) {
 501     ResourceMark rm(THREAD);
 502     char buf[200];
 503     jio_snprintf(buf, sizeof(buf), "Found class %s, but interface was expected", resolved_klass()->external_name());
 504     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
 505   }
 506 
 507   // lookup method in this interface or its super, java.lang.Object
 508   lookup_instance_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK);
 509 
 510   if (resolved_method.is_null()) {
 511     // lookup method in all the super-interfaces
 512     lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
 513     if (resolved_method.is_null()) {
 514       // no method found
 515       ResourceMark rm(THREAD);
 516       THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(),
 517                 Method::name_and_sig_as_C_string(resolved_klass(),
 518                                                         method_name,
 519                                                         method_signature));
 520     }
 521   }
 522 
 523   if (check_access) {
 524     HandleMark hm(THREAD);
 525     Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
 526     Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
 527     {
 528       ResourceMark rm(THREAD);
 529       Symbol* failed_type_symbol =
 530         SystemDictionary::check_signature_loaders(method_signature, loader,
 531                                                   class_loader, true, CHECK);
 532       if (failed_type_symbol != NULL) {
 533         const char* msg = "loader constraint violation: when resolving "
 534           "interface method \"%s\" the class loader (instance of %s) of the "
 535           "current class, %s, and the class loader (instance of %s) for "
 536           "the method's defining class, %s, have different Class objects for the type %s "
 537           "used in the signature";
 538         char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
 539         const char* loader1 = SystemDictionary::loader_name(loader());
 540         char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
 541         const char* loader2 = SystemDictionary::loader_name(class_loader());
 542         char* target = InstanceKlass::cast(resolved_method->method_holder())
 543                        ->name()->as_C_string();
 544         char* failed_type_name = failed_type_symbol->as_C_string();
 545         size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
 546           strlen(current) + strlen(loader2) + strlen(target) +
 547           strlen(failed_type_name) + 1;
 548         char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
 549         jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
 550                      target, failed_type_name);
 551         THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
 552       }
 553     }
 554   }
 555 }
 556 
 557 //------------------------------------------------------------------------------------------------------------------------
 558 // Field resolution
 559 
 560 void LinkResolver::check_field_accessability(KlassHandle ref_klass,
 561                                              KlassHandle resolved_klass,
 562                                              KlassHandle sel_klass,
 563                                              fieldDescriptor& fd,
 564                                              TRAPS) {
 565   if (!Reflection::verify_field_access(ref_klass(),
 566                                        resolved_klass(),
 567                                        sel_klass(),
 568                                        fd.access_flags(),
 569                                        true)) {
 570     ResourceMark rm(THREAD);
 571     Exceptions::fthrow(
 572       THREAD_AND_LOCATION,
 573       vmSymbols::java_lang_IllegalAccessError(),
 574       "tried to access field %s.%s from class %s",
 575       sel_klass->external_name(),
 576       fd.name()->as_C_string(),
 577       ref_klass->external_name()
 578     );
 579     return;
 580   }
 581 }
 582 
 583 void LinkResolver::resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, TRAPS) {
 584   resolve_field(result, pool, index, byte, check_only, true, CHECK);
 585 }
 586 
 587 void LinkResolver::resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, bool update_pool, TRAPS) {
 588   assert(byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic ||
 589          byte == Bytecodes::_getfield  || byte == Bytecodes::_putfield, "bad bytecode");
 590 
 591   bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
 592   bool is_put    = (byte == Bytecodes::_putfield  || byte == Bytecodes::_putstatic);
 593 
 594   // resolve specified klass
 595   KlassHandle resolved_klass;
 596   if (update_pool) {
 597     resolve_klass(resolved_klass, pool, index, CHECK);
 598   } else {
 599     resolve_klass_no_update(resolved_klass, pool, index, CHECK);
 600   }
 601   // Load these early in case the resolve of the containing klass fails
 602   Symbol* field = pool->name_ref_at(index);
 603   Symbol* sig   = pool->signature_ref_at(index);
 604   // Check if there's a resolved klass containing the field
 605   if( resolved_klass.is_null() ) {
 606     ResourceMark rm(THREAD);
 607     THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
 608   }
 609 
 610   // Resolve instance field
 611   fieldDescriptor fd; // find_field initializes fd if found
 612   KlassHandle sel_klass(THREAD, InstanceKlass::cast(resolved_klass())->find_field(field, sig, &fd));
 613   // check if field exists; i.e., if a klass containing the field def has been selected
 614   if (sel_klass.is_null()){
 615     ResourceMark rm(THREAD);
 616     THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
 617   }
 618 
 619   // check access
 620   KlassHandle ref_klass(THREAD, pool->pool_holder());
 621   check_field_accessability(ref_klass, resolved_klass, sel_klass, fd, CHECK);
 622 
 623   // check for errors
 624   if (is_static != fd.is_static()) {
 625     ResourceMark rm(THREAD);
 626     char msg[200];
 627     jio_snprintf(msg, sizeof(msg), "Expected %s field %s.%s", is_static ? "static" : "non-static", resolved_klass()->external_name(), fd.name()->as_C_string());
 628     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), msg);
 629   }
 630 
 631   // Final fields can only be accessed from its own class.
 632   if (is_put && fd.access_flags().is_final() && sel_klass() != pool->pool_holder()) {
 633     THROW(vmSymbols::java_lang_IllegalAccessError());
 634   }
 635 
 636   // initialize resolved_klass if necessary
 637   // note 1: the klass which declared the field must be initialized (i.e, sel_klass)
 638   //         according to the newest JVM spec (5.5, p.170) - was bug (gri 7/28/99)
 639   //
 640   // note 2: we don't want to force initialization if we are just checking
 641   //         if the field access is legal; e.g., during compilation
 642   if (is_static && !check_only) {
 643     sel_klass->initialize(CHECK);
 644   }
 645 
 646   {
 647     HandleMark hm(THREAD);
 648     Handle ref_loader (THREAD, InstanceKlass::cast(ref_klass())->class_loader());
 649     Handle sel_loader (THREAD, InstanceKlass::cast(sel_klass())->class_loader());
 650     Symbol*  signature_ref  = pool->signature_ref_at(index);
 651     {
 652       ResourceMark rm(THREAD);
 653       Symbol* failed_type_symbol =
 654         SystemDictionary::check_signature_loaders(signature_ref,
 655                                                   ref_loader, sel_loader,
 656                                                   false,
 657                                                   CHECK);
 658       if (failed_type_symbol != NULL) {
 659         const char* msg = "loader constraint violation: when resolving field"
 660           " \"%s\" the class loader (instance of %s) of the referring class, "
 661           "%s, and the class loader (instance of %s) for the field's resolved "
 662           "type, %s, have different Class objects for that type";
 663         char* field_name = field->as_C_string();
 664         const char* loader1 = SystemDictionary::loader_name(ref_loader());
 665         char* sel = InstanceKlass::cast(sel_klass())->name()->as_C_string();
 666         const char* loader2 = SystemDictionary::loader_name(sel_loader());
 667         char* failed_type_name = failed_type_symbol->as_C_string();
 668         size_t buflen = strlen(msg) + strlen(field_name) + strlen(loader1) +
 669           strlen(sel) + strlen(loader2) + strlen(failed_type_name) + 1;
 670         char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
 671         jio_snprintf(buf, buflen, msg, field_name, loader1, sel, loader2,
 672                      failed_type_name);
 673         THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
 674       }
 675     }
 676   }
 677 
 678   // return information. note that the klass is set to the actual klass containing the
 679   // field, otherwise access of static fields in superclasses will not work.
 680   KlassHandle holder (THREAD, fd.field_holder());
 681   Symbol*  name   = fd.name();
 682   result.set(holder, name, fd.index(), fd.offset(), fd.field_type(), fd.access_flags());
 683 }
 684 
 685 
 686 //------------------------------------------------------------------------------------------------------------------------
 687 // Invoke resolution
 688 //
 689 // Naming conventions:
 690 //
 691 // resolved_method    the specified method (i.e., static receiver specified via constant pool index)
 692 // sel_method         the selected method  (selected via run-time lookup; e.g., based on dynamic receiver class)
 693 // resolved_klass     the specified klass  (i.e., specified via constant pool index)
 694 // recv_klass         the receiver klass
 695 
 696 
 697 void LinkResolver::resolve_static_call(CallInfo& result, KlassHandle& resolved_klass, Symbol* method_name,
 698                                        Symbol* method_signature, KlassHandle current_klass,
 699                                        bool check_access, bool initialize_class, TRAPS) {
 700   methodHandle resolved_method;
 701   linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
 702   resolved_klass = KlassHandle(THREAD, resolved_method->method_holder());
 703 
 704   // Initialize klass (this should only happen if everything is ok)
 705   if (initialize_class && resolved_klass->should_be_initialized()) {
 706     resolved_klass->initialize(CHECK);
 707     linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
 708   }
 709 
 710   // setup result
 711   result.set_static(resolved_klass, resolved_method, CHECK);
 712 }
 713 
 714 // throws linktime exceptions
 715 void LinkResolver::linktime_resolve_static_method(methodHandle& resolved_method, KlassHandle resolved_klass,
 716                                                   Symbol* method_name, Symbol* method_signature,
 717                                                   KlassHandle current_klass, bool check_access, TRAPS) {
 718 
 719   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
 720   assert(resolved_method->name() != vmSymbols::class_initializer_name(), "should have been checked in verifier");
 721 
 722   // check if static
 723   if (!resolved_method->is_static()) {
 724     ResourceMark rm(THREAD);
 725     char buf[200];
 726     jio_snprintf(buf, sizeof(buf), "Expected static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
 727                                                       resolved_method->name(),
 728                                                       resolved_method->signature()));
 729     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
 730   }
 731 }
 732 
 733 
 734 void LinkResolver::resolve_special_call(CallInfo& result, KlassHandle resolved_klass, Symbol* method_name,
 735                                         Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
 736   methodHandle resolved_method;
 737   linktime_resolve_special_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
 738   runtime_resolve_special_method(result, resolved_method, resolved_klass, current_klass, check_access, CHECK);
 739 }
 740 
 741 // throws linktime exceptions
 742 void LinkResolver::linktime_resolve_special_method(methodHandle& resolved_method, KlassHandle resolved_klass,
 743                                                    Symbol* method_name, Symbol* method_signature,
 744                                                    KlassHandle current_klass, bool check_access, TRAPS) {
 745 
 746   if (resolved_klass->is_interface() && current_klass() != NULL) {
 747     // If the target class is a direct interface, treat this as a "super"
 748     // default call.
 749     //
 750     // If the current method is an overpass that happens to call a direct
 751     // super-interface's method, then we'll end up rerunning the default method
 752     // analysis even though we don't need to, but that's ok since it will end
 753     // up with the same answer.
 754     InstanceKlass* ik = InstanceKlass::cast(current_klass());
 755     Array<Klass*>* interfaces = ik->local_interfaces();
 756     int num_interfaces = interfaces->length();
 757     for (int index = 0; index < num_interfaces; index++) {
 758       if (interfaces->at(index) == resolved_klass()) {
 759         Method* method = DefaultMethods::find_super_default(current_klass(),
 760             resolved_klass(), method_name, method_signature, CHECK);
 761         resolved_method = methodHandle(THREAD, method);
 762         return;
 763       }
 764     }
 765   }
 766 
 767   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
 768 
 769   // check if method name is <init>, that it is found in same klass as static type
 770   if (resolved_method->name() == vmSymbols::object_initializer_name() &&
 771       resolved_method->method_holder() != resolved_klass()) {
 772     ResourceMark rm(THREAD);
 773     Exceptions::fthrow(
 774       THREAD_AND_LOCATION,
 775       vmSymbols::java_lang_NoSuchMethodError(),
 776       "%s: method %s%s not found",
 777       resolved_klass->external_name(),
 778       resolved_method->name()->as_C_string(),
 779       resolved_method->signature()->as_C_string()
 780     );
 781     return;
 782   }
 783 
 784   // check if not static
 785   if (resolved_method->is_static()) {
 786     ResourceMark rm(THREAD);
 787     char buf[200];
 788     jio_snprintf(buf, sizeof(buf),
 789                  "Expecting non-static method %s",
 790                  Method::name_and_sig_as_C_string(resolved_klass(),
 791                                                          resolved_method->name(),
 792                                                          resolved_method->signature()));
 793     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
 794   }
 795 }
 796 
 797 // throws runtime exceptions
 798 void LinkResolver::runtime_resolve_special_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
 799                                                   KlassHandle current_klass, bool check_access, TRAPS) {
 800 
 801   // resolved method is selected method unless we have an old-style lookup
 802   methodHandle sel_method(THREAD, resolved_method());
 803 
 804   // check if this is an old-style super call and do a new lookup if so
 805   { KlassHandle method_klass  = KlassHandle(THREAD,
 806                                             resolved_method->method_holder());
 807 
 808     const bool direct_calling_default_method =
 809       resolved_klass() != NULL && resolved_method() != NULL &&
 810       resolved_klass->is_interface() && !resolved_method->is_abstract();
 811 
 812     if (!direct_calling_default_method &&
 813         check_access &&
 814         // a) check if ACC_SUPER flag is set for the current class
 815         (current_klass->is_super() || !AllowNonVirtualCalls) &&
 816         // b) check if the method class is a superclass of the current class (superclass relation is not reflexive!)
 817         current_klass->is_subtype_of(method_klass()) &&
 818         current_klass() != method_klass() &&
 819         // c) check if the method is not <init>
 820         resolved_method->name() != vmSymbols::object_initializer_name()) {
 821       // Lookup super method
 822       KlassHandle super_klass(THREAD, current_klass->super());
 823       lookup_instance_method_in_klasses(sel_method, super_klass,
 824                            resolved_method->name(),
 825                            resolved_method->signature(), CHECK);
 826       // check if found
 827       if (sel_method.is_null()) {
 828         ResourceMark rm(THREAD);
 829         THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
 830                   Method::name_and_sig_as_C_string(resolved_klass(),
 831                                             resolved_method->name(),
 832                                             resolved_method->signature()));
 833       }
 834     }
 835   }
 836 
 837   // check if not static
 838   if (sel_method->is_static()) {
 839     ResourceMark rm(THREAD);
 840     char buf[200];
 841     jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
 842                                                                                                              resolved_method->name(),
 843                                                                                                              resolved_method->signature()));
 844     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
 845   }
 846 
 847   // check if abstract
 848   if (sel_method->is_abstract()) {
 849     ResourceMark rm(THREAD);
 850     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
 851               Method::name_and_sig_as_C_string(resolved_klass(),
 852                                                       sel_method->name(),
 853                                                       sel_method->signature()));
 854   }
 855 
 856   // setup result
 857   result.set_static(resolved_klass, sel_method, CHECK);
 858 }
 859 
 860 void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, KlassHandle receiver_klass, KlassHandle resolved_klass,
 861                                         Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
 862                                         bool check_access, bool check_null_and_abstract, TRAPS) {
 863   methodHandle resolved_method;
 864   linktime_resolve_virtual_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
 865   runtime_resolve_virtual_method(result, resolved_method, resolved_klass, recv, receiver_klass, check_null_and_abstract, CHECK);
 866 }
 867 
 868 // throws linktime exceptions
 869 void LinkResolver::linktime_resolve_virtual_method(methodHandle &resolved_method, KlassHandle resolved_klass,
 870                                                    Symbol* method_name, Symbol* method_signature,
 871                                                    KlassHandle current_klass, bool check_access, TRAPS) {
 872   // normal method resolution
 873   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
 874 
 875   assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
 876   assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
 877 
 878   // check if not static
 879   if (resolved_method->is_static()) {
 880     ResourceMark rm(THREAD);
 881     char buf[200];
 882     jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
 883                                                                                                              resolved_method->name(),
 884                                                                                                              resolved_method->signature()));
 885     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
 886   }
 887 }
 888 
 889 // throws runtime exceptions
 890 void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
 891                                                   methodHandle resolved_method,
 892                                                   KlassHandle resolved_klass,
 893                                                   Handle recv,
 894                                                   KlassHandle recv_klass,
 895                                                   bool check_null_and_abstract,
 896                                                   TRAPS) {
 897 
 898   // setup default return values
 899   int vtable_index = Method::invalid_vtable_index;
 900   methodHandle selected_method;
 901 
 902   assert(recv.is_null() || recv->is_oop(), "receiver is not an oop");
 903 
 904   // runtime method resolution
 905   if (check_null_and_abstract && recv.is_null()) { // check if receiver exists
 906     THROW(vmSymbols::java_lang_NullPointerException());
 907   }
 908 
 909   // Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s
 910   // has not been rewritten, and the vtable initialized.
 911   assert(resolved_method->method_holder()->is_linked(), "must be linked");
 912 
 913   // Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s
 914   // has not been rewritten, and the vtable initialized. Make sure to do this after the nullcheck, since
 915   // a missing receiver might result in a bogus lookup.
 916   assert(resolved_method->method_holder()->is_linked(), "must be linked");
 917 
 918   // do lookup based on receiver klass using the vtable index
 919   if (resolved_method->method_holder()->is_interface()) { // miranda method
 920     vtable_index = vtable_index_of_miranda_method(resolved_klass,
 921                            resolved_method->name(),
 922                            resolved_method->signature(), CHECK);
 923     assert(vtable_index >= 0 , "we should have valid vtable index at this point");
 924 
 925     InstanceKlass* inst = InstanceKlass::cast(recv_klass());
 926     selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
 927   } else {
 928     // at this point we are sure that resolved_method is virtual and not
 929     // a miranda method; therefore, it must have a valid vtable index.
 930     vtable_index = resolved_method->vtable_index();
 931     // We could get a negative vtable_index for final methods,
 932     // because as an optimization they are they are never put in the vtable,
 933     // unless they override an existing method.
 934     // If we do get a negative, it means the resolved method is the the selected
 935     // method, and it can never be changed by an override.
 936     if (vtable_index == Method::nonvirtual_vtable_index) {
 937       assert(resolved_method->can_be_statically_bound(), "cannot override this method");
 938       selected_method = resolved_method;
 939     } else {
 940       // recv_klass might be an arrayKlassOop but all vtables start at
 941       // the same place. The cast is to avoid virtual call and assertion.
 942       InstanceKlass* inst = (InstanceKlass*)recv_klass();
 943       selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
 944     }
 945   }
 946 
 947   // check if method exists
 948   if (selected_method.is_null()) {
 949     ResourceMark rm(THREAD);
 950     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
 951               Method::name_and_sig_as_C_string(resolved_klass(),
 952                                                       resolved_method->name(),
 953                                                       resolved_method->signature()));
 954   }
 955 
 956   // check if abstract
 957   if (check_null_and_abstract && selected_method->is_abstract()) {
 958     ResourceMark rm(THREAD);
 959     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
 960               Method::name_and_sig_as_C_string(resolved_klass(),
 961                                                       selected_method->name(),
 962                                                       selected_method->signature()));
 963   }
 964 
 965   // setup result
 966   result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK);
 967 }
 968 
 969 void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass,
 970                                           Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
 971                                           bool check_access, bool check_null_and_abstract, TRAPS) {
 972   methodHandle resolved_method;
 973   linktime_resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
 974   runtime_resolve_interface_method(result, resolved_method, resolved_klass, recv, recv_klass, check_null_and_abstract, CHECK);
 975 }
 976 
 977 // throws linktime exceptions
 978 void LinkResolver::linktime_resolve_interface_method(methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name,
 979                                                      Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
 980   // normal interface method resolution
 981   resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
 982 
 983   assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
 984   assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
 985 }
 986 
 987 // throws runtime exceptions
 988 void LinkResolver::runtime_resolve_interface_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
 989                                                     Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS) {
 990   // check if receiver exists
 991   if (check_null_and_abstract && recv.is_null()) {
 992     THROW(vmSymbols::java_lang_NullPointerException());
 993   }
 994 
 995   // check if receiver klass implements the resolved interface
 996   if (!recv_klass->is_subtype_of(resolved_klass())) {
 997     ResourceMark rm(THREAD);
 998     char buf[200];
 999     jio_snprintf(buf, sizeof(buf), "Class %s does not implement the requested interface %s",
1000                  recv_klass()->external_name(),
1001                  resolved_klass()->external_name());
1002     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
1003   }
1004   // do lookup based on receiver klass
1005   methodHandle sel_method;
1006   lookup_instance_method_in_klasses(sel_method, recv_klass,
1007             resolved_method->name(),
1008             resolved_method->signature(), CHECK);
1009   // check if method exists
1010   if (sel_method.is_null()) {
1011     ResourceMark rm(THREAD);
1012     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
1013               Method::name_and_sig_as_C_string(recv_klass(),
1014                                                       resolved_method->name(),
1015                                                       resolved_method->signature()));
1016   }
1017   // check access
1018   if (sel_method->method_holder()->is_interface()) {
1019     // Method holder is an interface. Throw Illegal Access Error if sel_method
1020     // is neither public nor private.
1021     if (!(sel_method->is_public() || sel_method->is_private())) {
1022       ResourceMark rm(THREAD);
1023       THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
1024                 Method::name_and_sig_as_C_string(recv_klass(),
1025                                                  sel_method->name(),
1026                                                  sel_method->signature()));
1027     }
1028   }
1029   else {
1030     // Method holder is a class. Throw Illegal Access Error if sel_method
1031     // is not public.
1032     if (!sel_method->is_public()) {
1033       ResourceMark rm(THREAD);
1034       THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
1035                 Method::name_and_sig_as_C_string(recv_klass(),
1036                                                  sel_method->name(),
1037                                                  sel_method->signature()));
1038     }
1039   }
1040   // check if abstract
1041   if (check_null_and_abstract && sel_method->is_abstract()) {
1042     ResourceMark rm(THREAD);
1043     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
1044               Method::name_and_sig_as_C_string(recv_klass(),
1045                                                       sel_method->name(),
1046                                                       sel_method->signature()));
1047   }
1048   // setup result
1049   result.set_interface(resolved_klass, recv_klass, resolved_method, sel_method, CHECK);
1050 }
1051 
1052 
1053 methodHandle LinkResolver::linktime_resolve_interface_method_or_null(
1054                                                  KlassHandle resolved_klass,
1055                                                  Symbol* method_name,
1056                                                  Symbol* method_signature,
1057                                                  KlassHandle current_klass,
1058                                                  bool check_access) {
1059   EXCEPTION_MARK;
1060   methodHandle method_result;
1061   linktime_resolve_interface_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
1062   if (HAS_PENDING_EXCEPTION) {
1063     CLEAR_PENDING_EXCEPTION;
1064     return methodHandle();
1065   } else {
1066     return method_result;
1067   }
1068 }
1069 
1070 methodHandle LinkResolver::linktime_resolve_virtual_method_or_null(
1071                                                  KlassHandle resolved_klass,
1072                                                  Symbol* method_name,
1073                                                  Symbol* method_signature,
1074                                                  KlassHandle current_klass,
1075                                                  bool check_access) {
1076   EXCEPTION_MARK;
1077   methodHandle method_result;
1078   linktime_resolve_virtual_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
1079   if (HAS_PENDING_EXCEPTION) {
1080     CLEAR_PENDING_EXCEPTION;
1081     return methodHandle();
1082   } else {
1083     return method_result;
1084   }
1085 }
1086 
1087 methodHandle LinkResolver::resolve_virtual_call_or_null(
1088                                                  KlassHandle receiver_klass,
1089                                                  KlassHandle resolved_klass,
1090                                                  Symbol* name,
1091                                                  Symbol* signature,
1092                                                  KlassHandle current_klass) {
1093   EXCEPTION_MARK;
1094   CallInfo info;
1095   resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
1096   if (HAS_PENDING_EXCEPTION) {
1097     CLEAR_PENDING_EXCEPTION;
1098     return methodHandle();
1099   }
1100   return info.selected_method();
1101 }
1102 
1103 methodHandle LinkResolver::resolve_interface_call_or_null(
1104                                                  KlassHandle receiver_klass,
1105                                                  KlassHandle resolved_klass,
1106                                                  Symbol* name,
1107                                                  Symbol* signature,
1108                                                  KlassHandle current_klass) {
1109   EXCEPTION_MARK;
1110   CallInfo info;
1111   resolve_interface_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
1112   if (HAS_PENDING_EXCEPTION) {
1113     CLEAR_PENDING_EXCEPTION;
1114     return methodHandle();
1115   }
1116   return info.selected_method();
1117 }
1118 
1119 int LinkResolver::resolve_virtual_vtable_index(
1120                                                KlassHandle receiver_klass,
1121                                                KlassHandle resolved_klass,
1122                                                Symbol* name,
1123                                                Symbol* signature,
1124                                                KlassHandle current_klass) {
1125   EXCEPTION_MARK;
1126   CallInfo info;
1127   resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
1128   if (HAS_PENDING_EXCEPTION) {
1129     CLEAR_PENDING_EXCEPTION;
1130     return Method::invalid_vtable_index;
1131   }
1132   return info.vtable_index();
1133 }
1134 
1135 methodHandle LinkResolver::resolve_static_call_or_null(
1136                                                   KlassHandle resolved_klass,
1137                                                   Symbol* name,
1138                                                   Symbol* signature,
1139                                                   KlassHandle current_klass) {
1140   EXCEPTION_MARK;
1141   CallInfo info;
1142   resolve_static_call(info, resolved_klass, name, signature, current_klass, true, false, THREAD);
1143   if (HAS_PENDING_EXCEPTION) {
1144     CLEAR_PENDING_EXCEPTION;
1145     return methodHandle();
1146   }
1147   return info.selected_method();
1148 }
1149 
1150 methodHandle LinkResolver::resolve_special_call_or_null(KlassHandle resolved_klass, Symbol* name, Symbol* signature,
1151                                                         KlassHandle current_klass) {
1152   EXCEPTION_MARK;
1153   CallInfo info;
1154   resolve_special_call(info, resolved_klass, name, signature, current_klass, true, THREAD);
1155   if (HAS_PENDING_EXCEPTION) {
1156     CLEAR_PENDING_EXCEPTION;
1157     return methodHandle();
1158   }
1159   return info.selected_method();
1160 }
1161 
1162 
1163 
1164 //------------------------------------------------------------------------------------------------------------------------
1165 // ConstantPool entries
1166 
1167 void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
1168   switch (byte) {
1169     case Bytecodes::_invokestatic   : resolve_invokestatic   (result,       pool, index, CHECK); break;
1170     case Bytecodes::_invokespecial  : resolve_invokespecial  (result,       pool, index, CHECK); break;
1171     case Bytecodes::_invokevirtual  : resolve_invokevirtual  (result, recv, pool, index, CHECK); break;
1172     case Bytecodes::_invokehandle   : resolve_invokehandle   (result,       pool, index, CHECK); break;
1173     case Bytecodes::_invokedynamic  : resolve_invokedynamic  (result,       pool, index, CHECK); break;
1174     case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break;
1175   }
1176   return;
1177 }
1178 
1179 void LinkResolver::resolve_pool(KlassHandle& resolved_klass, Symbol*& method_name, Symbol*& method_signature,
1180                                 KlassHandle& current_klass, constantPoolHandle pool, int index, TRAPS) {
1181    // resolve klass
1182   resolve_klass(resolved_klass, pool, index, CHECK);
1183 
1184   // Get name, signature, and static klass
1185   method_name      = pool->name_ref_at(index);
1186   method_signature = pool->signature_ref_at(index);
1187   current_klass    = KlassHandle(THREAD, pool->pool_holder());
1188 }
1189 
1190 
1191 void LinkResolver::resolve_invokestatic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
1192   KlassHandle  resolved_klass;
1193   Symbol* method_name = NULL;
1194   Symbol* method_signature = NULL;
1195   KlassHandle  current_klass;
1196   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
1197   resolve_static_call(result, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
1198 }
1199 
1200 
1201 void LinkResolver::resolve_invokespecial(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
1202   KlassHandle  resolved_klass;
1203   Symbol* method_name = NULL;
1204   Symbol* method_signature = NULL;
1205   KlassHandle  current_klass;
1206   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
1207   resolve_special_call(result, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
1208 }
1209 
1210 
1211 void LinkResolver::resolve_invokevirtual(CallInfo& result, Handle recv,
1212                                           constantPoolHandle pool, int index,
1213                                           TRAPS) {
1214 
1215   KlassHandle  resolved_klass;
1216   Symbol* method_name = NULL;
1217   Symbol* method_signature = NULL;
1218   KlassHandle  current_klass;
1219   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
1220   KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
1221   resolve_virtual_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
1222 }
1223 
1224 
1225 void LinkResolver::resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS) {
1226   KlassHandle  resolved_klass;
1227   Symbol* method_name = NULL;
1228   Symbol* method_signature = NULL;
1229   KlassHandle  current_klass;
1230   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
1231   KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
1232   resolve_interface_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
1233 }
1234 
1235 
1236 void LinkResolver::resolve_invokehandle(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
1237   assert(EnableInvokeDynamic, "");
1238   // This guy is reached from InterpreterRuntime::resolve_invokehandle.
1239   KlassHandle  resolved_klass;
1240   Symbol* method_name = NULL;
1241   Symbol* method_signature = NULL;
1242   KlassHandle  current_klass;
1243   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
1244   if (TraceMethodHandles) {
1245     ResourceMark rm(THREAD);
1246     tty->print_cr("resolve_invokehandle %s %s", method_name->as_C_string(), method_signature->as_C_string());
1247   }
1248   resolve_handle_call(result, resolved_klass, method_name, method_signature, current_klass, CHECK);
1249 }
1250 
1251 void LinkResolver::resolve_handle_call(CallInfo& result, KlassHandle resolved_klass,
1252                                        Symbol* method_name, Symbol* method_signature,
1253                                        KlassHandle current_klass,
1254                                        TRAPS) {
1255   // JSR 292:  this must be an implicitly generated method MethodHandle.invokeExact(*...) or similar
1256   assert(resolved_klass() == SystemDictionary::MethodHandle_klass(), "");
1257   assert(MethodHandles::is_signature_polymorphic_name(method_name), "");
1258   methodHandle resolved_method;
1259   Handle       resolved_appendix;
1260   Handle       resolved_method_type;
1261   lookup_polymorphic_method(resolved_method, resolved_klass,
1262                             method_name, method_signature,
1263                             current_klass, &resolved_appendix, &resolved_method_type, CHECK);
1264   result.set_handle(resolved_method, resolved_appendix, resolved_method_type, CHECK);
1265 }
1266 
1267 
1268 void LinkResolver::resolve_invokedynamic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
1269   assert(EnableInvokeDynamic, "");
1270 
1271   //resolve_pool(<resolved_klass>, method_name, method_signature, current_klass, pool, index, CHECK);
1272   Symbol* method_name       = pool->name_ref_at(index);
1273   Symbol* method_signature  = pool->signature_ref_at(index);
1274   KlassHandle current_klass = KlassHandle(THREAD, pool->pool_holder());
1275 
1276   // Resolve the bootstrap specifier (BSM + optional arguments).
1277   Handle bootstrap_specifier;
1278   // Check if CallSite has been bound already:
1279   ConstantPoolCacheEntry* cpce = pool->invokedynamic_cp_cache_entry_at(index);
1280   if (cpce->is_f1_null()) {
1281     int pool_index = cpce->constant_pool_index();
1282     oop bsm_info = pool->resolve_bootstrap_specifier_at(pool_index, CHECK);
1283     assert(bsm_info != NULL, "");
1284     // FIXME: Cache this once per BootstrapMethods entry, not once per CONSTANT_InvokeDynamic.
1285     bootstrap_specifier = Handle(THREAD, bsm_info);
1286   }
1287   if (!cpce->is_f1_null()) {
1288     methodHandle method(     THREAD, cpce->f1_as_method());
1289     Handle       appendix(   THREAD, cpce->appendix_if_resolved(pool));
1290     Handle       method_type(THREAD, cpce->method_type_if_resolved(pool));
1291     result.set_handle(method, appendix, method_type, CHECK);
1292     return;
1293   }
1294 
1295   if (TraceMethodHandles) {
1296     tty->print_cr("resolve_invokedynamic #%d %s %s",
1297                   ConstantPool::decode_invokedynamic_index(index),
1298                   method_name->as_C_string(), method_signature->as_C_string());
1299     tty->print("  BSM info: "); bootstrap_specifier->print();
1300   }
1301 
1302   resolve_dynamic_call(result, bootstrap_specifier, method_name, method_signature, current_klass, CHECK);
1303 }
1304 
1305 void LinkResolver::resolve_dynamic_call(CallInfo& result,
1306                                         Handle bootstrap_specifier,
1307                                         Symbol* method_name, Symbol* method_signature,
1308                                         KlassHandle current_klass,
1309                                         TRAPS) {
1310   // JSR 292:  this must resolve to an implicitly generated method MH.linkToCallSite(*...)
1311   // The appendix argument is likely to be a freshly-created CallSite.
1312   Handle       resolved_appendix;
1313   Handle       resolved_method_type;
1314   methodHandle resolved_method =
1315     SystemDictionary::find_dynamic_call_site_invoker(current_klass,
1316                                                      bootstrap_specifier,
1317                                                      method_name, method_signature,
1318                                                      &resolved_appendix,
1319                                                      &resolved_method_type,
1320                                                      THREAD);
1321   if (HAS_PENDING_EXCEPTION) {
1322     if (TraceMethodHandles) {
1323       tty->print_cr("invokedynamic throws BSME for "INTPTR_FORMAT, PENDING_EXCEPTION);
1324       PENDING_EXCEPTION->print();
1325     }
1326     if (PENDING_EXCEPTION->is_a(SystemDictionary::BootstrapMethodError_klass())) {
1327       // throw these guys, since they are already wrapped
1328       return;
1329     }
1330     if (!PENDING_EXCEPTION->is_a(SystemDictionary::LinkageError_klass())) {
1331       // intercept only LinkageErrors which might have failed to wrap
1332       return;
1333     }
1334     // See the "Linking Exceptions" section for the invokedynamic instruction in the JVMS.
1335     Handle nested_exception(THREAD, PENDING_EXCEPTION);
1336     CLEAR_PENDING_EXCEPTION;
1337     THROW_CAUSE(vmSymbols::java_lang_BootstrapMethodError(), nested_exception)
1338   }
1339   result.set_handle(resolved_method, resolved_appendix, resolved_method_type, CHECK);
1340 }
1341 
1342 //------------------------------------------------------------------------------------------------------------------------
1343 #ifndef PRODUCT
1344 
1345 void FieldAccessInfo::print() {
1346   ResourceMark rm;
1347   tty->print_cr("Field %s@%d", name()->as_C_string(), field_offset());
1348 }
1349 
1350 #endif