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