linkResolver.cpp revision 3602:da91efe96a93
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
62void FieldAccessInfo::set(KlassHandle klass, Symbol* name, int field_index, int field_offset,
63BasicType 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
77void 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
83void 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
96void 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
102void 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
116void 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
154void 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
170void 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
175void 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
187void 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
200void 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
210int 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
216void 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
221void 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
316void 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
362void 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
398void 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
490void 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
556void 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
579void 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
583void 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
692void 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
710void 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
729void 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
737void 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
772void 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
828void 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
837void 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
858void 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
937void 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
946void 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
956void 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
1006methodHandle 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
1023methodHandle 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
1040methodHandle 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
1056methodHandle 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
1072int 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
1088methodHandle 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
1103methodHandle 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
1120void 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
1132void 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
1144void 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
1154void 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
1164void 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
1178void 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
1189void 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
1202void 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
1218void 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
1255void 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
1294void FieldAccessInfo::print() {
1295  ResourceMark rm;
1296  tty->print_cr("Field %s@%d", name()->as_C_string(), field_offset());
1297}
1298
1299#endif
1300