linkResolver.cpp revision 6412:53a41e7cbe05
1/*
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#include "precompiled.hpp"
26#include "classfile/defaultMethods.hpp"
27#include "classfile/systemDictionary.hpp"
28#include "classfile/vmSymbols.hpp"
29#include "compiler/compileBroker.hpp"
30#include "gc_interface/collectedHeap.inline.hpp"
31#include "interpreter/bytecode.hpp"
32#include "interpreter/interpreterRuntime.hpp"
33#include "interpreter/linkResolver.hpp"
34#include "memory/resourceArea.hpp"
35#include "memory/universe.inline.hpp"
36#include "oops/instanceKlass.hpp"
37#include "oops/objArrayOop.hpp"
38#include "prims/methodHandles.hpp"
39#include "prims/nativeLookup.hpp"
40#include "runtime/compilationPolicy.hpp"
41#include "runtime/fieldDescriptor.hpp"
42#include "runtime/frame.inline.hpp"
43#include "runtime/handles.inline.hpp"
44#include "runtime/reflection.hpp"
45#include "runtime/signature.hpp"
46#include "runtime/thread.inline.hpp"
47#include "runtime/vmThread.hpp"
48
49
50//------------------------------------------------------------------------------------------------------------------------
51// Implementation of CallInfo
52
53
54void CallInfo::set_static(KlassHandle resolved_klass, methodHandle resolved_method, TRAPS) {
55  int vtable_index = Method::nonvirtual_vtable_index;
56  set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK);
57}
58
59
60void CallInfo::set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int itable_index, TRAPS) {
61  // This is only called for interface methods. If the resolved_method
62  // comes from java/lang/Object, it can be the subject of a virtual call, so
63  // we should pick the vtable index from the resolved method.
64  // In that case, the caller must call set_virtual instead of set_interface.
65  assert(resolved_method->method_holder()->is_interface(), "");
66  assert(itable_index == resolved_method()->itable_index(), "");
67  set_common(resolved_klass, selected_klass, resolved_method, selected_method, CallInfo::itable_call, itable_index, CHECK);
68}
69
70void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
71  assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index, "valid index");
72  assert(vtable_index < 0 || !resolved_method->has_vtable_index() || vtable_index == resolved_method->vtable_index(), "");
73  CallKind kind = (vtable_index >= 0 && !resolved_method->can_be_statically_bound() ? CallInfo::vtable_call : CallInfo::direct_call);
74  set_common(resolved_klass, selected_klass, resolved_method, selected_method, kind, vtable_index, CHECK);
75  assert(!resolved_method->is_compiled_lambda_form(), "these must be handled via an invokehandle call");
76}
77
78void CallInfo::set_handle(methodHandle resolved_method, Handle resolved_appendix, Handle resolved_method_type, TRAPS) {
79  if (resolved_method.is_null()) {
80    THROW_MSG(vmSymbols::java_lang_InternalError(), "resolved method is null");
81  }
82  KlassHandle resolved_klass = SystemDictionary::MethodHandle_klass();
83  assert(resolved_method->intrinsic_id() == vmIntrinsics::_invokeBasic ||
84         resolved_method->is_compiled_lambda_form(),
85         "linkMethod must return one of these");
86  int vtable_index = Method::nonvirtual_vtable_index;
87  assert(!resolved_method->has_vtable_index(), "");
88  set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK);
89  _resolved_appendix    = resolved_appendix;
90  _resolved_method_type = resolved_method_type;
91}
92
93void CallInfo::set_common(KlassHandle resolved_klass,
94                          KlassHandle selected_klass,
95                          methodHandle resolved_method,
96                          methodHandle selected_method,
97                          CallKind kind,
98                          int index,
99                          TRAPS) {
100  assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
101  _resolved_klass  = resolved_klass;
102  _selected_klass  = selected_klass;
103  _resolved_method = resolved_method;
104  _selected_method = selected_method;
105  _call_kind       = kind;
106  _call_index      = index;
107  _resolved_appendix = Handle();
108  DEBUG_ONLY(verify());  // verify before making side effects
109
110  if (CompilationPolicy::must_be_compiled(selected_method)) {
111    // This path is unusual, mostly used by the '-Xcomp' stress test mode.
112
113    // Note: with several active threads, the must_be_compiled may be true
114    //       while can_be_compiled is false; remove assert
115    // assert(CompilationPolicy::can_be_compiled(selected_method), "cannot compile");
116    if (THREAD->is_Compiler_thread()) {
117      // don't force compilation, resolve was on behalf of compiler
118      return;
119    }
120    if (selected_method->method_holder()->is_not_initialized()) {
121      // 'is_not_initialized' means not only '!is_initialized', but also that
122      // initialization has not been started yet ('!being_initialized')
123      // Do not force compilation of methods in uninitialized classes.
124      // Note that doing this would throw an assert later,
125      // in CompileBroker::compile_method.
126      // We sometimes use the link resolver to do reflective lookups
127      // even before classes are initialized.
128      return;
129    }
130    CompileBroker::compile_method(selected_method, InvocationEntryBci,
131                                  CompilationPolicy::policy()->initial_compile_level(),
132                                  methodHandle(), 0, "must_be_compiled", CHECK);
133  }
134}
135
136// utility query for unreflecting a method
137CallInfo::CallInfo(Method* resolved_method, Klass* resolved_klass) {
138  Klass* resolved_method_holder = resolved_method->method_holder();
139  if (resolved_klass == NULL) { // 2nd argument defaults to holder of 1st
140    resolved_klass = resolved_method_holder;
141  }
142  _resolved_klass  = resolved_klass;
143  _selected_klass  = resolved_klass;
144  _resolved_method = resolved_method;
145  _selected_method = resolved_method;
146  // classify:
147  CallKind kind = CallInfo::unknown_kind;
148  int index = resolved_method->vtable_index();
149  if (resolved_method->can_be_statically_bound()) {
150    kind = CallInfo::direct_call;
151  } else if (!resolved_method_holder->is_interface()) {
152    // Could be an Object method inherited into an interface, but still a vtable call.
153    kind = CallInfo::vtable_call;
154  } else if (!resolved_klass->is_interface()) {
155    // A default or miranda method.  Compute the vtable index.
156    ResourceMark rm;
157    klassVtable* vt = InstanceKlass::cast(resolved_klass)->vtable();
158    index = LinkResolver::vtable_index_of_interface_method(resolved_klass,
159                           resolved_method);
160    assert(index >= 0 , "we should have valid vtable index at this point");
161
162    kind = CallInfo::vtable_call;
163  } else if (resolved_method->has_vtable_index()) {
164    // Can occur if an interface redeclares a method of Object.
165
166#ifdef ASSERT
167    // Ensure that this is really the case.
168    KlassHandle object_klass = SystemDictionary::Object_klass();
169    Method * object_resolved_method = object_klass()->vtable()->method_at(index);
170    assert(object_resolved_method->name() == resolved_method->name(),
171      err_msg("Object and interface method names should match at vtable index %d, %s != %s",
172      index, object_resolved_method->name()->as_C_string(), resolved_method->name()->as_C_string()));
173    assert(object_resolved_method->signature() == resolved_method->signature(),
174      err_msg("Object and interface method signatures should match at vtable index %d, %s != %s",
175      index, object_resolved_method->signature()->as_C_string(), resolved_method->signature()->as_C_string()));
176#endif // ASSERT
177
178    kind = CallInfo::vtable_call;
179  } else {
180    // A regular interface call.
181    kind = CallInfo::itable_call;
182    index = resolved_method->itable_index();
183  }
184  assert(index == Method::nonvirtual_vtable_index || index >= 0, err_msg("bad index %d", index));
185  _call_kind  = kind;
186  _call_index = index;
187  _resolved_appendix = Handle();
188  DEBUG_ONLY(verify());
189}
190
191#ifdef ASSERT
192void CallInfo::verify() {
193  switch (call_kind()) {  // the meaning and allowed value of index depends on kind
194  case CallInfo::direct_call:
195    if (_call_index == Method::nonvirtual_vtable_index)  break;
196    // else fall through to check vtable index:
197  case CallInfo::vtable_call:
198    assert(resolved_klass()->verify_vtable_index(_call_index), "");
199    break;
200  case CallInfo::itable_call:
201    assert(resolved_method()->method_holder()->verify_itable_index(_call_index), "");
202    break;
203  case CallInfo::unknown_kind:
204    assert(call_kind() != CallInfo::unknown_kind, "CallInfo must be set");
205    break;
206  default:
207    fatal(err_msg_res("Unexpected call kind %d", call_kind()));
208  }
209}
210#endif //ASSERT
211
212
213
214//------------------------------------------------------------------------------------------------------------------------
215// Klass resolution
216
217void LinkResolver::check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS) {
218  if (!Reflection::verify_class_access(ref_klass(),
219                                       sel_klass(),
220                                       true)) {
221    ResourceMark rm(THREAD);
222    Exceptions::fthrow(
223      THREAD_AND_LOCATION,
224      vmSymbols::java_lang_IllegalAccessError(),
225      "tried to access class %s from class %s",
226      sel_klass->external_name(),
227      ref_klass->external_name()
228    );
229    return;
230  }
231}
232
233void LinkResolver::resolve_klass(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
234  Klass* result_oop = pool->klass_ref_at(index, CHECK);
235  result = KlassHandle(THREAD, result_oop);
236}
237
238//------------------------------------------------------------------------------------------------------------------------
239// Method resolution
240//
241// According to JVM spec. $5.4.3c & $5.4.3d
242
243// Look up method in klasses, including static methods
244// Then look up local default methods
245void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, bool checkpolymorphism, bool in_imethod_resolve, TRAPS) {
246  // Ignore overpasses so statics can be found during resolution
247  Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::skip_overpass);
248
249  // JDK 8, JVMS 5.4.3.4: Interface method resolution should
250  // ignore static and non-public methods of java.lang.Object,
251  // like clone, finalize, registerNatives.
252  if (in_imethod_resolve &&
253      result_oop != NULL &&
254      klass->is_interface() &&
255      (result_oop->is_static() || !result_oop->is_public()) &&
256      result_oop->method_holder() == SystemDictionary::Object_klass()) {
257    result_oop = NULL;
258  }
259
260  // Before considering default methods, check for an overpass in the
261  // current class if a method has not been found.
262  if (result_oop == NULL) {
263    result_oop = InstanceKlass::cast(klass())->find_method(name, signature);
264  }
265
266  if (result_oop == NULL) {
267    Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
268    if (default_methods != NULL) {
269      result_oop = InstanceKlass::find_method(default_methods, name, signature);
270    }
271  }
272
273  if (checkpolymorphism && result_oop != NULL) {
274    vmIntrinsics::ID iid = result_oop->intrinsic_id();
275    if (MethodHandles::is_signature_polymorphic(iid)) {
276      // Do not link directly to these.  The VM must produce a synthetic one using lookup_polymorphic_method.
277      return;
278    }
279  }
280  result = methodHandle(THREAD, result_oop);
281}
282
283// returns first instance method
284// Looks up method in classes, then looks up local default methods
285void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
286  Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::normal);
287  result = methodHandle(THREAD, result_oop);
288  while (!result.is_null() && result->is_static() && result->method_holder()->super() != NULL) {
289    KlassHandle super_klass = KlassHandle(THREAD, result->method_holder()->super());
290    result = methodHandle(THREAD, super_klass->uncached_lookup_method(name, signature, Klass::normal));
291  }
292
293  if (result.is_null()) {
294    Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
295    if (default_methods != NULL) {
296      result = methodHandle(InstanceKlass::find_method(default_methods, name, signature));
297      assert(result.is_null() || !result->is_static(), "static defaults not allowed");
298    }
299  }
300}
301
302int LinkResolver::vtable_index_of_interface_method(KlassHandle klass,
303                                          methodHandle resolved_method) {
304
305  int vtable_index = Method::invalid_vtable_index;
306  Symbol* name = resolved_method->name();
307  Symbol* signature = resolved_method->signature();
308
309  // First check in default method array
310  if (!resolved_method->is_abstract() &&
311    (InstanceKlass::cast(klass())->default_methods() != NULL)) {
312    int index = InstanceKlass::find_method_index(InstanceKlass::cast(klass())->default_methods(), name, signature, false);
313    if (index >= 0 ) {
314      vtable_index = InstanceKlass::cast(klass())->default_vtable_indices()->at(index);
315    }
316  }
317  if (vtable_index == Method::invalid_vtable_index) {
318    // get vtable_index for miranda methods
319    ResourceMark rm;
320    klassVtable *vt = InstanceKlass::cast(klass())->vtable();
321    vtable_index = vt->index_of_miranda(name, signature);
322  }
323  return vtable_index;
324}
325
326void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
327  InstanceKlass *ik = InstanceKlass::cast(klass());
328
329  // Specify 'true' in order to skip default methods when searching the
330  // interfaces.  Function lookup_method_in_klasses() already looked for
331  // the method in the default methods table.
332  result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature, Klass::skip_defaults));
333}
334
335void LinkResolver::lookup_polymorphic_method(methodHandle& result,
336                                             KlassHandle klass, Symbol* name, Symbol* full_signature,
337                                             KlassHandle current_klass,
338                                             Handle *appendix_result_or_null,
339                                             Handle *method_type_result,
340                                             TRAPS) {
341  vmIntrinsics::ID iid = MethodHandles::signature_polymorphic_name_id(name);
342  if (TraceMethodHandles) {
343    ResourceMark rm(THREAD);
344    tty->print_cr("lookup_polymorphic_method iid=%s %s.%s%s",
345                  vmIntrinsics::name_at(iid), klass->external_name(),
346                  name->as_C_string(), full_signature->as_C_string());
347  }
348  if (klass() == SystemDictionary::MethodHandle_klass() &&
349      iid != vmIntrinsics::_none) {
350    if (MethodHandles::is_signature_polymorphic_intrinsic(iid)) {
351      // Most of these do not need an up-call to Java to resolve, so can be done anywhere.
352      // Do not erase last argument type (MemberName) if it is a static linkTo method.
353      bool keep_last_arg = MethodHandles::is_signature_polymorphic_static(iid);
354      TempNewSymbol basic_signature =
355        MethodHandles::lookup_basic_type_signature(full_signature, keep_last_arg, CHECK);
356      if (TraceMethodHandles) {
357        ResourceMark rm(THREAD);
358        tty->print_cr("lookup_polymorphic_method %s %s => basic %s",
359                      name->as_C_string(),
360                      full_signature->as_C_string(),
361                      basic_signature->as_C_string());
362      }
363      result = SystemDictionary::find_method_handle_intrinsic(iid,
364                                                              basic_signature,
365                                                              CHECK);
366      if (result.not_null()) {
367        assert(result->is_method_handle_intrinsic(), "MH.invokeBasic or MH.linkTo* intrinsic");
368        assert(result->intrinsic_id() != vmIntrinsics::_invokeGeneric, "wrong place to find this");
369        assert(basic_signature == result->signature(), "predict the result signature");
370        if (TraceMethodHandles) {
371          tty->print("lookup_polymorphic_method => intrinsic ");
372          result->print_on(tty);
373        }
374        return;
375      }
376    } else if (iid == vmIntrinsics::_invokeGeneric
377               && !THREAD->is_Compiler_thread()
378               && appendix_result_or_null != NULL) {
379      // This is a method with type-checking semantics.
380      // We will ask Java code to spin an adapter method for it.
381      if (!MethodHandles::enabled()) {
382        // Make sure the Java part of the runtime has been booted up.
383        Klass* natives = SystemDictionary::MethodHandleNatives_klass();
384        if (natives == NULL || InstanceKlass::cast(natives)->is_not_initialized()) {
385          SystemDictionary::resolve_or_fail(vmSymbols::java_lang_invoke_MethodHandleNatives(),
386                                            Handle(),
387                                            Handle(),
388                                            true,
389                                            CHECK);
390        }
391      }
392
393      Handle appendix;
394      Handle method_type;
395      result = SystemDictionary::find_method_handle_invoker(name,
396                                                            full_signature,
397                                                            current_klass,
398                                                            &appendix,
399                                                            &method_type,
400                                                            CHECK);
401      if (TraceMethodHandles) {
402        tty->print("lookup_polymorphic_method => (via Java) ");
403        result->print_on(tty);
404        tty->print("  lookup_polymorphic_method => appendix = ");
405        if (appendix.is_null())  tty->print_cr("(none)");
406        else                     appendix->print_on(tty);
407      }
408      if (result.not_null()) {
409#ifdef ASSERT
410        ResourceMark rm(THREAD);
411
412        TempNewSymbol basic_signature =
413          MethodHandles::lookup_basic_type_signature(full_signature, CHECK);
414        int actual_size_of_params = result->size_of_parameters();
415        int expected_size_of_params = ArgumentSizeComputer(basic_signature).size();
416        // +1 for MethodHandle.this, +1 for trailing MethodType
417        if (!MethodHandles::is_signature_polymorphic_static(iid))  expected_size_of_params += 1;
418        if (appendix.not_null())                                   expected_size_of_params += 1;
419        if (actual_size_of_params != expected_size_of_params) {
420          tty->print_cr("*** basic_signature=%s", basic_signature->as_C_string());
421          tty->print_cr("*** result for %s: ", vmIntrinsics::name_at(iid));
422          result->print();
423        }
424        assert(actual_size_of_params == expected_size_of_params,
425               err_msg("%d != %d", actual_size_of_params, expected_size_of_params));
426#endif //ASSERT
427
428        assert(appendix_result_or_null != NULL, "");
429        (*appendix_result_or_null) = appendix;
430        (*method_type_result)      = method_type;
431        return;
432      }
433    }
434  }
435}
436
437void LinkResolver::check_method_accessability(KlassHandle ref_klass,
438                                              KlassHandle resolved_klass,
439                                              KlassHandle sel_klass,
440                                              methodHandle sel_method,
441                                              TRAPS) {
442
443  AccessFlags flags = sel_method->access_flags();
444
445  // Special case:  arrays always override "clone". JVMS 2.15.
446  // If the resolved klass is an array class, and the declaring class
447  // is java.lang.Object and the method is "clone", set the flags
448  // to public.
449  //
450  // We'll check for the method name first, as that's most likely
451  // to be false (so we'll short-circuit out of these tests).
452  if (sel_method->name() == vmSymbols::clone_name() &&
453      sel_klass() == SystemDictionary::Object_klass() &&
454      resolved_klass->oop_is_array()) {
455    // We need to change "protected" to "public".
456    assert(flags.is_protected(), "clone not protected?");
457    jint new_flags = flags.as_int();
458    new_flags = new_flags & (~JVM_ACC_PROTECTED);
459    new_flags = new_flags | JVM_ACC_PUBLIC;
460    flags.set_flags(new_flags);
461  }
462//  assert(extra_arg_result_or_null != NULL, "must be able to return extra argument");
463
464  if (!Reflection::verify_field_access(ref_klass(),
465                                       resolved_klass(),
466                                       sel_klass(),
467                                       flags,
468                                       true)) {
469    ResourceMark rm(THREAD);
470    Exceptions::fthrow(
471      THREAD_AND_LOCATION,
472      vmSymbols::java_lang_IllegalAccessError(),
473      "tried to access method %s.%s%s from class %s",
474      sel_klass->external_name(),
475      sel_method->name()->as_C_string(),
476      sel_method->signature()->as_C_string(),
477      ref_klass->external_name()
478    );
479    return;
480  }
481}
482
483void LinkResolver::resolve_method_statically(methodHandle& resolved_method, KlassHandle& resolved_klass,
484                                             Bytecodes::Code code, constantPoolHandle pool, int index, TRAPS) {
485  // This method is used only
486  // (1) in C2 from InlineTree::ok_to_inline (via ciMethod::check_call),
487  // and
488  // (2) in Bytecode_invoke::static_target
489  // It appears to fail when applied to an invokeinterface call site.
490  // FIXME: Remove this method and ciMethod::check_call; refactor to use the other LinkResolver entry points.
491  // resolve klass
492  if (code == Bytecodes::_invokedynamic) {
493    resolved_klass = SystemDictionary::MethodHandle_klass();
494    Symbol* method_name = vmSymbols::invoke_name();
495    Symbol* method_signature = pool->signature_ref_at(index);
496    KlassHandle  current_klass(THREAD, pool->pool_holder());
497    resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, false, CHECK);
498    return;
499  }
500
501  resolve_klass(resolved_klass, pool, index, CHECK);
502
503  Symbol*  method_name       = pool->name_ref_at(index);
504  Symbol*  method_signature  = pool->signature_ref_at(index);
505  KlassHandle  current_klass(THREAD, pool->pool_holder());
506
507  if (pool->has_preresolution()
508      || (resolved_klass() == SystemDictionary::MethodHandle_klass() &&
509          MethodHandles::is_signature_polymorphic_name(resolved_klass(), method_name))) {
510    Method* result_oop = ConstantPool::method_at_if_loaded(pool, index);
511    if (result_oop != NULL) {
512      resolved_method = methodHandle(THREAD, result_oop);
513      return;
514    }
515  }
516
517  if (code == Bytecodes::_invokeinterface) {
518    resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
519  } else if (code == Bytecodes::_invokevirtual) {
520    resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
521  } else if (!resolved_klass->is_interface()) {
522    resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, false, CHECK);
523  } else {
524    bool nostatics = (code == Bytecodes::_invokestatic) ? false : true;
525    resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, nostatics, CHECK);
526  }
527}
528
529void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
530                                  Symbol* method_name, Symbol* method_signature,
531                                  KlassHandle current_klass, bool check_access,
532                                  bool require_methodref, TRAPS) {
533
534  Handle nested_exception;
535
536  // 1. check if methodref required, that resolved_klass is not interfacemethodref
537  if (require_methodref && resolved_klass->is_interface()) {
538    ResourceMark rm(THREAD);
539    char buf[200];
540    jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected",
541        resolved_klass()->external_name());
542    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
543  }
544
545  // 2. lookup method in resolved klass and its super klasses
546  lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, true, false, CHECK);
547
548  if (resolved_method.is_null()) { // not found in the class hierarchy
549    // 3. lookup method in all the interfaces implemented by the resolved klass
550    lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
551
552    if (resolved_method.is_null()) {
553      // JSR 292:  see if this is an implicitly generated method MethodHandle.linkToVirtual(*...), etc
554      lookup_polymorphic_method(resolved_method, resolved_klass, method_name, method_signature,
555                                current_klass, (Handle*)NULL, (Handle*)NULL, THREAD);
556      if (HAS_PENDING_EXCEPTION) {
557        nested_exception = Handle(THREAD, PENDING_EXCEPTION);
558        CLEAR_PENDING_EXCEPTION;
559      }
560    }
561
562    if (resolved_method.is_null()) {
563      // 4. method lookup failed
564      ResourceMark rm(THREAD);
565      THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(),
566                      Method::name_and_sig_as_C_string(resolved_klass(),
567                                                              method_name,
568                                                              method_signature),
569                      nested_exception);
570    }
571  }
572
573  // 5. access checks, access checking may be turned off when calling from within the VM.
574  if (check_access) {
575    assert(current_klass.not_null() , "current_klass should not be null");
576
577    // check if method can be accessed by the referring class
578    check_method_accessability(current_klass,
579                               resolved_klass,
580                               KlassHandle(THREAD, resolved_method->method_holder()),
581                               resolved_method,
582                               CHECK);
583
584    // check loader constraints
585    Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
586    Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
587    {
588      ResourceMark rm(THREAD);
589      Symbol* failed_type_symbol =
590        SystemDictionary::check_signature_loaders(method_signature, loader,
591                                                  class_loader, true, CHECK);
592      if (failed_type_symbol != NULL) {
593        const char* msg = "loader constraint violation: when resolving method"
594          " \"%s\" the class loader (instance of %s) of the current class, %s,"
595          " and the class loader (instance of %s) for the method's defining class, %s, have"
596          " different Class objects for the type %s used in the signature";
597        char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
598        const char* loader1 = SystemDictionary::loader_name(loader());
599        char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
600        const char* loader2 = SystemDictionary::loader_name(class_loader());
601        char* target = InstanceKlass::cast(resolved_method->method_holder())
602                       ->name()->as_C_string();
603        char* failed_type_name = failed_type_symbol->as_C_string();
604        size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
605          strlen(current) + strlen(loader2) + strlen(target) +
606          strlen(failed_type_name) + 1;
607        char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
608        jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
609                     target, failed_type_name);
610        THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
611      }
612    }
613  }
614}
615
616void LinkResolver::resolve_interface_method(methodHandle& resolved_method,
617                                            KlassHandle resolved_klass,
618                                            Symbol* method_name,
619                                            Symbol* method_signature,
620                                            KlassHandle current_klass,
621                                            bool check_access,
622                                            bool nostatics, TRAPS) {
623
624  // check if klass is interface
625  if (!resolved_klass->is_interface()) {
626    ResourceMark rm(THREAD);
627    char buf[200];
628    jio_snprintf(buf, sizeof(buf), "Found class %s, but interface was expected", resolved_klass()->external_name());
629    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
630  }
631
632  // lookup method in this interface or its super, java.lang.Object
633  // JDK8: also look for static methods
634  lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, false, true, CHECK);
635
636  if (resolved_method.is_null()) {
637    // lookup method in all the super-interfaces
638    lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
639    if (resolved_method.is_null()) {
640      // no method found
641      ResourceMark rm(THREAD);
642      THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(),
643                Method::name_and_sig_as_C_string(resolved_klass(),
644                                                        method_name,
645                                                        method_signature));
646    }
647  }
648
649  if (check_access) {
650    // JDK8 adds non-public interface methods, and accessability check requirement
651    assert(current_klass.not_null() , "current_klass should not be null");
652
653    // check if method can be accessed by the referring class
654    check_method_accessability(current_klass,
655                               resolved_klass,
656                               KlassHandle(THREAD, resolved_method->method_holder()),
657                               resolved_method,
658                               CHECK);
659
660    HandleMark hm(THREAD);
661    Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
662    Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
663    {
664      ResourceMark rm(THREAD);
665      Symbol* failed_type_symbol =
666        SystemDictionary::check_signature_loaders(method_signature, loader,
667                                                  class_loader, true, CHECK);
668      if (failed_type_symbol != NULL) {
669        const char* msg = "loader constraint violation: when resolving "
670          "interface method \"%s\" the class loader (instance of %s) of the "
671          "current class, %s, and the class loader (instance of %s) for "
672          "the method's defining class, %s, have different Class objects for the type %s "
673          "used in the signature";
674        char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
675        const char* loader1 = SystemDictionary::loader_name(loader());
676        char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
677        const char* loader2 = SystemDictionary::loader_name(class_loader());
678        char* target = InstanceKlass::cast(resolved_method->method_holder())
679                       ->name()->as_C_string();
680        char* failed_type_name = failed_type_symbol->as_C_string();
681        size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
682          strlen(current) + strlen(loader2) + strlen(target) +
683          strlen(failed_type_name) + 1;
684        char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
685        jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
686                     target, failed_type_name);
687        THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
688      }
689    }
690  }
691
692  if (nostatics && resolved_method->is_static()) {
693    ResourceMark rm(THREAD);
694    char buf[200];
695    jio_snprintf(buf, sizeof(buf), "Expected instance not static method %s",
696                 Method::name_and_sig_as_C_string(resolved_klass(),
697                 resolved_method->name(), resolved_method->signature()));
698    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
699  }
700
701  if (TraceItables && Verbose) {
702    ResourceMark rm(THREAD);
703    tty->print("invokeinterface resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
704                   (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
705                   (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
706                   Method::name_and_sig_as_C_string(resolved_klass(),
707                                                    resolved_method->name(),
708                                                    resolved_method->signature()),
709                   resolved_method->method_holder()->internal_name()
710                  );
711    resolved_method->access_flags().print_on(tty);
712    if (resolved_method->is_default_method()) {
713      tty->print("default ");
714    }
715    if (resolved_method->is_overpass()) {
716      tty->print("overpass");
717    }
718    tty->cr();
719  }
720}
721
722//------------------------------------------------------------------------------------------------------------------------
723// Field resolution
724
725void LinkResolver::check_field_accessability(KlassHandle ref_klass,
726                                             KlassHandle resolved_klass,
727                                             KlassHandle sel_klass,
728                                             fieldDescriptor& fd,
729                                             TRAPS) {
730  if (!Reflection::verify_field_access(ref_klass(),
731                                       resolved_klass(),
732                                       sel_klass(),
733                                       fd.access_flags(),
734                                       true)) {
735    ResourceMark rm(THREAD);
736    Exceptions::fthrow(
737      THREAD_AND_LOCATION,
738      vmSymbols::java_lang_IllegalAccessError(),
739      "tried to access field %s.%s from class %s",
740      sel_klass->external_name(),
741      fd.name()->as_C_string(),
742      ref_klass->external_name()
743    );
744    return;
745  }
746}
747
748void LinkResolver::resolve_field_access(fieldDescriptor& result, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
749  // Load these early in case the resolve of the containing klass fails
750  Symbol* field = pool->name_ref_at(index);
751  Symbol* sig   = pool->signature_ref_at(index);
752
753  // resolve specified klass
754  KlassHandle resolved_klass;
755  resolve_klass(resolved_klass, pool, index, CHECK);
756
757  KlassHandle  current_klass(THREAD, pool->pool_holder());
758  resolve_field(result, resolved_klass, field, sig, current_klass, byte, true, true, CHECK);
759}
760
761void LinkResolver::resolve_field(fieldDescriptor& fd, KlassHandle resolved_klass, Symbol* field, Symbol* sig,
762                                 KlassHandle current_klass, Bytecodes::Code byte, bool check_access, bool initialize_class,
763                                 TRAPS) {
764  assert(byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic ||
765         byte == Bytecodes::_getfield  || byte == Bytecodes::_putfield  ||
766         (byte == Bytecodes::_nop && !check_access), "bad field access bytecode");
767
768  bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
769  bool is_put    = (byte == Bytecodes::_putfield  || byte == Bytecodes::_putstatic);
770
771  // Check if there's a resolved klass containing the field
772  if (resolved_klass.is_null()) {
773    ResourceMark rm(THREAD);
774    THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
775  }
776
777  // Resolve instance field
778  KlassHandle sel_klass(THREAD, InstanceKlass::cast(resolved_klass())->find_field(field, sig, &fd));
779  // check if field exists; i.e., if a klass containing the field def has been selected
780  if (sel_klass.is_null()) {
781    ResourceMark rm(THREAD);
782    THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
783  }
784
785  if (!check_access)
786    // Access checking may be turned off when calling from within the VM.
787    return;
788
789  // check access
790  check_field_accessability(current_klass, resolved_klass, sel_klass, fd, CHECK);
791
792  // check for errors
793  if (is_static != fd.is_static()) {
794    ResourceMark rm(THREAD);
795    char msg[200];
796    jio_snprintf(msg, sizeof(msg), "Expected %s field %s.%s", is_static ? "static" : "non-static", resolved_klass()->external_name(), fd.name()->as_C_string());
797    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), msg);
798  }
799
800  // Final fields can only be accessed from its own class.
801  if (is_put && fd.access_flags().is_final() && sel_klass() != current_klass()) {
802    THROW(vmSymbols::java_lang_IllegalAccessError());
803  }
804
805  // initialize resolved_klass if necessary
806  // note 1: the klass which declared the field must be initialized (i.e, sel_klass)
807  //         according to the newest JVM spec (5.5, p.170) - was bug (gri 7/28/99)
808  //
809  // note 2: we don't want to force initialization if we are just checking
810  //         if the field access is legal; e.g., during compilation
811  if (is_static && initialize_class) {
812    sel_klass->initialize(CHECK);
813  }
814
815  if (sel_klass() != current_klass()) {
816    HandleMark hm(THREAD);
817    Handle ref_loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
818    Handle sel_loader (THREAD, InstanceKlass::cast(sel_klass())->class_loader());
819    {
820      ResourceMark rm(THREAD);
821      Symbol* failed_type_symbol =
822        SystemDictionary::check_signature_loaders(sig,
823                                                  ref_loader, sel_loader,
824                                                  false,
825                                                  CHECK);
826      if (failed_type_symbol != NULL) {
827        const char* msg = "loader constraint violation: when resolving field"
828          " \"%s\" the class loader (instance of %s) of the referring class, "
829          "%s, and the class loader (instance of %s) for the field's resolved "
830          "type, %s, have different Class objects for that type";
831        char* field_name = field->as_C_string();
832        const char* loader1 = SystemDictionary::loader_name(ref_loader());
833        char* sel = InstanceKlass::cast(sel_klass())->name()->as_C_string();
834        const char* loader2 = SystemDictionary::loader_name(sel_loader());
835        char* failed_type_name = failed_type_symbol->as_C_string();
836        size_t buflen = strlen(msg) + strlen(field_name) + strlen(loader1) +
837          strlen(sel) + strlen(loader2) + strlen(failed_type_name) + 1;
838        char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
839        jio_snprintf(buf, buflen, msg, field_name, loader1, sel, loader2,
840                     failed_type_name);
841        THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
842      }
843    }
844  }
845
846  // return information. note that the klass is set to the actual klass containing the
847  // field, otherwise access of static fields in superclasses will not work.
848}
849
850
851//------------------------------------------------------------------------------------------------------------------------
852// Invoke resolution
853//
854// Naming conventions:
855//
856// resolved_method    the specified method (i.e., static receiver specified via constant pool index)
857// sel_method         the selected method  (selected via run-time lookup; e.g., based on dynamic receiver class)
858// resolved_klass     the specified klass  (i.e., specified via constant pool index)
859// recv_klass         the receiver klass
860
861
862void LinkResolver::resolve_static_call(CallInfo& result, KlassHandle& resolved_klass, Symbol* method_name,
863                                       Symbol* method_signature, KlassHandle current_klass,
864                                       bool check_access, bool initialize_class, TRAPS) {
865  methodHandle resolved_method;
866  linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
867  resolved_klass = KlassHandle(THREAD, resolved_method->method_holder());
868
869  // Initialize klass (this should only happen if everything is ok)
870  if (initialize_class && resolved_klass->should_be_initialized()) {
871    resolved_klass->initialize(CHECK);
872    linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
873  }
874
875  // setup result
876  result.set_static(resolved_klass, resolved_method, CHECK);
877}
878
879// throws linktime exceptions
880void LinkResolver::linktime_resolve_static_method(methodHandle& resolved_method, KlassHandle resolved_klass,
881                                                  Symbol* method_name, Symbol* method_signature,
882                                                  KlassHandle current_klass, bool check_access, TRAPS) {
883
884  if (!resolved_klass->is_interface()) {
885    resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
886  } else {
887    resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
888  }
889  assert(resolved_method->name() != vmSymbols::class_initializer_name(), "should have been checked in verifier");
890
891  // check if static
892  if (!resolved_method->is_static()) {
893    ResourceMark rm(THREAD);
894    char buf[200];
895    jio_snprintf(buf, sizeof(buf), "Expected static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
896                                                      resolved_method->name(),
897                                                      resolved_method->signature()));
898    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
899  }
900}
901
902
903void LinkResolver::resolve_special_call(CallInfo& result, KlassHandle resolved_klass, Symbol* method_name,
904                                        Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
905  methodHandle resolved_method;
906  linktime_resolve_special_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
907  runtime_resolve_special_method(result, resolved_method, resolved_klass, current_klass, check_access, CHECK);
908}
909
910// throws linktime exceptions
911void LinkResolver::linktime_resolve_special_method(methodHandle& resolved_method, KlassHandle resolved_klass,
912                                                   Symbol* method_name, Symbol* method_signature,
913                                                   KlassHandle current_klass, bool check_access, TRAPS) {
914
915  // Invokespecial is called for multiple special reasons:
916  // <init>
917  // local private method invocation, for classes and interfaces
918  // superclass.method, which can also resolve to a default method
919  // and the selected method is recalculated relative to the direct superclass
920  // superinterface.method, which explicitly does not check shadowing
921
922  if (!resolved_klass->is_interface()) {
923    resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
924  } else {
925    resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
926  }
927
928  // check if method name is <init>, that it is found in same klass as static type
929  if (resolved_method->name() == vmSymbols::object_initializer_name() &&
930      resolved_method->method_holder() != resolved_klass()) {
931    ResourceMark rm(THREAD);
932    Exceptions::fthrow(
933      THREAD_AND_LOCATION,
934      vmSymbols::java_lang_NoSuchMethodError(),
935      "%s: method %s%s not found",
936      resolved_klass->external_name(),
937      resolved_method->name()->as_C_string(),
938      resolved_method->signature()->as_C_string()
939    );
940    return;
941  }
942
943  // check if invokespecial's interface method reference is in an indirect superinterface
944  if (!current_klass.is_null() && resolved_klass->is_interface()) {
945    Klass *klass_to_check = !InstanceKlass::cast(current_klass())->is_anonymous() ?
946                                  current_klass() :
947                                  InstanceKlass::cast(current_klass())->host_klass();
948    // As of the fix for 4486457 we disable verification for all of the
949    // dynamically-generated bytecodes associated with the 1.4
950    // reflection implementation, not just those associated with
951    // sun/reflect/SerializationConstructorAccessor.
952    bool is_reflect = JDK_Version::is_gte_jdk14x_version() &&
953                      UseNewReflection &&
954                      klass_to_check->is_subclass_of(
955                        SystemDictionary::reflect_MagicAccessorImpl_klass());
956
957    if (!is_reflect &&
958        !InstanceKlass::cast(klass_to_check)->is_same_or_direct_interface(resolved_klass())) {
959      ResourceMark rm(THREAD);
960      char buf[200];
961      jio_snprintf(buf, sizeof(buf),
962                   "Interface method reference: %s, is in an indirect superinterface of %s",
963                   Method::name_and_sig_as_C_string(resolved_klass(),
964                                                         resolved_method->name(),
965                                                         resolved_method->signature()),
966                   current_klass->external_name());
967      THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
968    }
969  }
970
971  // check if not static
972  if (resolved_method->is_static()) {
973    ResourceMark rm(THREAD);
974    char buf[200];
975    jio_snprintf(buf, sizeof(buf),
976                 "Expecting non-static method %s",
977                 Method::name_and_sig_as_C_string(resolved_klass(),
978                                                         resolved_method->name(),
979                                                         resolved_method->signature()));
980    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
981  }
982
983  if (TraceItables && Verbose) {
984    ResourceMark rm(THREAD);
985    tty->print("invokespecial resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
986                (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
987                (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
988                Method::name_and_sig_as_C_string(resolved_klass(),
989                                                 resolved_method->name(),
990                                                 resolved_method->signature()),
991                resolved_method->method_holder()->internal_name()
992               );
993    resolved_method->access_flags().print_on(tty);
994    if (resolved_method->is_default_method()) {
995      tty->print("default ");
996    }
997    if (resolved_method->is_overpass()) {
998      tty->print("overpass");
999    }
1000    tty->cr();
1001  }
1002}
1003
1004// throws runtime exceptions
1005void LinkResolver::runtime_resolve_special_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
1006                                                  KlassHandle current_klass, bool check_access, TRAPS) {
1007
1008  // resolved method is selected method unless we have an old-style lookup
1009  // for a superclass method
1010  // Invokespecial for a superinterface, resolved method is selected method,
1011  // no checks for shadowing
1012  methodHandle sel_method(THREAD, resolved_method());
1013
1014  // check if this is an old-style super call and do a new lookup if so
1015  { KlassHandle method_klass  = KlassHandle(THREAD,
1016                                            resolved_method->method_holder());
1017
1018    if (check_access &&
1019        // a) check if ACC_SUPER flag is set for the current class
1020        (current_klass->is_super() || !AllowNonVirtualCalls) &&
1021        // b) check if the class of the resolved_klass is a superclass
1022        // (not supertype in order to exclude interface classes) of the current class.
1023        // This check is not performed for super.invoke for interface methods
1024        // in super interfaces.
1025        current_klass->is_subclass_of(resolved_klass()) &&
1026        current_klass() != resolved_klass() &&
1027        // c) check if the method is not <init>
1028        resolved_method->name() != vmSymbols::object_initializer_name()) {
1029      // Lookup super method
1030      KlassHandle super_klass(THREAD, current_klass->super());
1031      lookup_instance_method_in_klasses(sel_method, super_klass,
1032                           resolved_method->name(),
1033                           resolved_method->signature(), CHECK);
1034      // check if found
1035      if (sel_method.is_null()) {
1036        ResourceMark rm(THREAD);
1037        THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
1038                  Method::name_and_sig_as_C_string(resolved_klass(),
1039                                            resolved_method->name(),
1040                                            resolved_method->signature()));
1041      }
1042    }
1043  }
1044
1045  // check if not static
1046  if (sel_method->is_static()) {
1047    ResourceMark rm(THREAD);
1048    char buf[200];
1049    jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
1050                                                                                                             resolved_method->name(),
1051                                                                                                             resolved_method->signature()));
1052    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
1053  }
1054
1055  // check if abstract
1056  if (sel_method->is_abstract()) {
1057    ResourceMark rm(THREAD);
1058    THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
1059              Method::name_and_sig_as_C_string(resolved_klass(),
1060                                                      sel_method->name(),
1061                                                      sel_method->signature()));
1062  }
1063
1064  if (TraceItables && Verbose) {
1065    ResourceMark rm(THREAD);
1066    tty->print("invokespecial selected method: resolved-class:%s, method:%s, method_holder:%s, access_flags: ",
1067                 (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
1068                 Method::name_and_sig_as_C_string(resolved_klass(),
1069                                                  sel_method->name(),
1070                                                  sel_method->signature()),
1071                 sel_method->method_holder()->internal_name()
1072                );
1073    sel_method->access_flags().print_on(tty);
1074    if (sel_method->is_default_method()) {
1075      tty->print("default ");
1076    }
1077    if (sel_method->is_overpass()) {
1078      tty->print("overpass");
1079    }
1080    tty->cr();
1081  }
1082
1083  // setup result
1084  result.set_static(resolved_klass, sel_method, CHECK);
1085}
1086
1087void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, KlassHandle receiver_klass, KlassHandle resolved_klass,
1088                                        Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
1089                                        bool check_access, bool check_null_and_abstract, TRAPS) {
1090  methodHandle resolved_method;
1091  linktime_resolve_virtual_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
1092  runtime_resolve_virtual_method(result, resolved_method, resolved_klass, recv, receiver_klass, check_null_and_abstract, CHECK);
1093}
1094
1095// throws linktime exceptions
1096void LinkResolver::linktime_resolve_virtual_method(methodHandle &resolved_method, KlassHandle resolved_klass,
1097                                                   Symbol* method_name, Symbol* method_signature,
1098                                                   KlassHandle current_klass, bool check_access, TRAPS) {
1099  // normal method resolution
1100  resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
1101
1102  assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
1103  assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
1104
1105  // check if private interface method
1106  if (resolved_klass->is_interface() && resolved_method->is_private()) {
1107    ResourceMark rm(THREAD);
1108    char buf[200];
1109    jio_snprintf(buf, sizeof(buf), "private interface method requires invokespecial, not invokevirtual: method %s, caller-class:%s",
1110                 Method::name_and_sig_as_C_string(resolved_klass(),
1111                                                  resolved_method->name(),
1112                                                  resolved_method->signature()),
1113                   (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()));
1114    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
1115  }
1116
1117  // check if not static
1118  if (resolved_method->is_static()) {
1119    ResourceMark rm(THREAD);
1120    char buf[200];
1121    jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
1122                                                                                                             resolved_method->name(),
1123                                                                                                             resolved_method->signature()));
1124    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
1125  }
1126
1127  if (PrintVtables && Verbose) {
1128    ResourceMark rm(THREAD);
1129    tty->print("invokevirtual resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
1130                   (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
1131                   (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
1132                   Method::name_and_sig_as_C_string(resolved_klass(),
1133                                                    resolved_method->name(),
1134                                                    resolved_method->signature()),
1135                   resolved_method->method_holder()->internal_name()
1136                  );
1137    resolved_method->access_flags().print_on(tty);
1138    if (resolved_method->is_default_method()) {
1139      tty->print("default ");
1140    }
1141    if (resolved_method->is_overpass()) {
1142      tty->print("overpass");
1143    }
1144    tty->cr();
1145  }
1146}
1147
1148// throws runtime exceptions
1149void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
1150                                                  methodHandle resolved_method,
1151                                                  KlassHandle resolved_klass,
1152                                                  Handle recv,
1153                                                  KlassHandle recv_klass,
1154                                                  bool check_null_and_abstract,
1155                                                  TRAPS) {
1156
1157  // setup default return values
1158  int vtable_index = Method::invalid_vtable_index;
1159  methodHandle selected_method;
1160
1161  assert(recv.is_null() || recv->is_oop(), "receiver is not an oop");
1162
1163  // runtime method resolution
1164  if (check_null_and_abstract && recv.is_null()) { // check if receiver exists
1165    THROW(vmSymbols::java_lang_NullPointerException());
1166  }
1167
1168  // Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s
1169  // has not been rewritten, and the vtable initialized. Make sure to do this after the nullcheck, since
1170  // a missing receiver might result in a bogus lookup.
1171  assert(resolved_method->method_holder()->is_linked(), "must be linked");
1172
1173  // do lookup based on receiver klass using the vtable index
1174  if (resolved_method->method_holder()->is_interface()) { // miranda method
1175    vtable_index = vtable_index_of_interface_method(resolved_klass,
1176                           resolved_method);
1177    assert(vtable_index >= 0 , "we should have valid vtable index at this point");
1178
1179    InstanceKlass* inst = InstanceKlass::cast(recv_klass());
1180    selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
1181  } else {
1182    // at this point we are sure that resolved_method is virtual and not
1183    // a miranda method; therefore, it must have a valid vtable index.
1184    assert(!resolved_method->has_itable_index(), "");
1185    vtable_index = resolved_method->vtable_index();
1186    // We could get a negative vtable_index for final methods,
1187    // because as an optimization they are they are never put in the vtable,
1188    // unless they override an existing method.
1189    // If we do get a negative, it means the resolved method is the the selected
1190    // method, and it can never be changed by an override.
1191    if (vtable_index == Method::nonvirtual_vtable_index) {
1192      assert(resolved_method->can_be_statically_bound(), "cannot override this method");
1193      selected_method = resolved_method;
1194    } else {
1195      // recv_klass might be an arrayKlassOop but all vtables start at
1196      // the same place. The cast is to avoid virtual call and assertion.
1197      InstanceKlass* inst = (InstanceKlass*)recv_klass();
1198      selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
1199    }
1200  }
1201
1202  // check if method exists
1203  if (selected_method.is_null()) {
1204    ResourceMark rm(THREAD);
1205    THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
1206              Method::name_and_sig_as_C_string(resolved_klass(),
1207                                                      resolved_method->name(),
1208                                                      resolved_method->signature()));
1209  }
1210
1211  // check if abstract
1212  if (check_null_and_abstract && selected_method->is_abstract()) {
1213    ResourceMark rm(THREAD);
1214    THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
1215              Method::name_and_sig_as_C_string(resolved_klass(),
1216                                                      selected_method->name(),
1217                                                      selected_method->signature()));
1218  }
1219
1220  if (PrintVtables && Verbose) {
1221    ResourceMark rm(THREAD);
1222    tty->print("invokevirtual selected method: receiver-class:%s, resolved-class:%s, method:%s, method_holder:%s, vtable_index:%d, access_flags: ",
1223                   (recv_klass.is_null() ? "<NULL>" : recv_klass->internal_name()),
1224                   (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
1225                   Method::name_and_sig_as_C_string(resolved_klass(),
1226                                                    resolved_method->name(),
1227                                                    resolved_method->signature()),
1228                   selected_method->method_holder()->internal_name(),
1229                   vtable_index
1230                  );
1231    selected_method->access_flags().print_on(tty);
1232    if (selected_method->is_default_method()) {
1233      tty->print("default ");
1234    }
1235    if (selected_method->is_overpass()) {
1236      tty->print("overpass");
1237    }
1238    tty->cr();
1239  }
1240  // setup result
1241  result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK);
1242}
1243
1244void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass,
1245                                          Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
1246                                          bool check_access, bool check_null_and_abstract, TRAPS) {
1247  methodHandle resolved_method;
1248  linktime_resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
1249  runtime_resolve_interface_method(result, resolved_method, resolved_klass, recv, recv_klass, check_null_and_abstract, CHECK);
1250}
1251
1252// throws linktime exceptions
1253void LinkResolver::linktime_resolve_interface_method(methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name,
1254                                                     Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
1255  // normal interface method resolution
1256  resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
1257
1258  assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
1259  assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
1260}
1261
1262// throws runtime exceptions
1263void LinkResolver::runtime_resolve_interface_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
1264                                                    Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS) {
1265  // check if receiver exists
1266  if (check_null_and_abstract && recv.is_null()) {
1267    THROW(vmSymbols::java_lang_NullPointerException());
1268  }
1269
1270  // check if private interface method
1271  if (resolved_klass->is_interface() && resolved_method->is_private()) {
1272    ResourceMark rm(THREAD);
1273    char buf[200];
1274    jio_snprintf(buf, sizeof(buf), "private interface method requires invokespecial, not invokeinterface: method %s",
1275                 Method::name_and_sig_as_C_string(resolved_klass(),
1276                                                  resolved_method->name(),
1277                                                  resolved_method->signature()));
1278    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
1279  }
1280
1281  // check if receiver klass implements the resolved interface
1282  if (!recv_klass->is_subtype_of(resolved_klass())) {
1283    ResourceMark rm(THREAD);
1284    char buf[200];
1285    jio_snprintf(buf, sizeof(buf), "Class %s does not implement the requested interface %s",
1286                 recv_klass()->external_name(),
1287                 resolved_klass()->external_name());
1288    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
1289  }
1290
1291  // do lookup based on receiver klass
1292  methodHandle sel_method;
1293  // This search must match the linktime preparation search for itable initialization
1294  // to correctly enforce loader constraints for interface method inheritance
1295  lookup_instance_method_in_klasses(sel_method, recv_klass,
1296            resolved_method->name(),
1297            resolved_method->signature(), CHECK);
1298  if (sel_method.is_null() && !check_null_and_abstract) {
1299    // In theory this is a harmless placeholder value, but
1300    // in practice leaving in null affects the nsk default method tests.
1301    // This needs further study.
1302    sel_method = resolved_method;
1303  }
1304  // check if method exists
1305  if (sel_method.is_null()) {
1306    ResourceMark rm(THREAD);
1307    THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
1308              Method::name_and_sig_as_C_string(recv_klass(),
1309                                                      resolved_method->name(),
1310                                                      resolved_method->signature()));
1311  }
1312  // check access
1313  // Throw Illegal Access Error if sel_method is not public.
1314  if (!sel_method->is_public()) {
1315    ResourceMark rm(THREAD);
1316    THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
1317              Method::name_and_sig_as_C_string(recv_klass(),
1318                                               sel_method->name(),
1319                                               sel_method->signature()));
1320  }
1321  // check if abstract
1322  if (check_null_and_abstract && sel_method->is_abstract()) {
1323    ResourceMark rm(THREAD);
1324    THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
1325              Method::name_and_sig_as_C_string(recv_klass(),
1326                                                      sel_method->name(),
1327                                                      sel_method->signature()));
1328  }
1329
1330  if (TraceItables && Verbose) {
1331    ResourceMark rm(THREAD);
1332    tty->print("invokeinterface selected method: receiver-class:%s, resolved-class:%s, method:%s, method_holder:%s, access_flags: ",
1333                   (recv_klass.is_null() ? "<NULL>" : recv_klass->internal_name()),
1334                   (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
1335                   Method::name_and_sig_as_C_string(resolved_klass(),
1336                                                    resolved_method->name(),
1337                                                    resolved_method->signature()),
1338                   sel_method->method_holder()->internal_name()
1339                  );
1340    sel_method->access_flags().print_on(tty);
1341    if (sel_method->is_default_method()) {
1342      tty->print("default ");
1343    }
1344    if (sel_method->is_overpass()) {
1345      tty->print("overpass");
1346    }
1347    tty->cr();
1348  }
1349  // setup result
1350  if (!resolved_method->has_itable_index()) {
1351    int vtable_index = resolved_method->vtable_index();
1352    assert(vtable_index == sel_method->vtable_index(), "sanity check");
1353    result.set_virtual(resolved_klass, recv_klass, resolved_method, sel_method, vtable_index, CHECK);
1354  } else {
1355    int itable_index = resolved_method()->itable_index();
1356    result.set_interface(resolved_klass, recv_klass, resolved_method, sel_method, itable_index, CHECK);
1357  }
1358}
1359
1360
1361methodHandle LinkResolver::linktime_resolve_interface_method_or_null(
1362                                                 KlassHandle resolved_klass,
1363                                                 Symbol* method_name,
1364                                                 Symbol* method_signature,
1365                                                 KlassHandle current_klass,
1366                                                 bool check_access) {
1367  EXCEPTION_MARK;
1368  methodHandle method_result;
1369  linktime_resolve_interface_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
1370  if (HAS_PENDING_EXCEPTION) {
1371    CLEAR_PENDING_EXCEPTION;
1372    return methodHandle();
1373  } else {
1374    return method_result;
1375  }
1376}
1377
1378methodHandle LinkResolver::linktime_resolve_virtual_method_or_null(
1379                                                 KlassHandle resolved_klass,
1380                                                 Symbol* method_name,
1381                                                 Symbol* method_signature,
1382                                                 KlassHandle current_klass,
1383                                                 bool check_access) {
1384  EXCEPTION_MARK;
1385  methodHandle method_result;
1386  linktime_resolve_virtual_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
1387  if (HAS_PENDING_EXCEPTION) {
1388    CLEAR_PENDING_EXCEPTION;
1389    return methodHandle();
1390  } else {
1391    return method_result;
1392  }
1393}
1394
1395methodHandle LinkResolver::resolve_virtual_call_or_null(
1396                                                 KlassHandle receiver_klass,
1397                                                 KlassHandle resolved_klass,
1398                                                 Symbol* name,
1399                                                 Symbol* signature,
1400                                                 KlassHandle current_klass) {
1401  EXCEPTION_MARK;
1402  CallInfo info;
1403  resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
1404  if (HAS_PENDING_EXCEPTION) {
1405    CLEAR_PENDING_EXCEPTION;
1406    return methodHandle();
1407  }
1408  return info.selected_method();
1409}
1410
1411methodHandle LinkResolver::resolve_interface_call_or_null(
1412                                                 KlassHandle receiver_klass,
1413                                                 KlassHandle resolved_klass,
1414                                                 Symbol* name,
1415                                                 Symbol* signature,
1416                                                 KlassHandle current_klass) {
1417  EXCEPTION_MARK;
1418  CallInfo info;
1419  resolve_interface_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
1420  if (HAS_PENDING_EXCEPTION) {
1421    CLEAR_PENDING_EXCEPTION;
1422    return methodHandle();
1423  }
1424  return info.selected_method();
1425}
1426
1427int LinkResolver::resolve_virtual_vtable_index(
1428                                               KlassHandle receiver_klass,
1429                                               KlassHandle resolved_klass,
1430                                               Symbol* name,
1431                                               Symbol* signature,
1432                                               KlassHandle current_klass) {
1433  EXCEPTION_MARK;
1434  CallInfo info;
1435  resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
1436  if (HAS_PENDING_EXCEPTION) {
1437    CLEAR_PENDING_EXCEPTION;
1438    return Method::invalid_vtable_index;
1439  }
1440  return info.vtable_index();
1441}
1442
1443methodHandle LinkResolver::resolve_static_call_or_null(
1444                                                  KlassHandle resolved_klass,
1445                                                  Symbol* name,
1446                                                  Symbol* signature,
1447                                                  KlassHandle current_klass) {
1448  EXCEPTION_MARK;
1449  CallInfo info;
1450  resolve_static_call(info, resolved_klass, name, signature, current_klass, true, false, THREAD);
1451  if (HAS_PENDING_EXCEPTION) {
1452    CLEAR_PENDING_EXCEPTION;
1453    return methodHandle();
1454  }
1455  return info.selected_method();
1456}
1457
1458methodHandle LinkResolver::resolve_special_call_or_null(KlassHandle resolved_klass, Symbol* name, Symbol* signature,
1459                                                        KlassHandle current_klass) {
1460  EXCEPTION_MARK;
1461  CallInfo info;
1462  resolve_special_call(info, resolved_klass, name, signature, current_klass, true, THREAD);
1463  if (HAS_PENDING_EXCEPTION) {
1464    CLEAR_PENDING_EXCEPTION;
1465    return methodHandle();
1466  }
1467  return info.selected_method();
1468}
1469
1470
1471
1472//------------------------------------------------------------------------------------------------------------------------
1473// ConstantPool entries
1474
1475void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
1476  switch (byte) {
1477    case Bytecodes::_invokestatic   : resolve_invokestatic   (result,       pool, index, CHECK); break;
1478    case Bytecodes::_invokespecial  : resolve_invokespecial  (result,       pool, index, CHECK); break;
1479    case Bytecodes::_invokevirtual  : resolve_invokevirtual  (result, recv, pool, index, CHECK); break;
1480    case Bytecodes::_invokehandle   : resolve_invokehandle   (result,       pool, index, CHECK); break;
1481    case Bytecodes::_invokedynamic  : resolve_invokedynamic  (result,       pool, index, CHECK); break;
1482    case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break;
1483  }
1484  return;
1485}
1486
1487void LinkResolver::resolve_pool(KlassHandle& resolved_klass, Symbol*& method_name, Symbol*& method_signature,
1488                                KlassHandle& current_klass, constantPoolHandle pool, int index, TRAPS) {
1489   // resolve klass
1490  resolve_klass(resolved_klass, pool, index, CHECK);
1491
1492  // Get name, signature, and static klass
1493  method_name      = pool->name_ref_at(index);
1494  method_signature = pool->signature_ref_at(index);
1495  current_klass    = KlassHandle(THREAD, pool->pool_holder());
1496}
1497
1498
1499void LinkResolver::resolve_invokestatic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
1500  KlassHandle  resolved_klass;
1501  Symbol* method_name = NULL;
1502  Symbol* method_signature = NULL;
1503  KlassHandle  current_klass;
1504  resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
1505  resolve_static_call(result, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
1506}
1507
1508
1509void LinkResolver::resolve_invokespecial(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
1510  KlassHandle  resolved_klass;
1511  Symbol* method_name = NULL;
1512  Symbol* method_signature = NULL;
1513  KlassHandle  current_klass;
1514  resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
1515  resolve_special_call(result, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
1516}
1517
1518
1519void LinkResolver::resolve_invokevirtual(CallInfo& result, Handle recv,
1520                                          constantPoolHandle pool, int index,
1521                                          TRAPS) {
1522
1523  KlassHandle  resolved_klass;
1524  Symbol* method_name = NULL;
1525  Symbol* method_signature = NULL;
1526  KlassHandle  current_klass;
1527  resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
1528  KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
1529  resolve_virtual_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
1530}
1531
1532
1533void LinkResolver::resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS) {
1534  KlassHandle  resolved_klass;
1535  Symbol* method_name = NULL;
1536  Symbol* method_signature = NULL;
1537  KlassHandle  current_klass;
1538  resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
1539  KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
1540  resolve_interface_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
1541}
1542
1543
1544void LinkResolver::resolve_invokehandle(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
1545  // This guy is reached from InterpreterRuntime::resolve_invokehandle.
1546  KlassHandle  resolved_klass;
1547  Symbol* method_name = NULL;
1548  Symbol* method_signature = NULL;
1549  KlassHandle  current_klass;
1550  resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
1551  if (TraceMethodHandles) {
1552    ResourceMark rm(THREAD);
1553    tty->print_cr("resolve_invokehandle %s %s", method_name->as_C_string(), method_signature->as_C_string());
1554  }
1555  resolve_handle_call(result, resolved_klass, method_name, method_signature, current_klass, CHECK);
1556}
1557
1558void LinkResolver::resolve_handle_call(CallInfo& result, KlassHandle resolved_klass,
1559                                       Symbol* method_name, Symbol* method_signature,
1560                                       KlassHandle current_klass,
1561                                       TRAPS) {
1562  // JSR 292:  this must be an implicitly generated method MethodHandle.invokeExact(*...) or similar
1563  assert(resolved_klass() == SystemDictionary::MethodHandle_klass(), "");
1564  assert(MethodHandles::is_signature_polymorphic_name(method_name), "");
1565  methodHandle resolved_method;
1566  Handle       resolved_appendix;
1567  Handle       resolved_method_type;
1568  lookup_polymorphic_method(resolved_method, resolved_klass,
1569                            method_name, method_signature,
1570                            current_klass, &resolved_appendix, &resolved_method_type, CHECK);
1571  result.set_handle(resolved_method, resolved_appendix, resolved_method_type, CHECK);
1572}
1573
1574
1575void LinkResolver::resolve_invokedynamic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
1576  //resolve_pool(<resolved_klass>, method_name, method_signature, current_klass, pool, index, CHECK);
1577  Symbol* method_name       = pool->name_ref_at(index);
1578  Symbol* method_signature  = pool->signature_ref_at(index);
1579  KlassHandle current_klass = KlassHandle(THREAD, pool->pool_holder());
1580
1581  // Resolve the bootstrap specifier (BSM + optional arguments).
1582  Handle bootstrap_specifier;
1583  // Check if CallSite has been bound already:
1584  ConstantPoolCacheEntry* cpce = pool->invokedynamic_cp_cache_entry_at(index);
1585  if (cpce->is_f1_null()) {
1586    int pool_index = cpce->constant_pool_index();
1587    oop bsm_info = pool->resolve_bootstrap_specifier_at(pool_index, CHECK);
1588    assert(bsm_info != NULL, "");
1589    // FIXME: Cache this once per BootstrapMethods entry, not once per CONSTANT_InvokeDynamic.
1590    bootstrap_specifier = Handle(THREAD, bsm_info);
1591  }
1592  if (!cpce->is_f1_null()) {
1593    methodHandle method(     THREAD, cpce->f1_as_method());
1594    Handle       appendix(   THREAD, cpce->appendix_if_resolved(pool));
1595    Handle       method_type(THREAD, cpce->method_type_if_resolved(pool));
1596    result.set_handle(method, appendix, method_type, CHECK);
1597    return;
1598  }
1599
1600  if (TraceMethodHandles) {
1601      ResourceMark rm(THREAD);
1602      tty->print_cr("resolve_invokedynamic #%d %s %s",
1603                  ConstantPool::decode_invokedynamic_index(index),
1604                  method_name->as_C_string(), method_signature->as_C_string());
1605    tty->print("  BSM info: "); bootstrap_specifier->print();
1606  }
1607
1608  resolve_dynamic_call(result, bootstrap_specifier, method_name, method_signature, current_klass, CHECK);
1609}
1610
1611void LinkResolver::resolve_dynamic_call(CallInfo& result,
1612                                        Handle bootstrap_specifier,
1613                                        Symbol* method_name, Symbol* method_signature,
1614                                        KlassHandle current_klass,
1615                                        TRAPS) {
1616  // JSR 292:  this must resolve to an implicitly generated method MH.linkToCallSite(*...)
1617  // The appendix argument is likely to be a freshly-created CallSite.
1618  Handle       resolved_appendix;
1619  Handle       resolved_method_type;
1620  methodHandle resolved_method =
1621    SystemDictionary::find_dynamic_call_site_invoker(current_klass,
1622                                                     bootstrap_specifier,
1623                                                     method_name, method_signature,
1624                                                     &resolved_appendix,
1625                                                     &resolved_method_type,
1626                                                     THREAD);
1627  if (HAS_PENDING_EXCEPTION) {
1628    if (TraceMethodHandles) {
1629      tty->print_cr("invokedynamic throws BSME for " INTPTR_FORMAT, p2i((void *)PENDING_EXCEPTION));
1630      PENDING_EXCEPTION->print();
1631    }
1632    if (PENDING_EXCEPTION->is_a(SystemDictionary::BootstrapMethodError_klass())) {
1633      // throw these guys, since they are already wrapped
1634      return;
1635    }
1636    if (!PENDING_EXCEPTION->is_a(SystemDictionary::LinkageError_klass())) {
1637      // intercept only LinkageErrors which might have failed to wrap
1638      return;
1639    }
1640    // See the "Linking Exceptions" section for the invokedynamic instruction in the JVMS.
1641    Handle nested_exception(THREAD, PENDING_EXCEPTION);
1642    CLEAR_PENDING_EXCEPTION;
1643    THROW_CAUSE(vmSymbols::java_lang_BootstrapMethodError(), nested_exception)
1644  }
1645  result.set_handle(resolved_method, resolved_appendix, resolved_method_type, CHECK);
1646}
1647
1648//------------------------------------------------------------------------------------------------------------------------
1649#ifndef PRODUCT
1650
1651void CallInfo::print() {
1652  ResourceMark rm;
1653  const char* kindstr = "unknown";
1654  switch (_call_kind) {
1655  case direct_call: kindstr = "direct"; break;
1656  case vtable_call: kindstr = "vtable"; break;
1657  case itable_call: kindstr = "itable"; break;
1658  }
1659  tty->print_cr("Call %s@%d %s", kindstr, _call_index,
1660                _resolved_method.is_null() ? "(none)" : _resolved_method->name_and_sig_as_C_string());
1661}
1662
1663#endif
1664