jdk

Форк
0
/
linkResolver.cpp 
1962 строки · 86.6 Кб
1
/*
2
 * Copyright (c) 1997, 2024, 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 "cds/archiveUtils.hpp"
27
#include "classfile/classLoader.hpp"
28
#include "classfile/defaultMethods.hpp"
29
#include "classfile/javaClasses.hpp"
30
#include "classfile/systemDictionary.hpp"
31
#include "classfile/vmClasses.hpp"
32
#include "classfile/vmSymbols.hpp"
33
#include "compiler/compilationPolicy.hpp"
34
#include "compiler/compileBroker.hpp"
35
#include "gc/shared/collectedHeap.inline.hpp"
36
#include "interpreter/bootstrapInfo.hpp"
37
#include "interpreter/bytecode.hpp"
38
#include "interpreter/interpreterRuntime.hpp"
39
#include "interpreter/linkResolver.hpp"
40
#include "jvm.h"
41
#include "logging/log.hpp"
42
#include "logging/logStream.hpp"
43
#include "memory/resourceArea.hpp"
44
#include "oops/constantPool.inline.hpp"
45
#include "oops/cpCache.inline.hpp"
46
#include "oops/instanceKlass.inline.hpp"
47
#include "oops/klass.inline.hpp"
48
#include "oops/method.inline.hpp"
49
#include "oops/objArrayKlass.hpp"
50
#include "oops/objArrayOop.hpp"
51
#include "oops/oop.inline.hpp"
52
#include "oops/resolvedIndyEntry.hpp"
53
#include "oops/symbolHandle.hpp"
54
#include "prims/jvmtiExport.hpp"
55
#include "prims/methodHandles.hpp"
56
#include "runtime/fieldDescriptor.inline.hpp"
57
#include "runtime/frame.inline.hpp"
58
#include "runtime/handles.inline.hpp"
59
#include "runtime/javaThread.inline.hpp"
60
#include "runtime/perfData.hpp"
61
#include "runtime/reflection.hpp"
62
#include "runtime/safepointVerifiers.hpp"
63
#include "runtime/sharedRuntime.hpp"
64
#include "runtime/signature.hpp"
65
#include "runtime/vmThread.hpp"
66
#include "utilities/macros.hpp"
67
#if INCLUDE_JFR
68
#include "jfr/jfr.hpp"
69
#endif
70

71
//------------------------------------------------------------------------------------------------------------------------
72
// Implementation of CallInfo
73

74

75
void CallInfo::set_static(Klass* resolved_klass, const methodHandle& resolved_method, TRAPS) {
76
  int vtable_index = Method::nonvirtual_vtable_index;
77
  set_common(resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK);
78
}
79

80

81
void CallInfo::set_interface(Klass* resolved_klass,
82
                             const methodHandle& resolved_method,
83
                             const methodHandle& selected_method,
84
                             int itable_index, TRAPS) {
85
  // This is only called for interface methods. If the resolved_method
86
  // comes from java/lang/Object, it can be the subject of a virtual call, so
87
  // we should pick the vtable index from the resolved method.
88
  // In that case, the caller must call set_virtual instead of set_interface.
89
  assert(resolved_method->method_holder()->is_interface(), "");
90
  assert(itable_index == resolved_method()->itable_index(), "");
91
  set_common(resolved_klass, resolved_method, selected_method, CallInfo::itable_call, itable_index, CHECK);
92
}
93

94
void CallInfo::set_virtual(Klass* resolved_klass,
95
                           const methodHandle& resolved_method,
96
                           const methodHandle& selected_method,
97
                           int vtable_index, TRAPS) {
98
  assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index, "valid index");
99
  assert(vtable_index < 0 || !resolved_method->has_vtable_index() || vtable_index == resolved_method->vtable_index(), "");
100
  CallKind kind = (vtable_index >= 0 && !resolved_method->can_be_statically_bound() ? CallInfo::vtable_call : CallInfo::direct_call);
101
  set_common(resolved_klass, resolved_method, selected_method, kind, vtable_index, CHECK);
102
  assert(!resolved_method->is_compiled_lambda_form(), "these must be handled via an invokehandle call");
103
}
104

105
void CallInfo::set_handle(Klass* resolved_klass,
106
                          const methodHandle& resolved_method,
107
                          Handle resolved_appendix, TRAPS) {
108
  guarantee(resolved_method.not_null(), "resolved method is null");
109
  assert(resolved_method->intrinsic_id() == vmIntrinsics::_invokeBasic ||
110
         resolved_method->is_compiled_lambda_form(),
111
         "linkMethod must return one of these");
112
  int vtable_index = Method::nonvirtual_vtable_index;
113
  assert(!resolved_method->has_vtable_index(), "");
114
  set_common(resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK);
115
  _resolved_appendix = resolved_appendix;
116
}
117

118
// Redefinition safepoint may have updated the method. Make sure the new version of the method is returned.
119
// Callers are responsible for not safepointing and storing this method somewhere safe where redefinition
120
// can replace it if runs again.  Safe places are constant pool cache and code cache metadata.
121
// The old method is safe in CallInfo since its a methodHandle (it won't get deleted), and accessed with these
122
// accessors.
123
Method* CallInfo::resolved_method() const {
124
  if (JvmtiExport::can_hotswap_or_post_breakpoint() && _resolved_method->is_old()) {
125
    return _resolved_method->get_new_method();
126
  } else {
127
    return _resolved_method();
128
  }
129
}
130

131
Method* CallInfo::selected_method() const {
132
  if (JvmtiExport::can_hotswap_or_post_breakpoint() && _selected_method->is_old()) {
133
    return _selected_method->get_new_method();
134
  } else {
135
    return _selected_method();
136
  }
137
}
138

139
void CallInfo::set_common(Klass* resolved_klass,
140
                          const methodHandle& resolved_method,
141
                          const methodHandle& selected_method,
142
                          CallKind kind,
143
                          int index,
144
                          TRAPS) {
145
  if (selected_method.not_null()) {
146
    assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
147
  }
148
  _resolved_klass  = resolved_klass;
149
  _resolved_method = resolved_method;
150
  _selected_method = selected_method;
151
  _call_kind       = kind;
152
  _call_index      = index;
153
  _resolved_appendix = Handle();
154
  DEBUG_ONLY(verify());  // verify before making side effects
155

156
  if (selected_method.not_null()) {
157
    CompilationPolicy::compile_if_required(selected_method, THREAD);
158
  }
159
}
160

161
// utility query for unreflecting a method
162
CallInfo::CallInfo(Method* resolved_method, Klass* resolved_klass, TRAPS) {
163
  Klass* resolved_method_holder = resolved_method->method_holder();
164
  if (resolved_klass == nullptr) { // 2nd argument defaults to holder of 1st
165
    resolved_klass = resolved_method_holder;
166
  }
167
  _resolved_klass  = resolved_klass;
168
  _resolved_method = methodHandle(THREAD, resolved_method);
169
  _selected_method = methodHandle(THREAD, resolved_method);
170
  // classify:
171
  CallKind kind = CallInfo::unknown_kind;
172
  int index = resolved_method->vtable_index();
173
  if (resolved_method->can_be_statically_bound()) {
174
    kind = CallInfo::direct_call;
175
  } else if (!resolved_method_holder->is_interface()) {
176
    // Could be an Object method inherited into an interface, but still a vtable call.
177
    kind = CallInfo::vtable_call;
178
  } else if (!resolved_klass->is_interface()) {
179
    // A default or miranda method.  Compute the vtable index.
180
    index = LinkResolver::vtable_index_of_interface_method(resolved_klass, _resolved_method);
181
    assert(index >= 0 , "we should have valid vtable index at this point");
182

183
    kind = CallInfo::vtable_call;
184
  } else if (resolved_method->has_vtable_index()) {
185
    // Can occur if an interface redeclares a method of Object.
186

187
#ifdef ASSERT
188
    // Ensure that this is really the case.
189
    Klass* object_klass = vmClasses::Object_klass();
190
    Method * object_resolved_method = object_klass->vtable().method_at(index);
191
    assert(object_resolved_method->name() == resolved_method->name(),
192
      "Object and interface method names should match at vtable index %d, %s != %s",
193
      index, object_resolved_method->name()->as_C_string(), resolved_method->name()->as_C_string());
194
    assert(object_resolved_method->signature() == resolved_method->signature(),
195
      "Object and interface method signatures should match at vtable index %d, %s != %s",
196
      index, object_resolved_method->signature()->as_C_string(), resolved_method->signature()->as_C_string());
197
#endif // ASSERT
198

199
    kind = CallInfo::vtable_call;
200
  } else {
201
    // A regular interface call.
202
    kind = CallInfo::itable_call;
203
    index = resolved_method->itable_index();
204
  }
205
  assert(index == Method::nonvirtual_vtable_index || index >= 0, "bad index %d", index);
206
  _call_kind  = kind;
207
  _call_index = index;
208
  _resolved_appendix = Handle();
209
  // Find or create a ResolvedMethod instance for this Method*
210
  set_resolved_method_name(CHECK);
211

212
  DEBUG_ONLY(verify());
213
}
214

215
void CallInfo::set_resolved_method_name(TRAPS) {
216
  assert(_resolved_method() != nullptr, "Should already have a Method*");
217
  oop rmethod_name = java_lang_invoke_ResolvedMethodName::find_resolved_method(_resolved_method, CHECK);
218
  _resolved_method_name = Handle(THREAD, rmethod_name);
219
}
220

221
#ifdef ASSERT
222
void CallInfo::verify() {
223
  switch (call_kind()) {  // the meaning and allowed value of index depends on kind
224
  case CallInfo::direct_call:
225
    if (_call_index == Method::nonvirtual_vtable_index)  break;
226
    // else fall through to check vtable index:
227
  case CallInfo::vtable_call:
228
    assert(resolved_klass()->verify_vtable_index(_call_index), "");
229
    break;
230
  case CallInfo::itable_call:
231
    assert(resolved_method()->method_holder()->verify_itable_index(_call_index), "");
232
    break;
233
  case CallInfo::unknown_kind:
234
    assert(call_kind() != CallInfo::unknown_kind, "CallInfo must be set");
235
    break;
236
  default:
237
    fatal("Unexpected call kind %d", call_kind());
238
  }
239
}
240
#endif // ASSERT
241

242
#ifndef PRODUCT
243
void CallInfo::print() {
244
  ResourceMark rm;
245
  const char* kindstr;
246
  switch (_call_kind) {
247
  case direct_call: kindstr = "direct";  break;
248
  case vtable_call: kindstr = "vtable";  break;
249
  case itable_call: kindstr = "itable";  break;
250
  default         : kindstr = "unknown"; break;
251
  }
252
  tty->print_cr("Call %s@%d %s", kindstr, _call_index,
253
                _resolved_method.is_null() ? "(none)" : _resolved_method->name_and_sig_as_C_string());
254
}
255
#endif
256

257
//------------------------------------------------------------------------------------------------------------------------
258
// Implementation of LinkInfo
259

260
LinkInfo::LinkInfo(const constantPoolHandle& pool, int index, const methodHandle& current_method, Bytecodes::Code code, TRAPS) {
261
   // resolve klass
262
  _resolved_klass = pool->klass_ref_at(index, code, CHECK);
263

264
  // Get name, signature, and static klass
265
  _name          = pool->name_ref_at(index, code);
266
  _signature     = pool->signature_ref_at(index, code);
267
  _tag           = pool->tag_ref_at(index, code);
268
  _current_klass = pool->pool_holder();
269
  _current_method = current_method;
270

271
  // Coming from the constant pool always checks access
272
  _check_access  = true;
273
  _check_loader_constraints = true;
274
}
275

276
LinkInfo::LinkInfo(const constantPoolHandle& pool, int index, Bytecodes::Code code, TRAPS) {
277
   // resolve klass
278
  _resolved_klass = pool->klass_ref_at(index, code, CHECK);
279

280
  // Get name, signature, and static klass
281
  _name          = pool->name_ref_at(index, code);
282
  _signature     = pool->signature_ref_at(index, code);
283
  _tag           = pool->tag_ref_at(index, code);
284
  _current_klass = pool->pool_holder();
285
  _current_method = methodHandle();
286

287
  // Coming from the constant pool always checks access
288
  _check_access  = true;
289
  _check_loader_constraints = true;
290
}
291

292
#ifndef PRODUCT
293
void LinkInfo::print() {
294
  ResourceMark rm;
295
  tty->print_cr("Link resolved_klass=%s name=%s signature=%s current_klass=%s check_access=%s check_loader_constraints=%s",
296
                _resolved_klass->name()->as_C_string(),
297
                _name->as_C_string(),
298
                _signature->as_C_string(),
299
                _current_klass == nullptr ? "(none)" : _current_klass->name()->as_C_string(),
300
                _check_access ? "true" : "false",
301
                _check_loader_constraints ? "true" : "false");
302

303
}
304
#endif // PRODUCT
305
//------------------------------------------------------------------------------------------------------------------------
306
// Klass resolution
307

308
void LinkResolver::check_klass_accessibility(Klass* ref_klass, Klass* sel_klass, TRAPS) {
309
  Klass* base_klass = sel_klass;
310
  if (sel_klass->is_objArray_klass()) {
311
    base_klass = ObjArrayKlass::cast(sel_klass)->bottom_klass();
312
  }
313
  // The element type could be a typeArray - we only need the access
314
  // check if it is a reference to another class.
315
  if (!base_klass->is_instance_klass()) {
316
    return;  // no relevant check to do
317
  }
318

319
  Reflection::VerifyClassAccessResults vca_result =
320
    Reflection::verify_class_access(ref_klass, InstanceKlass::cast(base_klass), true);
321
  if (vca_result != Reflection::ACCESS_OK) {
322
    ResourceMark rm(THREAD);
323
    char* msg = Reflection::verify_class_access_msg(ref_klass,
324
                                                    InstanceKlass::cast(base_klass),
325
                                                    vca_result);
326
    bool same_module = (base_klass->module() == ref_klass->module());
327
    if (msg == nullptr) {
328
      Exceptions::fthrow(
329
        THREAD_AND_LOCATION,
330
        vmSymbols::java_lang_IllegalAccessError(),
331
        "failed to access class %s from class %s (%s%s%s)",
332
        base_klass->external_name(),
333
        ref_klass->external_name(),
334
        (same_module) ? base_klass->joint_in_module_of_loader(ref_klass) : base_klass->class_in_module_of_loader(),
335
        (same_module) ? "" : "; ",
336
        (same_module) ? "" : ref_klass->class_in_module_of_loader());
337
    } else {
338
      // Use module specific message returned by verify_class_access_msg().
339
      Exceptions::fthrow(
340
        THREAD_AND_LOCATION,
341
        vmSymbols::java_lang_IllegalAccessError(),
342
        "%s", msg);
343
    }
344
  }
345
}
346

347
//------------------------------------------------------------------------------------------------------------------------
348
// Method resolution
349
//
350
// According to JVM spec. $5.4.3c & $5.4.3d
351

352
// Look up method in klasses, including static methods
353
// Then look up local default methods
354
Method* LinkResolver::lookup_method_in_klasses(const LinkInfo& link_info,
355
                                               bool checkpolymorphism,
356
                                               bool in_imethod_resolve) {
357
  NoSafepointVerifier nsv;  // Method* returned may not be reclaimed
358

359
  Klass* klass = link_info.resolved_klass();
360
  Symbol* name = link_info.name();
361
  Symbol* signature = link_info.signature();
362

363
  // Ignore overpasses so statics can be found during resolution
364
  Method* result = klass->uncached_lookup_method(name, signature, Klass::OverpassLookupMode::skip);
365

366
  if (klass->is_array_klass()) {
367
    // Only consider klass and super klass for arrays
368
    return result;
369
  }
370

371
  InstanceKlass* ik = InstanceKlass::cast(klass);
372

373
  // JDK 8, JVMS 5.4.3.4: Interface method resolution should
374
  // ignore static and non-public methods of java.lang.Object,
375
  // like clone and finalize.
376
  if (in_imethod_resolve &&
377
      result != nullptr &&
378
      ik->is_interface() &&
379
      (result->is_static() || !result->is_public()) &&
380
      result->method_holder() == vmClasses::Object_klass()) {
381
    result = nullptr;
382
  }
383

384
  // Before considering default methods, check for an overpass in the
385
  // current class if a method has not been found.
386
  if (result == nullptr) {
387
    result = ik->find_method(name, signature);
388
  }
389

390
  if (result == nullptr) {
391
    Array<Method*>* default_methods = ik->default_methods();
392
    if (default_methods != nullptr) {
393
      result = InstanceKlass::find_method(default_methods, name, signature);
394
    }
395
  }
396

397
  if (checkpolymorphism && result != nullptr) {
398
    vmIntrinsics::ID iid = result->intrinsic_id();
399
    if (MethodHandles::is_signature_polymorphic(iid)) {
400
      // Do not link directly to these.  The VM must produce a synthetic one using lookup_polymorphic_method.
401
      return nullptr;
402
    }
403
  }
404
  return result;
405
}
406

407
// returns first instance method
408
// Looks up method in classes, then looks up local default methods
409
Method* LinkResolver::lookup_instance_method_in_klasses(Klass* klass,
410
                                                        Symbol* name,
411
                                                        Symbol* signature,
412
                                                        Klass::PrivateLookupMode private_mode) {
413
  Method* result = klass->uncached_lookup_method(name, signature, Klass::OverpassLookupMode::find, private_mode);
414

415
  while (result != nullptr && result->is_static() && result->method_holder()->super() != nullptr) {
416
    Klass* super_klass = result->method_holder()->super();
417
    result = super_klass->uncached_lookup_method(name, signature, Klass::OverpassLookupMode::find, private_mode);
418
  }
419

420
  if (klass->is_array_klass()) {
421
    // Only consider klass and super klass for arrays
422
    return result;
423
  }
424

425
  if (result == nullptr) {
426
    Array<Method*>* default_methods = InstanceKlass::cast(klass)->default_methods();
427
    if (default_methods != nullptr) {
428
      result = InstanceKlass::find_method(default_methods, name, signature);
429
      assert(result == nullptr || !result->is_static(), "static defaults not allowed");
430
    }
431
  }
432
  return result;
433
}
434

435
int LinkResolver::vtable_index_of_interface_method(Klass* klass, const methodHandle& resolved_method) {
436
  InstanceKlass* ik = InstanceKlass::cast(klass);
437
  return ik->vtable_index_of_interface_method(resolved_method());
438
}
439

440
Method* LinkResolver::lookup_method_in_interfaces(const LinkInfo& cp_info) {
441
  InstanceKlass *ik = InstanceKlass::cast(cp_info.resolved_klass());
442

443
  // Specify 'true' in order to skip default methods when searching the
444
  // interfaces.  Function lookup_method_in_klasses() already looked for
445
  // the method in the default methods table.
446
  return ik->lookup_method_in_all_interfaces(cp_info.name(), cp_info.signature(), Klass::DefaultsLookupMode::skip);
447
}
448

449
Method* LinkResolver::lookup_polymorphic_method(const LinkInfo& link_info,
450
                                                Handle *appendix_result_or_null,
451
                                                TRAPS) {
452
  ResourceMark rm(THREAD);
453
  Klass* klass = link_info.resolved_klass();
454
  Symbol* name = link_info.name();
455
  Symbol* full_signature = link_info.signature();
456
  LogTarget(Info, methodhandles) lt_mh;
457

458
  vmIntrinsics::ID iid = MethodHandles::signature_polymorphic_name_id(name);
459
  log_info(methodhandles)("lookup_polymorphic_method iid=%s %s.%s%s",
460
                          vmIntrinsics::name_at(iid), klass->external_name(),
461
                          name->as_C_string(), full_signature->as_C_string());
462
  if ((klass == vmClasses::MethodHandle_klass() ||
463
       klass == vmClasses::VarHandle_klass()) &&
464
      iid != vmIntrinsics::_none) {
465
    if (MethodHandles::is_signature_polymorphic_intrinsic(iid)) {
466
      // Most of these do not need an up-call to Java to resolve, so can be done anywhere.
467
      // Do not erase last argument type (MemberName) if it is a static linkTo method.
468
      bool keep_last_arg = MethodHandles::is_signature_polymorphic_static(iid);
469
      TempNewSymbol basic_signature =
470
        MethodHandles::lookup_basic_type_signature(full_signature, keep_last_arg);
471
      log_info(methodhandles)("lookup_polymorphic_method %s %s => basic %s",
472
                              name->as_C_string(),
473
                              full_signature->as_C_string(),
474
                              basic_signature->as_C_string());
475
      Method* result = SystemDictionary::find_method_handle_intrinsic(iid,
476
                                                              basic_signature,
477
                                                              CHECK_NULL);
478
      if (result != nullptr) {
479
        assert(result->is_method_handle_intrinsic(), "MH.invokeBasic or MH.linkTo* intrinsic");
480
        assert(result->intrinsic_id() != vmIntrinsics::_invokeGeneric, "wrong place to find this");
481
        assert(basic_signature == result->signature(), "predict the result signature");
482
        if (lt_mh.is_enabled()) {
483
          LogStream ls(lt_mh);
484
          ls.print("lookup_polymorphic_method => intrinsic ");
485
          result->print_on(&ls);
486
        }
487
      }
488
      return result;
489
    } else if (iid == vmIntrinsics::_invokeGeneric
490
               && THREAD->can_call_java()
491
               && appendix_result_or_null != nullptr) {
492
      // This is a method with type-checking semantics.
493
      // We will ask Java code to spin an adapter method for it.
494
      if (!MethodHandles::enabled()) {
495
        // Make sure the Java part of the runtime has been booted up.
496
        Klass* natives = vmClasses::MethodHandleNatives_klass();
497
        if (natives == nullptr || InstanceKlass::cast(natives)->is_not_initialized()) {
498
          SystemDictionary::resolve_or_fail(vmSymbols::java_lang_invoke_MethodHandleNatives(),
499
                                            Handle(),
500
                                            Handle(),
501
                                            true,
502
                                            CHECK_NULL);
503
        }
504
      }
505

506
      Handle appendix;
507
      Method* result = SystemDictionary::find_method_handle_invoker(klass,
508
                                                                    name,
509
                                                                    full_signature,
510
                                                                    link_info.current_klass(),
511
                                                                    &appendix,
512
                                                                    CHECK_NULL);
513
      if (lt_mh.is_enabled()) {
514
        LogStream ls(lt_mh);
515
        ls.print("lookup_polymorphic_method => (via Java) ");
516
        result->print_on(&ls);
517
        ls.print("  lookup_polymorphic_method => appendix = ");
518
        appendix.is_null() ? ls.print_cr("(none)") : appendix->print_on(&ls);
519
      }
520
      if (result != nullptr) {
521
#ifdef ASSERT
522
        ResourceMark rm(THREAD);
523

524
        TempNewSymbol basic_signature =
525
          MethodHandles::lookup_basic_type_signature(full_signature);
526
        int actual_size_of_params = result->size_of_parameters();
527
        int expected_size_of_params = ArgumentSizeComputer(basic_signature).size();
528
        // +1 for MethodHandle.this, +1 for trailing MethodType
529
        if (!MethodHandles::is_signature_polymorphic_static(iid))  expected_size_of_params += 1;
530
        if (appendix.not_null())                                   expected_size_of_params += 1;
531
        if (actual_size_of_params != expected_size_of_params) {
532
          tty->print_cr("*** basic_signature=%s", basic_signature->as_C_string());
533
          tty->print_cr("*** result for %s: ", vmIntrinsics::name_at(iid));
534
          result->print();
535
        }
536
        assert(actual_size_of_params == expected_size_of_params,
537
               "%d != %d", actual_size_of_params, expected_size_of_params);
538
#endif //ASSERT
539

540
        assert(appendix_result_or_null != nullptr, "");
541
        (*appendix_result_or_null) = appendix;
542
      }
543
      return result;
544
    }
545
  }
546
  return nullptr;
547
}
548

549
static void print_nest_host_error_on(stringStream* ss, Klass* ref_klass, Klass* sel_klass) {
550
  assert(ref_klass->is_instance_klass(), "must be");
551
  assert(sel_klass->is_instance_klass(), "must be");
552
  InstanceKlass* ref_ik = InstanceKlass::cast(ref_klass);
553
  InstanceKlass* sel_ik = InstanceKlass::cast(sel_klass);
554
  const char* nest_host_error_1 = ref_ik->nest_host_error();
555
  const char* nest_host_error_2 = sel_ik->nest_host_error();
556
  if (nest_host_error_1 != nullptr || nest_host_error_2 != nullptr) {
557
    ss->print(", (%s%s%s)",
558
              (nest_host_error_1 != nullptr) ? nest_host_error_1 : "",
559
              (nest_host_error_1 != nullptr && nest_host_error_2 != nullptr) ? ", " : "",
560
              (nest_host_error_2 != nullptr) ? nest_host_error_2 : "");
561
  }
562
}
563

564
void LinkResolver::check_method_accessability(Klass* ref_klass,
565
                                              Klass* resolved_klass,
566
                                              Klass* sel_klass,
567
                                              const methodHandle& sel_method,
568
                                              TRAPS) {
569

570
  AccessFlags flags = sel_method->access_flags();
571

572
  // Special case:  arrays always override "clone". JVMS 2.15.
573
  // If the resolved klass is an array class, and the declaring class
574
  // is java.lang.Object and the method is "clone", set the flags
575
  // to public.
576
  //
577
  // We'll check for the method name first, as that's most likely
578
  // to be false (so we'll short-circuit out of these tests).
579
  if (sel_method->name() == vmSymbols::clone_name() &&
580
      sel_klass == vmClasses::Object_klass() &&
581
      resolved_klass->is_array_klass()) {
582
    // We need to change "protected" to "public".
583
    assert(flags.is_protected(), "clone not protected?");
584
    jint new_flags = flags.as_int();
585
    new_flags = new_flags & (~JVM_ACC_PROTECTED);
586
    new_flags = new_flags | JVM_ACC_PUBLIC;
587
    flags.set_flags(new_flags);
588
  }
589
//  assert(extra_arg_result_or_null != nullptr, "must be able to return extra argument");
590

591
  bool can_access = Reflection::verify_member_access(ref_klass,
592
                                                     resolved_klass,
593
                                                     sel_klass,
594
                                                     flags,
595
                                                     true, false, CHECK);
596
  // Any existing exceptions that may have been thrown
597
  // have been allowed to propagate.
598
  if (!can_access) {
599
    ResourceMark rm(THREAD);
600
    stringStream ss;
601
    bool same_module = (sel_klass->module() == ref_klass->module());
602
    ss.print("class %s tried to access %s%s%smethod '%s' (%s%s%s)",
603
             ref_klass->external_name(),
604
             sel_method->is_abstract()  ? "abstract "  : "",
605
             sel_method->is_protected() ? "protected " : "",
606
             sel_method->is_private()   ? "private "   : "",
607
             sel_method->external_name(),
608
             (same_module) ? ref_klass->joint_in_module_of_loader(sel_klass) : ref_klass->class_in_module_of_loader(),
609
             (same_module) ? "" : "; ",
610
             (same_module) ? "" : sel_klass->class_in_module_of_loader()
611
             );
612

613
    // For private access see if there was a problem with nest host
614
    // resolution, and if so report that as part of the message.
615
    if (sel_method->is_private()) {
616
      print_nest_host_error_on(&ss, ref_klass, sel_klass);
617
    }
618

619
    Exceptions::fthrow(THREAD_AND_LOCATION,
620
                       vmSymbols::java_lang_IllegalAccessError(),
621
                       "%s",
622
                       ss.as_string()
623
                       );
624
    return;
625
  }
626
}
627

628
void LinkResolver::resolve_continuation_enter(CallInfo& callinfo, TRAPS) {
629
  Klass* resolved_klass = vmClasses::Continuation_klass();
630
  Symbol* method_name = vmSymbols::enter_name();
631
  Symbol* method_signature = vmSymbols::continuationEnter_signature();
632
  Klass*  current_klass = resolved_klass;
633
  LinkInfo link_info(resolved_klass, method_name, method_signature, current_klass);
634
  Method* resolved_method = resolve_method(link_info, Bytecodes::_invokestatic, CHECK);
635
  callinfo.set_static(resolved_klass, methodHandle(THREAD, resolved_method), CHECK);
636
}
637

638
Method* LinkResolver::resolve_method_statically(Bytecodes::Code code,
639
                                                const constantPoolHandle& pool, int index, TRAPS) {
640
  // This method is used only
641
  // (1) in C2 from InlineTree::ok_to_inline (via ciMethod::check_call),
642
  // and
643
  // (2) in Bytecode_invoke::static_target
644
  // It appears to fail when applied to an invokeinterface call site.
645
  // FIXME: Remove this method and ciMethod::check_call; refactor to use the other LinkResolver entry points.
646
  // resolve klass
647
  if (code == Bytecodes::_invokedynamic) {
648
    Klass* resolved_klass = vmClasses::MethodHandle_klass();
649
    Symbol* method_name = vmSymbols::invoke_name();
650
    Symbol* method_signature = pool->signature_ref_at(index, code);
651
    Klass*  current_klass = pool->pool_holder();
652
    LinkInfo link_info(resolved_klass, method_name, method_signature, current_klass);
653
    return resolve_method(link_info, code, THREAD);
654
  }
655

656
  LinkInfo link_info(pool, index, methodHandle(), code, CHECK_NULL);
657
  Klass* resolved_klass = link_info.resolved_klass();
658

659
  if (pool->has_preresolution()
660
      || ((resolved_klass == vmClasses::MethodHandle_klass() || resolved_klass == vmClasses::VarHandle_klass()) &&
661
          MethodHandles::is_signature_polymorphic_name(resolved_klass, link_info.name()))) {
662
    Method* result = ConstantPool::method_at_if_loaded(pool, index);
663
    if (result != nullptr) {
664
      return result;
665
    }
666
  }
667

668
  if (code == Bytecodes::_invokeinterface) {
669
    return resolve_interface_method(link_info, code, THREAD);
670
  } else if (code == Bytecodes::_invokevirtual) {
671
    return resolve_method(link_info, code, THREAD);
672
  } else if (!resolved_klass->is_interface()) {
673
    return resolve_method(link_info, code, THREAD);
674
  } else {
675
    return resolve_interface_method(link_info, code, THREAD);
676
  }
677
}
678

679
// Check and print a loader constraint violation message for method or interface method
680
void LinkResolver::check_method_loader_constraints(const LinkInfo& link_info,
681
                                                   const methodHandle& resolved_method,
682
                                                   const char* method_type, TRAPS) {
683
  Handle current_loader(THREAD, link_info.current_klass()->class_loader());
684
  Handle resolved_loader(THREAD, resolved_method->method_holder()->class_loader());
685

686
  ResourceMark rm(THREAD);
687
  Symbol* failed_type_symbol =
688
    SystemDictionary::check_signature_loaders(link_info.signature(),
689
                                              /*klass_being_linked*/ nullptr, // We are not linking class
690
                                              current_loader,
691
                                              resolved_loader, true);
692
  if (failed_type_symbol != nullptr) {
693
    Klass* current_class = link_info.current_klass();
694
    ClassLoaderData* current_loader_data = current_class->class_loader_data();
695
    assert(current_loader_data != nullptr, "current class has no class loader data");
696
    Klass* resolved_method_class = resolved_method->method_holder();
697
    ClassLoaderData* target_loader_data = resolved_method_class->class_loader_data();
698
    assert(target_loader_data != nullptr, "resolved method's class has no class loader data");
699

700
    stringStream ss;
701
    ss.print("loader constraint violation: when resolving %s '", method_type);
702
    Method::print_external_name(&ss, link_info.resolved_klass(), link_info.name(), link_info.signature());
703
    ss.print("' the class loader %s of the current class, %s,"
704
             " and the class loader %s for the method's defining class, %s, have"
705
             " different Class objects for the type %s used in the signature (%s; %s)",
706
             current_loader_data->loader_name_and_id(),
707
             current_class->name()->as_C_string(),
708
             target_loader_data->loader_name_and_id(),
709
             resolved_method_class->name()->as_C_string(),
710
             failed_type_symbol->as_C_string(),
711
             current_class->class_in_module_of_loader(false, true),
712
             resolved_method_class->class_in_module_of_loader(false, true));
713
    THROW_MSG(vmSymbols::java_lang_LinkageError(), ss.as_string());
714
  }
715
}
716

717
void LinkResolver::check_field_loader_constraints(Symbol* field, Symbol* sig,
718
                                                  Klass* current_klass,
719
                                                  Klass* sel_klass, TRAPS) {
720
  Handle ref_loader(THREAD, current_klass->class_loader());
721
  Handle sel_loader(THREAD, sel_klass->class_loader());
722

723
  ResourceMark rm(THREAD);  // needed for check_signature_loaders
724
  Symbol* failed_type_symbol =
725
    SystemDictionary::check_signature_loaders(sig,
726
                                              /*klass_being_linked*/ nullptr, // We are not linking class
727
                                              ref_loader, sel_loader,
728
                                              false);
729
  if (failed_type_symbol != nullptr) {
730
    stringStream ss;
731
    const char* failed_type_name = failed_type_symbol->as_klass_external_name();
732

733
    ss.print("loader constraint violation: when resolving field \"%s\" of type %s, "
734
             "the class loader %s of the current class, %s, "
735
             "and the class loader %s for the field's defining %s, %s, "
736
             "have different Class objects for type %s (%s; %s)",
737
             field->as_C_string(),
738
             failed_type_name,
739
             current_klass->class_loader_data()->loader_name_and_id(),
740
             current_klass->external_name(),
741
             sel_klass->class_loader_data()->loader_name_and_id(),
742
             sel_klass->external_kind(),
743
             sel_klass->external_name(),
744
             failed_type_name,
745
             current_klass->class_in_module_of_loader(false, true),
746
             sel_klass->class_in_module_of_loader(false, true));
747
    THROW_MSG(vmSymbols::java_lang_LinkageError(), ss.as_string());
748
  }
749
}
750

751
Method* LinkResolver::resolve_method(const LinkInfo& link_info,
752
                                     Bytecodes::Code code, TRAPS) {
753

754
  Handle nested_exception;
755
  Klass* resolved_klass = link_info.resolved_klass();
756

757
  // 1. For invokevirtual, cannot call an interface method
758
  if (code == Bytecodes::_invokevirtual && resolved_klass->is_interface()) {
759
    ResourceMark rm(THREAD);
760
    char buf[200];
761
    jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected",
762
        resolved_klass->external_name());
763
    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
764
  }
765

766
  // 2. check constant pool tag for called method - must be JVM_CONSTANT_Methodref
767
  if (!link_info.tag().is_invalid() && !link_info.tag().is_method()) {
768
    ResourceMark rm(THREAD);
769
    stringStream ss;
770
    ss.print("Method '");
771
    Method::print_external_name(&ss, link_info.resolved_klass(), link_info.name(), link_info.signature());
772
    ss.print("' must be Methodref constant");
773
    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), ss.as_string());
774
  }
775

776
  // 3. lookup method in resolved klass and its super klasses
777
  methodHandle resolved_method(THREAD, lookup_method_in_klasses(link_info, true, false));
778

779
  // 4. lookup method in all the interfaces implemented by the resolved klass
780
  if (resolved_method.is_null() && !resolved_klass->is_array_klass()) { // not found in the class hierarchy
781
    resolved_method = methodHandle(THREAD, lookup_method_in_interfaces(link_info));
782

783
    if (resolved_method.is_null()) {
784
      // JSR 292:  see if this is an implicitly generated method MethodHandle.linkToVirtual(*...), etc
785
      Method* method = lookup_polymorphic_method(link_info, (Handle*)nullptr, THREAD);
786
      resolved_method = methodHandle(THREAD, method);
787
      if (HAS_PENDING_EXCEPTION) {
788
        nested_exception = Handle(THREAD, PENDING_EXCEPTION);
789
        CLEAR_PENDING_EXCEPTION;
790
      }
791
    }
792
  }
793

794
  // 5. method lookup failed
795
  if (resolved_method.is_null()) {
796
    ResourceMark rm(THREAD);
797
    stringStream ss;
798
    ss.print("'");
799
    Method::print_external_name(&ss, resolved_klass, link_info.name(), link_info.signature());
800
    ss.print("'");
801
    THROW_MSG_CAUSE_(vmSymbols::java_lang_NoSuchMethodError(),
802
                     ss.as_string(), nested_exception, nullptr);
803
  }
804

805
  // 6. access checks, access checking may be turned off when calling from within the VM.
806
  Klass* current_klass = link_info.current_klass();
807
  if (link_info.check_access()) {
808
    assert(current_klass != nullptr , "current_klass should not be null");
809

810
    // check if method can be accessed by the referring class
811
    check_method_accessability(current_klass,
812
                               resolved_klass,
813
                               resolved_method->method_holder(),
814
                               resolved_method,
815
                               CHECK_NULL);
816
  }
817
  if (link_info.check_loader_constraints()) {
818
    // check loader constraints
819
    check_method_loader_constraints(link_info, resolved_method, "method", CHECK_NULL);
820
  }
821

822
  return resolved_method();
823
}
824

825
static void trace_method_resolution(const char* prefix,
826
                                    Klass* klass,
827
                                    Klass* resolved_klass,
828
                                    Method* method,
829
                                    bool logitables,
830
                                    int index = -1) {
831
#ifndef PRODUCT
832
  ResourceMark rm;
833
  Log(itables) logi;
834
  LogStream lsi(logi.trace());
835
  Log(vtables) logv;
836
  LogStream lsv(logv.trace());
837
  outputStream* st;
838
  if (logitables) {
839
    st = &lsi;
840
  } else {
841
    st = &lsv;
842
  }
843
  st->print("%s%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
844
            prefix,
845
            (klass == nullptr ? "<null>" : klass->internal_name()),
846
            resolved_klass->internal_name(),
847
            Method::name_and_sig_as_C_string(resolved_klass,
848
                                             method->name(),
849
                                             method->signature()),
850
            method->method_holder()->internal_name());
851
  method->print_linkage_flags(st);
852
  if (index != -1) {
853
    st->print("vtable_index:%d", index);
854
  }
855
  st->cr();
856
#endif // PRODUCT
857
}
858

859
// Do linktime resolution of a method in the interface within the context of the specified bytecode.
860
Method* LinkResolver::resolve_interface_method(const LinkInfo& link_info, Bytecodes::Code code, TRAPS) {
861

862
  Klass* resolved_klass = link_info.resolved_klass();
863

864
  // check if klass is interface
865
  if (!resolved_klass->is_interface()) {
866
    ResourceMark rm(THREAD);
867
    char buf[200];
868
    jio_snprintf(buf, sizeof(buf), "Found class %s, but interface was expected", resolved_klass->external_name());
869
    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
870
  }
871

872
  // check constant pool tag for called method - must be JVM_CONSTANT_InterfaceMethodref
873
  if (!link_info.tag().is_invalid() && !link_info.tag().is_interface_method()) {
874
    ResourceMark rm(THREAD);
875
    stringStream ss;
876
    ss.print("Method '");
877
    Method::print_external_name(&ss, link_info.resolved_klass(), link_info.name(), link_info.signature());
878
    ss.print("' must be InterfaceMethodref constant");
879
    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), ss.as_string());
880
  }
881

882
  // lookup method in this interface or its super, java.lang.Object
883
  // JDK8: also look for static methods
884
  methodHandle resolved_method(THREAD, lookup_method_in_klasses(link_info, false, true));
885

886
  if (resolved_method.is_null() && !resolved_klass->is_array_klass()) {
887
    // lookup method in all the super-interfaces
888
    resolved_method = methodHandle(THREAD, lookup_method_in_interfaces(link_info));
889
  }
890

891
  if (resolved_method.is_null()) {
892
    // no method found
893
    ResourceMark rm(THREAD);
894
    stringStream ss;
895
    ss.print("'");
896
    Method::print_external_name(&ss, resolved_klass, link_info.name(), link_info.signature());
897
    ss.print("'");
898
    THROW_MSG_NULL(vmSymbols::java_lang_NoSuchMethodError(), ss.as_string());
899
  }
900

901
  if (link_info.check_access()) {
902
    // JDK8 adds non-public interface methods, and accessability check requirement
903
    Klass* current_klass = link_info.current_klass();
904

905
    assert(current_klass != nullptr , "current_klass should not be null");
906

907
    // check if method can be accessed by the referring class
908
    check_method_accessability(current_klass,
909
                               resolved_klass,
910
                               resolved_method->method_holder(),
911
                               resolved_method,
912
                               CHECK_NULL);
913
  }
914
  if (link_info.check_loader_constraints()) {
915
    check_method_loader_constraints(link_info, resolved_method, "interface method", CHECK_NULL);
916
  }
917

918
  if (code != Bytecodes::_invokestatic && resolved_method->is_static()) {
919
    ResourceMark rm(THREAD);
920
    stringStream ss;
921
    ss.print("Expected instance not static method '");
922
    Method::print_external_name(&ss, resolved_klass,
923
                                resolved_method->name(), resolved_method->signature());
924
    ss.print("'");
925
    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), ss.as_string());
926
  }
927

928
  if (log_develop_is_enabled(Trace, itables)) {
929
    char buf[200];
930
    jio_snprintf(buf, sizeof(buf), "%s resolved interface method: caller-class:",
931
                 Bytecodes::name(code));
932
    trace_method_resolution(buf, link_info.current_klass(), resolved_klass, resolved_method(), true);
933
  }
934

935
  return resolved_method();
936
}
937

938
//------------------------------------------------------------------------------------------------------------------------
939
// Field resolution
940

941
void LinkResolver::check_field_accessability(Klass* ref_klass,
942
                                             Klass* resolved_klass,
943
                                             Klass* sel_klass,
944
                                             const fieldDescriptor& fd,
945
                                             TRAPS) {
946
  bool can_access = Reflection::verify_member_access(ref_klass,
947
                                                     resolved_klass,
948
                                                     sel_klass,
949
                                                     fd.access_flags(),
950
                                                     true, false, CHECK);
951
  // Any existing exceptions that may have been thrown, for example LinkageErrors
952
  // from nest-host resolution, have been allowed to propagate.
953
  if (!can_access) {
954
    bool same_module = (sel_klass->module() == ref_klass->module());
955
    ResourceMark rm(THREAD);
956
    stringStream ss;
957
    ss.print("class %s tried to access %s%sfield %s.%s (%s%s%s)",
958
             ref_klass->external_name(),
959
             fd.is_protected() ? "protected " : "",
960
             fd.is_private()   ? "private "   : "",
961
             sel_klass->external_name(),
962
             fd.name()->as_C_string(),
963
             (same_module) ? ref_klass->joint_in_module_of_loader(sel_klass) : ref_klass->class_in_module_of_loader(),
964
             (same_module) ? "" : "; ",
965
             (same_module) ? "" : sel_klass->class_in_module_of_loader()
966
             );
967
    // For private access see if there was a problem with nest host
968
    // resolution, and if so report that as part of the message.
969
    if (fd.is_private()) {
970
      print_nest_host_error_on(&ss, ref_klass, sel_klass);
971
    }
972
    Exceptions::fthrow(THREAD_AND_LOCATION,
973
                       vmSymbols::java_lang_IllegalAccessError(),
974
                       "%s",
975
                       ss.as_string()
976
                       );
977
    return;
978
  }
979
}
980

981
void LinkResolver::resolve_field_access(fieldDescriptor& fd,
982
                                        const constantPoolHandle& pool,
983
                                        int index,
984
                                        const methodHandle& method,
985
                                        Bytecodes::Code byte,
986
                                        bool initialize_class, TRAPS) {
987
  LinkInfo link_info(pool, index, method, byte, CHECK);
988
  resolve_field(fd, link_info, byte, initialize_class, CHECK);
989
}
990

991
void LinkResolver::resolve_field(fieldDescriptor& fd,
992
                                 const LinkInfo& link_info,
993
                                 Bytecodes::Code byte, bool initialize_class,
994
                                 TRAPS) {
995
  assert(byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic ||
996
         byte == Bytecodes::_getfield  || byte == Bytecodes::_putfield  ||
997
         byte == Bytecodes::_nofast_getfield  || byte == Bytecodes::_nofast_putfield  ||
998
         (byte == Bytecodes::_nop && !link_info.check_access()), "bad field access bytecode");
999

1000
  bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
1001
  bool is_put    = (byte == Bytecodes::_putfield  || byte == Bytecodes::_putstatic || byte == Bytecodes::_nofast_putfield);
1002
  // Check if there's a resolved klass containing the field
1003
  Klass* resolved_klass = link_info.resolved_klass();
1004
  Symbol* field = link_info.name();
1005
  Symbol* sig = link_info.signature();
1006

1007
  // Resolve instance field
1008
  Klass* sel_klass = resolved_klass->find_field(field, sig, &fd);
1009
  // check if field exists; i.e., if a klass containing the field def has been selected
1010
  if (sel_klass == nullptr) {
1011
    ResourceMark rm(THREAD);
1012
    stringStream ss;
1013
    ss.print("Class %s does not have member field '", resolved_klass->external_name());
1014
    sig->print_as_field_external_type(&ss);
1015
    ss.print(" %s'", field->as_C_string());
1016
    THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), ss.as_string());
1017
  }
1018

1019
  // Access checking may be turned off when calling from within the VM.
1020
  Klass* current_klass = link_info.current_klass();
1021
  if (link_info.check_access()) {
1022

1023
    // check access
1024
    check_field_accessability(current_klass, resolved_klass, sel_klass, fd, CHECK);
1025

1026
    // check for errors
1027
    if (is_static != fd.is_static()) {
1028
      ResourceMark rm(THREAD);
1029
      char msg[200];
1030
      jio_snprintf(msg, sizeof(msg), "Expected %s field %s.%s", is_static ? "static" : "non-static", resolved_klass->external_name(), fd.name()->as_C_string());
1031
      THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), msg);
1032
    }
1033

1034
    // A final field can be modified only
1035
    // (1) by methods declared in the class declaring the field and
1036
    // (2) by the <clinit> method (in case of a static field)
1037
    //     or by the <init> method (in case of an instance field).
1038
    if (is_put && fd.access_flags().is_final()) {
1039

1040
      if (sel_klass != current_klass) {
1041
        ResourceMark rm(THREAD);
1042
        stringStream ss;
1043
        ss.print("Update to %s final field %s.%s attempted from a different class (%s) than the field's declaring class",
1044
                 is_static ? "static" : "non-static", resolved_klass->external_name(), fd.name()->as_C_string(),
1045
                current_klass->external_name());
1046
        THROW_MSG(vmSymbols::java_lang_IllegalAccessError(), ss.as_string());
1047
      }
1048

1049
      if (fd.constants()->pool_holder()->major_version() >= 53) {
1050
        Method* m = link_info.current_method();
1051
        assert(m != nullptr, "information about the current method must be available for 'put' bytecodes");
1052
        bool is_initialized_static_final_update = (byte == Bytecodes::_putstatic &&
1053
                                                   fd.is_static() &&
1054
                                                   !m->is_static_initializer());
1055
        bool is_initialized_instance_final_update = ((byte == Bytecodes::_putfield || byte == Bytecodes::_nofast_putfield) &&
1056
                                                     !fd.is_static() &&
1057
                                                     !m->is_object_initializer());
1058

1059
        if (is_initialized_static_final_update || is_initialized_instance_final_update) {
1060
          ResourceMark rm(THREAD);
1061
          stringStream ss;
1062
          ss.print("Update to %s final field %s.%s attempted from a different method (%s) than the initializer method %s ",
1063
                   is_static ? "static" : "non-static", resolved_klass->external_name(), fd.name()->as_C_string(),
1064
                   m->name()->as_C_string(),
1065
                   is_static ? "<clinit>" : "<init>");
1066
          THROW_MSG(vmSymbols::java_lang_IllegalAccessError(), ss.as_string());
1067
        }
1068
      }
1069
    }
1070

1071
    // initialize resolved_klass if necessary
1072
    // note 1: the klass which declared the field must be initialized (i.e, sel_klass)
1073
    //         according to the newest JVM spec (5.5, p.170) - was bug (gri 7/28/99)
1074
    //
1075
    // note 2: we don't want to force initialization if we are just checking
1076
    //         if the field access is legal; e.g., during compilation
1077
    if (is_static && initialize_class) {
1078
      sel_klass->initialize(CHECK);
1079
    }
1080
  }
1081

1082
  if (link_info.check_loader_constraints() && (sel_klass != current_klass) && (current_klass != nullptr)) {
1083
    check_field_loader_constraints(field, sig, current_klass, sel_klass, CHECK);
1084
  }
1085

1086
  // return information. note that the klass is set to the actual klass containing the
1087
  // field, otherwise access of static fields in superclasses will not work.
1088
}
1089

1090

1091
//------------------------------------------------------------------------------------------------------------------------
1092
// Invoke resolution
1093
//
1094
// Naming conventions:
1095
//
1096
// resolved_method    the specified method (i.e., static receiver specified via constant pool index)
1097
// sel_method         the selected method  (selected via run-time lookup; e.g., based on dynamic receiver class)
1098
// resolved_klass     the specified klass  (i.e., specified via constant pool index)
1099
// recv_klass         the receiver klass
1100

1101

1102
void LinkResolver::resolve_static_call(CallInfo& result,
1103
                                       const LinkInfo& link_info,
1104
                                       bool initialize_class, TRAPS) {
1105
  Method* resolved_method = linktime_resolve_static_method(link_info, CHECK);
1106

1107
  // The resolved class can change as a result of this resolution.
1108
  Klass* resolved_klass = resolved_method->method_holder();
1109

1110
  // Initialize klass (this should only happen if everything is ok)
1111
  if (initialize_class && resolved_klass->should_be_initialized()) {
1112
    resolved_klass->initialize(CHECK);
1113
    // Use updated LinkInfo to reresolve with resolved method holder
1114
    LinkInfo new_info(resolved_klass, link_info.name(), link_info.signature(),
1115
                      link_info.current_klass(),
1116
                      link_info.check_access() ? LinkInfo::AccessCheck::required : LinkInfo::AccessCheck::skip,
1117
                      link_info.check_loader_constraints() ? LinkInfo::LoaderConstraintCheck::required : LinkInfo::LoaderConstraintCheck::skip);
1118
    resolved_method = linktime_resolve_static_method(new_info, CHECK);
1119
  }
1120

1121
  // setup result
1122
  result.set_static(resolved_klass, methodHandle(THREAD, resolved_method), CHECK);
1123
  JFR_ONLY(Jfr::on_resolution(result, CHECK);)
1124
}
1125

1126
// throws linktime exceptions
1127
Method* LinkResolver::linktime_resolve_static_method(const LinkInfo& link_info, TRAPS) {
1128

1129
  Klass* resolved_klass = link_info.resolved_klass();
1130
  Method* resolved_method;
1131
  if (!resolved_klass->is_interface()) {
1132
    resolved_method = resolve_method(link_info, Bytecodes::_invokestatic, CHECK_NULL);
1133
  } else {
1134
    resolved_method = resolve_interface_method(link_info, Bytecodes::_invokestatic, CHECK_NULL);
1135
  }
1136
  assert(resolved_method->name() != vmSymbols::class_initializer_name(), "should have been checked in verifier");
1137

1138
  // check if static
1139
  if (!resolved_method->is_static()) {
1140
    ResourceMark rm(THREAD);
1141
    stringStream ss;
1142
    ss.print("Expected static method '");
1143
    resolved_method->print_external_name(&ss);
1144
    ss.print("'");
1145
    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), ss.as_string());
1146
  }
1147
  return resolved_method;
1148
}
1149

1150

1151
void LinkResolver::resolve_special_call(CallInfo& result,
1152
                                        Handle recv,
1153
                                        const LinkInfo& link_info,
1154
                                        TRAPS) {
1155
  Method* resolved_method = linktime_resolve_special_method(link_info, CHECK);
1156
  runtime_resolve_special_method(result, link_info, methodHandle(THREAD, resolved_method), recv, CHECK);
1157
}
1158

1159
void LinkResolver::cds_resolve_special_call(CallInfo& result, const LinkInfo& link_info, TRAPS) {
1160
  resolve_special_call(result, Handle(), link_info, CHECK);
1161
}
1162

1163
// throws linktime exceptions
1164
Method* LinkResolver::linktime_resolve_special_method(const LinkInfo& link_info, TRAPS) {
1165

1166
  // Invokespecial is called for multiple special reasons:
1167
  // <init>
1168
  // local private method invocation, for classes and interfaces
1169
  // superclass.method, which can also resolve to a default method
1170
  // and the selected method is recalculated relative to the direct superclass
1171
  // superinterface.method, which explicitly does not check shadowing
1172
  Klass* resolved_klass = link_info.resolved_klass();
1173
  Method* resolved_method = nullptr;
1174

1175
  if (!resolved_klass->is_interface()) {
1176
    resolved_method = resolve_method(link_info, Bytecodes::_invokespecial, CHECK_NULL);
1177
  } else {
1178
    resolved_method = resolve_interface_method(link_info, Bytecodes::_invokespecial, CHECK_NULL);
1179
  }
1180

1181
  // check if method name is <init>, that it is found in same klass as static type
1182
  if (resolved_method->name() == vmSymbols::object_initializer_name() &&
1183
      resolved_method->method_holder() != resolved_klass) {
1184
    ResourceMark rm(THREAD);
1185
    stringStream ss;
1186
    ss.print("%s: method '", resolved_klass->external_name());
1187
    resolved_method->signature()->print_as_signature_external_return_type(&ss);
1188
    ss.print(" %s(", resolved_method->name()->as_C_string());
1189
    resolved_method->signature()->print_as_signature_external_parameters(&ss);
1190
    ss.print(")' not found");
1191
    Exceptions::fthrow(
1192
      THREAD_AND_LOCATION,
1193
      vmSymbols::java_lang_NoSuchMethodError(),
1194
      "%s", ss.as_string());
1195
    return nullptr;
1196
  }
1197

1198
  // ensure that invokespecial's interface method reference is in
1199
  // a direct superinterface, not an indirect superinterface
1200
  Klass* current_klass = link_info.current_klass();
1201
  if (current_klass != nullptr && resolved_klass->is_interface()) {
1202
    InstanceKlass* klass_to_check = InstanceKlass::cast(current_klass);
1203
    // Disable verification for the dynamically-generated reflection bytecodes
1204
    // for serialization constructor accessor.
1205
    bool is_reflect = klass_to_check->is_subclass_of(
1206
                        vmClasses::reflect_SerializationConstructorAccessorImpl_klass());
1207

1208
    if (!is_reflect &&
1209
        !klass_to_check->is_same_or_direct_interface(resolved_klass)) {
1210
      ResourceMark rm(THREAD);
1211
      stringStream ss;
1212
      ss.print("Interface method reference: '");
1213
      resolved_method->print_external_name(&ss);
1214
      ss.print("', is in an indirect superinterface of %s",
1215
               current_klass->external_name());
1216
      THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), ss.as_string());
1217
    }
1218
  }
1219

1220
  // check if not static
1221
  if (resolved_method->is_static()) {
1222
    ResourceMark rm(THREAD);
1223
    stringStream ss;
1224
    ss.print("Expecting non-static method '");
1225
    resolved_method->print_external_name(&ss);
1226
    ss.print("'");
1227
    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), ss.as_string());
1228
  }
1229

1230
  if (log_develop_is_enabled(Trace, itables)) {
1231
    trace_method_resolution("invokespecial resolved method: caller-class:",
1232
                            current_klass, resolved_klass, resolved_method, true);
1233
  }
1234

1235
  return resolved_method;
1236
}
1237

1238
// throws runtime exceptions
1239
void LinkResolver::runtime_resolve_special_method(CallInfo& result,
1240
                                                  const LinkInfo& link_info,
1241
                                                  const methodHandle& resolved_method,
1242
                                                  Handle recv, TRAPS) {
1243

1244
  Klass* resolved_klass = link_info.resolved_klass();
1245

1246
  // resolved method is selected method unless we have an old-style lookup
1247
  // for a superclass method
1248
  // Invokespecial for a superinterface, resolved method is selected method,
1249
  // no checks for shadowing
1250
  methodHandle sel_method(THREAD, resolved_method());
1251

1252
  if (link_info.check_access() &&
1253
      // check if the method is not <init>
1254
      resolved_method->name() != vmSymbols::object_initializer_name()) {
1255

1256
    Klass* current_klass = link_info.current_klass();
1257

1258
    // Check if the class of the resolved_klass is a superclass
1259
    // (not supertype in order to exclude interface classes) of the current class.
1260
    // This check is not performed for super.invoke for interface methods
1261
    // in super interfaces.
1262
    if (current_klass->is_subclass_of(resolved_klass) &&
1263
        current_klass != resolved_klass) {
1264
      // Lookup super method
1265
      Klass* super_klass = current_klass->super();
1266
      Method* instance_method = lookup_instance_method_in_klasses(super_klass,
1267
                                                     resolved_method->name(),
1268
                                                     resolved_method->signature(),
1269
                                                     Klass::PrivateLookupMode::find);
1270
      sel_method = methodHandle(THREAD, instance_method);
1271

1272
      // check if found
1273
      if (sel_method.is_null()) {
1274
        ResourceMark rm(THREAD);
1275
        stringStream ss;
1276
        ss.print("'");
1277
        resolved_method->print_external_name(&ss);
1278
        ss.print("'");
1279
        THROW_MSG(vmSymbols::java_lang_AbstractMethodError(), ss.as_string());
1280
      // check loader constraints if found a different method
1281
      } else if (link_info.check_loader_constraints() && sel_method() != resolved_method()) {
1282
        check_method_loader_constraints(link_info, sel_method, "method", CHECK);
1283
      }
1284
    }
1285

1286
    // Check that the class of objectref (the receiver) is the current class or interface,
1287
    // or a subtype of the current class or interface (the sender), otherwise invokespecial
1288
    // throws IllegalAccessError.
1289
    // The verifier checks that the sender is a subtype of the class in the I/MR operand.
1290
    // The verifier also checks that the receiver is a subtype of the sender, if the sender is
1291
    // a class.  If the sender is an interface, the check has to be performed at runtime.
1292
    InstanceKlass* sender = InstanceKlass::cast(current_klass);
1293
    if (sender->is_interface() && recv.not_null()) {
1294
      Klass* receiver_klass = recv->klass();
1295
      if (!receiver_klass->is_subtype_of(sender)) {
1296
        ResourceMark rm(THREAD);
1297
        char buf[500];
1298
        jio_snprintf(buf, sizeof(buf),
1299
                     "Receiver class %s must be the current class or a subtype of interface %s",
1300
                     receiver_klass->external_name(),
1301
                     sender->external_name());
1302
        THROW_MSG(vmSymbols::java_lang_IllegalAccessError(), buf);
1303
      }
1304
    }
1305
  }
1306

1307
  // check if not static
1308
  if (sel_method->is_static()) {
1309
    ResourceMark rm(THREAD);
1310
    stringStream ss;
1311
    ss.print("Expecting non-static method '");
1312
    resolved_method->print_external_name(&ss);
1313
    ss.print("'");
1314
    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), ss.as_string());
1315
  }
1316

1317
  // check if abstract
1318
  if (sel_method->is_abstract()) {
1319
    ResourceMark rm(THREAD);
1320
    stringStream ss;
1321
    ss.print("'");
1322
    Method::print_external_name(&ss, resolved_klass, sel_method->name(), sel_method->signature());
1323
    ss.print("'");
1324
    THROW_MSG(vmSymbols::java_lang_AbstractMethodError(), ss.as_string());
1325
  }
1326

1327
  if (log_develop_is_enabled(Trace, itables)) {
1328
    trace_method_resolution("invokespecial selected method: resolved-class:",
1329
                            resolved_klass, resolved_klass, sel_method(), true);
1330
  }
1331

1332
  // setup result
1333
  result.set_static(resolved_klass, sel_method, CHECK);
1334
  JFR_ONLY(Jfr::on_resolution(result, CHECK);)
1335
}
1336

1337
void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, Klass* receiver_klass,
1338
                                        const LinkInfo& link_info,
1339
                                        bool check_null_and_abstract, TRAPS) {
1340
  Method* resolved_method = linktime_resolve_virtual_method(link_info, CHECK);
1341
  runtime_resolve_virtual_method(result, methodHandle(THREAD, resolved_method),
1342
                                 link_info.resolved_klass(),
1343
                                 recv, receiver_klass,
1344
                                 check_null_and_abstract,
1345
                                 /*is_abstract_interpretation*/ false, CHECK);
1346
}
1347

1348
void LinkResolver::cds_resolve_virtual_call(CallInfo& result, const LinkInfo& link_info, TRAPS) {
1349
  Method* resolved_method = linktime_resolve_virtual_method(link_info, CHECK);
1350
  runtime_resolve_virtual_method(result, methodHandle(THREAD, resolved_method),
1351
                                 link_info.resolved_klass(),
1352
                                 Handle(), nullptr,
1353
                                 /*check_null_and_abstract*/ false,
1354
                                 /*is_abstract_interpretation*/ true, CHECK);
1355
}
1356

1357
// throws linktime exceptions
1358
Method* LinkResolver::linktime_resolve_virtual_method(const LinkInfo& link_info,
1359
                                                           TRAPS) {
1360
  // normal method resolution
1361
  Method* resolved_method = resolve_method(link_info, Bytecodes::_invokevirtual, CHECK_NULL);
1362

1363
  assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
1364
  assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
1365

1366
  // check if private interface method
1367
  Klass* resolved_klass = link_info.resolved_klass();
1368
  Klass* current_klass = link_info.current_klass();
1369

1370
  // This is impossible, if resolve_klass is an interface, we've thrown icce in resolve_method
1371
  if (resolved_klass->is_interface() && resolved_method->is_private()) {
1372
    ResourceMark rm(THREAD);
1373
    stringStream ss;
1374
    ss.print("private interface method requires invokespecial, not invokevirtual: method '");
1375
    resolved_method->print_external_name(&ss);
1376
    ss.print("', caller-class: %s",
1377
             (current_klass == nullptr ? "<null>" : current_klass->internal_name()));
1378
    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), ss.as_string());
1379
  }
1380

1381
  // check if not static
1382
  if (resolved_method->is_static()) {
1383
    ResourceMark rm(THREAD);
1384
    stringStream ss;
1385
    ss.print("Expecting non-static method '");
1386
    resolved_method->print_external_name(&ss);
1387
    ss.print("'");
1388
    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), ss.as_string());
1389
  }
1390

1391
  if (log_develop_is_enabled(Trace, vtables)) {
1392
    trace_method_resolution("invokevirtual resolved method: caller-class:",
1393
                            current_klass, resolved_klass, resolved_method, false);
1394
  }
1395

1396
  return resolved_method;
1397
}
1398

1399
// throws runtime exceptions
1400
void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
1401
                                                  const methodHandle& resolved_method,
1402
                                                  Klass* resolved_klass,
1403
                                                  Handle recv,
1404
                                                  Klass* recv_klass,
1405
                                                  bool check_null_and_abstract,
1406
                                                  bool is_abstract_interpretation,
1407
                                                  TRAPS) {
1408
  // is_abstract_interpretation is true IFF CDS is resolving method references without
1409
  // running any actual bytecode. Therefore, we don't have an actual recv/recv_klass, so
1410
  // we cannot check the actual selected_method (which is not needed by CDS anyway).
1411

1412
  // setup default return values
1413
  int vtable_index = Method::invalid_vtable_index;
1414
  methodHandle selected_method;
1415

1416
  // runtime method resolution
1417
  if (check_null_and_abstract && recv.is_null()) { // check if receiver exists
1418
    THROW(vmSymbols::java_lang_NullPointerException());
1419
  }
1420

1421
  // Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s
1422
  // has not been rewritten, and the vtable initialized. Make sure to do this after the nullcheck, since
1423
  // a missing receiver might result in a bogus lookup.
1424
  assert(resolved_method->method_holder()->is_linked(), "must be linked");
1425

1426
  // do lookup based on receiver klass using the vtable index
1427
  if (resolved_method->method_holder()->is_interface()) { // default or miranda method
1428
    vtable_index = vtable_index_of_interface_method(resolved_klass, resolved_method);
1429
    assert(vtable_index >= 0 , "we should have valid vtable index at this point");
1430

1431
    if (!is_abstract_interpretation) {
1432
      selected_method = methodHandle(THREAD, recv_klass->method_at_vtable(vtable_index));
1433
    }
1434
  } else {
1435
    // at this point we are sure that resolved_method is virtual and not
1436
    // a default or miranda method; therefore, it must have a valid vtable index.
1437
    assert(!resolved_method->has_itable_index(), "");
1438
    vtable_index = resolved_method->vtable_index();
1439
    // We could get a negative vtable_index of nonvirtual_vtable_index for private
1440
    // methods, or for final methods. Private methods never appear in the vtable
1441
    // and never override other methods. As an optimization, final methods are
1442
    // never put in the vtable, unless they override an existing method.
1443
    // So if we do get nonvirtual_vtable_index, it means the selected method is the
1444
    // resolved method, and it can never be changed by an override.
1445
    if (vtable_index == Method::nonvirtual_vtable_index) {
1446
      assert(resolved_method->can_be_statically_bound(), "cannot override this method");
1447
      if (!is_abstract_interpretation) {
1448
        selected_method = resolved_method;
1449
      }
1450
    } else {
1451
      if (!is_abstract_interpretation) {
1452
        selected_method = methodHandle(THREAD, recv_klass->method_at_vtable(vtable_index));
1453
      }
1454
    }
1455
  }
1456

1457
  if (!is_abstract_interpretation) {
1458
    // check if method exists
1459
    if (selected_method.is_null()) {
1460
      throw_abstract_method_error(resolved_method, recv_klass, CHECK);
1461
    }
1462

1463
    // check if abstract
1464
    if (check_null_and_abstract && selected_method->is_abstract()) {
1465
      // Pass arguments for generating a verbose error message.
1466
      throw_abstract_method_error(resolved_method, selected_method, recv_klass, CHECK);
1467
    }
1468

1469
    if (log_develop_is_enabled(Trace, vtables)) {
1470
      trace_method_resolution("invokevirtual selected method: receiver-class:",
1471
                              recv_klass, resolved_klass, selected_method(),
1472
                              false, vtable_index);
1473
    }
1474
  }
1475

1476
  // setup result
1477
  result.set_virtual(resolved_klass, resolved_method, selected_method, vtable_index, CHECK);
1478
  if (selected_method.not_null()) {
1479
    JFR_ONLY(Jfr::on_resolution(result, CHECK);)
1480
  }
1481
}
1482

1483
void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, Klass* recv_klass,
1484
                                          const LinkInfo& link_info,
1485
                                          bool check_null_and_abstract, TRAPS) {
1486
  // throws linktime exceptions
1487
  Method* resolved_method = linktime_resolve_interface_method(link_info, CHECK);
1488
  methodHandle mh(THREAD, resolved_method);
1489
  runtime_resolve_interface_method(result, mh, link_info.resolved_klass(),
1490
                                   recv, recv_klass, check_null_and_abstract,
1491
                                   /*is_abstract_interpretation*/ false, CHECK);
1492
}
1493

1494
void LinkResolver::cds_resolve_interface_call(CallInfo& result, const LinkInfo& link_info, TRAPS) {
1495
  Method* resolved_method = linktime_resolve_interface_method(link_info, CHECK);
1496
  runtime_resolve_interface_method(result, methodHandle(THREAD, resolved_method), link_info.resolved_klass(),
1497
                                   Handle(), nullptr,
1498
                                   /*check_null_and_abstract*/ false,
1499
                                   /*is_abstract_interpretation*/ true, CHECK);
1500
}
1501

1502
Method* LinkResolver::linktime_resolve_interface_method(const LinkInfo& link_info,
1503
                                                             TRAPS) {
1504
  // normal interface method resolution
1505
  Method* resolved_method = resolve_interface_method(link_info, Bytecodes::_invokeinterface, CHECK_NULL);
1506
  assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
1507
  assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
1508

1509
  return resolved_method;
1510
}
1511

1512
// throws runtime exceptions
1513
void LinkResolver::runtime_resolve_interface_method(CallInfo& result,
1514
                                                    const methodHandle& resolved_method,
1515
                                                    Klass* resolved_klass,
1516
                                                    Handle recv,
1517
                                                    Klass* recv_klass,
1518
                                                    bool check_null_and_abstract,
1519
                                                    bool is_abstract_interpretation, TRAPS) {
1520
  // is_abstract_interpretation -- see comments in runtime_resolve_virtual_method()
1521

1522
  // check if receiver exists
1523
  if (check_null_and_abstract && recv.is_null()) {
1524
    THROW(vmSymbols::java_lang_NullPointerException());
1525
  }
1526

1527
  // check if receiver klass implements the resolved interface
1528
  if (!is_abstract_interpretation && !recv_klass->is_subtype_of(resolved_klass)) {
1529
    ResourceMark rm(THREAD);
1530
    char buf[200];
1531
    jio_snprintf(buf, sizeof(buf), "Class %s does not implement the requested interface %s",
1532
                 recv_klass->external_name(),
1533
                 resolved_klass->external_name());
1534
    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
1535
  }
1536

1537
  methodHandle selected_method;
1538

1539
  if (!is_abstract_interpretation) {
1540
    selected_method = resolved_method;
1541
  }
1542

1543
  // resolve the method in the receiver class, unless it is private
1544
  if (!is_abstract_interpretation && !resolved_method()->is_private()) {
1545
    // do lookup based on receiver klass
1546
    // This search must match the linktime preparation search for itable initialization
1547
    // to correctly enforce loader constraints for interface method inheritance.
1548
    // Private methods are skipped as the resolved method was not private.
1549
    Method* method = lookup_instance_method_in_klasses(recv_klass,
1550
                                                       resolved_method->name(),
1551
                                                       resolved_method->signature(),
1552
                                                       Klass::PrivateLookupMode::skip);
1553
    selected_method = methodHandle(THREAD, method);
1554

1555
    if (selected_method.is_null() && !check_null_and_abstract) {
1556
      // In theory this is a harmless placeholder value, but
1557
      // in practice leaving in null affects the nsk default method tests.
1558
      // This needs further study.
1559
      selected_method = resolved_method;
1560
    }
1561
    // check if method exists
1562
    if (selected_method.is_null()) {
1563
      // Pass arguments for generating a verbose error message.
1564
      throw_abstract_method_error(resolved_method, recv_klass, CHECK);
1565
    }
1566
    // check access
1567
    // Throw Illegal Access Error if selected_method is not public.
1568
    if (!selected_method->is_public()) {
1569
      ResourceMark rm(THREAD);
1570
      stringStream ss;
1571
      ss.print("'");
1572
      Method::print_external_name(&ss, recv_klass, selected_method->name(), selected_method->signature());
1573
      ss.print("'");
1574
      THROW_MSG(vmSymbols::java_lang_IllegalAccessError(), ss.as_string());
1575
    }
1576
    // check if abstract
1577
    if (check_null_and_abstract && selected_method->is_abstract()) {
1578
      throw_abstract_method_error(resolved_method, selected_method, recv_klass, CHECK);
1579
    }
1580
  }
1581

1582
  if (log_develop_is_enabled(Trace, itables)) {
1583
    trace_method_resolution("invokeinterface selected method: receiver-class:",
1584
                            recv_klass, resolved_klass, selected_method(), true);
1585
  }
1586
  // setup result
1587
  if (resolved_method->has_vtable_index()) {
1588
    int vtable_index = resolved_method->vtable_index();
1589
    log_develop_trace(itables)("  -- vtable index: %d", vtable_index);
1590
    assert(is_abstract_interpretation || vtable_index == selected_method->vtable_index(), "sanity check");
1591
    result.set_virtual(resolved_klass, resolved_method, selected_method, vtable_index, CHECK);
1592
  } else if (resolved_method->has_itable_index()) {
1593
    int itable_index = resolved_method()->itable_index();
1594
    log_develop_trace(itables)("  -- itable index: %d", itable_index);
1595
    result.set_interface(resolved_klass, resolved_method, selected_method, itable_index, CHECK);
1596
  } else {
1597
    int index = resolved_method->vtable_index();
1598
    log_develop_trace(itables)("  -- non itable/vtable index: %d", index);
1599
    assert(index == Method::nonvirtual_vtable_index, "Oops hit another case!");
1600
    assert(resolved_method()->is_private() ||
1601
           (resolved_method()->is_final() && resolved_method->method_holder() == vmClasses::Object_klass()),
1602
           "Should only have non-virtual invokeinterface for private or final-Object methods!");
1603
    assert(resolved_method()->can_be_statically_bound(), "Should only have non-virtual invokeinterface for statically bound methods!");
1604
    // This sets up the nonvirtual form of "virtual" call (as needed for final and private methods)
1605
    result.set_virtual(resolved_klass, resolved_method, resolved_method, index, CHECK);
1606
  }
1607
  if (!is_abstract_interpretation) {
1608
    JFR_ONLY(Jfr::on_resolution(result, CHECK);)
1609
  }
1610
}
1611

1612

1613
Method* LinkResolver::linktime_resolve_interface_method_or_null(
1614
                                                 const LinkInfo& link_info) {
1615
  EXCEPTION_MARK;
1616
  Method* method_result = linktime_resolve_interface_method(link_info, THREAD);
1617
  if (HAS_PENDING_EXCEPTION) {
1618
    CLEAR_PENDING_EXCEPTION;
1619
    return nullptr;
1620
  } else {
1621
    return method_result;
1622
  }
1623
}
1624

1625
Method* LinkResolver::linktime_resolve_virtual_method_or_null(
1626
                                                 const LinkInfo& link_info) {
1627
  EXCEPTION_MARK;
1628
  Method* method_result = linktime_resolve_virtual_method(link_info, THREAD);
1629
  if (HAS_PENDING_EXCEPTION) {
1630
    CLEAR_PENDING_EXCEPTION;
1631
    return nullptr;
1632
  } else {
1633
    return method_result;
1634
  }
1635
}
1636

1637
Method* LinkResolver::resolve_virtual_call_or_null(
1638
                                                 Klass* receiver_klass,
1639
                                                 const LinkInfo& link_info) {
1640
  EXCEPTION_MARK;
1641
  CallInfo info;
1642
  resolve_virtual_call(info, Handle(), receiver_klass, link_info, false, THREAD);
1643
  if (HAS_PENDING_EXCEPTION) {
1644
    CLEAR_PENDING_EXCEPTION;
1645
    return nullptr;
1646
  }
1647
  return info.selected_method();
1648
}
1649

1650
Method* LinkResolver::resolve_interface_call_or_null(
1651
                                                 Klass* receiver_klass,
1652
                                                 const LinkInfo& link_info) {
1653
  EXCEPTION_MARK;
1654
  CallInfo info;
1655
  resolve_interface_call(info, Handle(), receiver_klass, link_info, false, THREAD);
1656
  if (HAS_PENDING_EXCEPTION) {
1657
    CLEAR_PENDING_EXCEPTION;
1658
    return nullptr;
1659
  }
1660
  return info.selected_method();
1661
}
1662

1663
int LinkResolver::resolve_virtual_vtable_index(Klass* receiver_klass,
1664
                                               const LinkInfo& link_info) {
1665
  EXCEPTION_MARK;
1666
  CallInfo info;
1667
  resolve_virtual_call(info, Handle(), receiver_klass, link_info,
1668
                       /*check_null_or_abstract*/false, THREAD);
1669
  if (HAS_PENDING_EXCEPTION) {
1670
    CLEAR_PENDING_EXCEPTION;
1671
    return Method::invalid_vtable_index;
1672
  }
1673
  return info.vtable_index();
1674
}
1675

1676
Method* LinkResolver::resolve_static_call_or_null(const LinkInfo& link_info) {
1677
  EXCEPTION_MARK;
1678
  CallInfo info;
1679
  resolve_static_call(info, link_info, /*initialize_class*/false, THREAD);
1680
  if (HAS_PENDING_EXCEPTION) {
1681
    CLEAR_PENDING_EXCEPTION;
1682
    return nullptr;
1683
  }
1684
  return info.selected_method();
1685
}
1686

1687
Method* LinkResolver::resolve_special_call_or_null(const LinkInfo& link_info) {
1688
  EXCEPTION_MARK;
1689
  CallInfo info;
1690
  resolve_special_call(info, Handle(), link_info, THREAD);
1691
  if (HAS_PENDING_EXCEPTION) {
1692
    CLEAR_PENDING_EXCEPTION;
1693
    return nullptr;
1694
  }
1695
  return info.selected_method();
1696
}
1697

1698

1699

1700
//------------------------------------------------------------------------------------------------------------------------
1701
// ConstantPool entries
1702

1703
void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, const constantPoolHandle& pool, int index, Bytecodes::Code byte, TRAPS) {
1704
  switch (byte) {
1705
    case Bytecodes::_invokestatic   : resolve_invokestatic   (result,       pool, index, CHECK); break;
1706
    case Bytecodes::_invokespecial  : resolve_invokespecial  (result, recv, pool, index, CHECK); break;
1707
    case Bytecodes::_invokevirtual  : resolve_invokevirtual  (result, recv, pool, index, CHECK); break;
1708
    case Bytecodes::_invokehandle   : resolve_invokehandle   (result,       pool, index, CHECK); break;
1709
    case Bytecodes::_invokedynamic  : resolve_invokedynamic  (result,       pool, index, CHECK); break;
1710
    case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break;
1711
    default                         :                                                            break;
1712
  }
1713
  return;
1714
}
1715

1716
void LinkResolver::resolve_invoke(CallInfo& result, Handle& recv,
1717
                             const methodHandle& attached_method,
1718
                             Bytecodes::Code byte, TRAPS) {
1719
  Klass* defc = attached_method->method_holder();
1720
  Symbol* name = attached_method->name();
1721
  Symbol* type = attached_method->signature();
1722
  LinkInfo link_info(defc, name, type);
1723
  switch(byte) {
1724
    case Bytecodes::_invokevirtual:
1725
      resolve_virtual_call(result, recv, recv->klass(), link_info,
1726
                           /*check_null_and_abstract=*/true, CHECK);
1727
      break;
1728
    case Bytecodes::_invokeinterface:
1729
      resolve_interface_call(result, recv, recv->klass(), link_info,
1730
                             /*check_null_and_abstract=*/true, CHECK);
1731
      break;
1732
    case Bytecodes::_invokestatic:
1733
      resolve_static_call(result, link_info, /*initialize_class=*/false, CHECK);
1734
      break;
1735
    case Bytecodes::_invokespecial:
1736
      resolve_special_call(result, recv, link_info, CHECK);
1737
      break;
1738
    default:
1739
      fatal("bad call: %s", Bytecodes::name(byte));
1740
      break;
1741
  }
1742
}
1743

1744
void LinkResolver::resolve_invokestatic(CallInfo& result, const constantPoolHandle& pool, int index, TRAPS) {
1745
  LinkInfo link_info(pool, index, Bytecodes::_invokestatic, CHECK);
1746
  resolve_static_call(result, link_info, /*initialize_class*/true, CHECK);
1747
}
1748

1749

1750
void LinkResolver::resolve_invokespecial(CallInfo& result, Handle recv,
1751
                                         const constantPoolHandle& pool, int index, TRAPS) {
1752
  LinkInfo link_info(pool, index, Bytecodes::_invokespecial, CHECK);
1753
  resolve_special_call(result, recv, link_info, CHECK);
1754
}
1755

1756

1757
void LinkResolver::resolve_invokevirtual(CallInfo& result, Handle recv,
1758
                                          const constantPoolHandle& pool, int index,
1759
                                          TRAPS) {
1760

1761
  LinkInfo link_info(pool, index, Bytecodes::_invokevirtual, CHECK);
1762
  Klass* recvrKlass = recv.is_null() ? (Klass*)nullptr : recv->klass();
1763
  resolve_virtual_call(result, recv, recvrKlass, link_info, /*check_null_or_abstract*/true, CHECK);
1764
}
1765

1766

1767
void LinkResolver::resolve_invokeinterface(CallInfo& result, Handle recv, const constantPoolHandle& pool, int index, TRAPS) {
1768
  LinkInfo link_info(pool, index, Bytecodes::_invokeinterface, CHECK);
1769
  Klass* recvrKlass = recv.is_null() ? (Klass*)nullptr : recv->klass();
1770
  resolve_interface_call(result, recv, recvrKlass, link_info, true, CHECK);
1771
}
1772

1773
bool LinkResolver::resolve_previously_linked_invokehandle(CallInfo& result, const LinkInfo& link_info, const constantPoolHandle& pool, int index, TRAPS) {
1774
  ResolvedMethodEntry* method_entry = pool->cache()->resolved_method_entry_at(index);
1775
  if (method_entry->method() != nullptr) {
1776
    Klass* resolved_klass = link_info.resolved_klass();
1777
    methodHandle method(THREAD, method_entry->method());
1778
    Handle     appendix(THREAD, pool->cache()->appendix_if_resolved(method_entry));
1779
    result.set_handle(resolved_klass, method, appendix, CHECK_false);
1780
    JFR_ONLY(Jfr::on_resolution(result, CHECK_false);)
1781
    return true;
1782
  } else {
1783
    return false;
1784
  }
1785
}
1786

1787
void LinkResolver::resolve_invokehandle(CallInfo& result, const constantPoolHandle& pool, int index, TRAPS) {
1788

1789
  PerfTraceTimedEvent timer(ClassLoader::perf_resolve_invokehandle_time(),
1790
                            ClassLoader::perf_resolve_invokehandle_count());
1791

1792
  LinkInfo link_info(pool, index, Bytecodes::_invokehandle, CHECK);
1793
  if (log_is_enabled(Info, methodhandles)) {
1794
    ResourceMark rm(THREAD);
1795
    log_info(methodhandles)("resolve_invokehandle %s %s", link_info.name()->as_C_string(),
1796
                            link_info.signature()->as_C_string());
1797
  }
1798
  { // Check if the call site has been bound already, and short circuit:
1799
    bool is_done = resolve_previously_linked_invokehandle(result, link_info, pool, index, CHECK);
1800
    if (is_done) return;
1801
  }
1802
  resolve_handle_call(result, link_info, CHECK);
1803
}
1804

1805
void LinkResolver::resolve_handle_call(CallInfo& result,
1806
                                       const LinkInfo& link_info,
1807
                                       TRAPS) {
1808
  // JSR 292:  this must be an implicitly generated method MethodHandle.invokeExact(*...) or similar
1809
  Klass* resolved_klass = link_info.resolved_klass();
1810
  assert(resolved_klass == vmClasses::MethodHandle_klass() ||
1811
         resolved_klass == vmClasses::VarHandle_klass(), "");
1812
  assert(MethodHandles::is_signature_polymorphic_name(link_info.name()), "");
1813
  Handle resolved_appendix;
1814
  Method* m = lookup_polymorphic_method(link_info, &resolved_appendix, CHECK);
1815
  methodHandle resolved_method(THREAD, m);
1816

1817
  if (link_info.check_access()) {
1818
    Symbol* name = link_info.name();
1819
    vmIntrinsics::ID iid = MethodHandles::signature_polymorphic_name_id(name);
1820
    if (MethodHandles::is_signature_polymorphic_intrinsic(iid)) {
1821
      // Check if method can be accessed by the referring class.
1822
      // MH.linkTo* invocations are not rewritten to invokehandle.
1823
      assert(iid == vmIntrinsicID::_invokeBasic, "%s", vmIntrinsics::name_at(iid));
1824

1825
      Klass* current_klass = link_info.current_klass();
1826
      assert(current_klass != nullptr , "current_klass should not be null");
1827
      check_method_accessability(current_klass,
1828
                                 resolved_klass,
1829
                                 resolved_method->method_holder(),
1830
                                 resolved_method,
1831
                                 CHECK);
1832
    } else {
1833
      // Java code is free to arbitrarily link signature-polymorphic invokers.
1834
      assert(iid == vmIntrinsics::_invokeGeneric, "not an invoker: %s", vmIntrinsics::name_at(iid));
1835
      assert(MethodHandles::is_signature_polymorphic_public_name(resolved_klass, name), "not public");
1836
    }
1837
  }
1838
  result.set_handle(resolved_klass, resolved_method, resolved_appendix, CHECK);
1839
  JFR_ONLY(Jfr::on_resolution(result, CHECK);)
1840
}
1841

1842
void LinkResolver::resolve_invokedynamic(CallInfo& result, const constantPoolHandle& pool, int indy_index, TRAPS) {
1843
  PerfTraceTimedEvent timer(ClassLoader::perf_resolve_invokedynamic_time(),
1844
                            ClassLoader::perf_resolve_invokedynamic_count());
1845

1846
  int pool_index = pool->resolved_indy_entry_at(indy_index)->constant_pool_index();
1847

1848
  // Resolve the bootstrap specifier (BSM + optional arguments).
1849
  BootstrapInfo bootstrap_specifier(pool, pool_index, indy_index);
1850

1851
  // Check if CallSite has been bound already or failed already, and short circuit:
1852
  {
1853
    bool is_done = bootstrap_specifier.resolve_previously_linked_invokedynamic(result, CHECK);
1854
    if (is_done) return;
1855
  }
1856

1857
  // The initial step in Call Site Specifier Resolution is to resolve the symbolic
1858
  // reference to a method handle which will be the bootstrap method for a dynamic
1859
  // call site.  If resolution for the java.lang.invoke.MethodHandle for the bootstrap
1860
  // method fails, then a MethodHandleInError is stored at the corresponding bootstrap
1861
  // method's CP index for the CONSTANT_MethodHandle_info.
1862
  // Any subsequent invokedynamic instruction which shares
1863
  // this bootstrap method will encounter the resolution of MethodHandleInError.
1864

1865
  resolve_dynamic_call(result, bootstrap_specifier, CHECK);
1866

1867
  LogTarget(Debug, methodhandles, indy) lt_indy;
1868
  if (lt_indy.is_enabled()) {
1869
    LogStream ls(lt_indy);
1870
    bootstrap_specifier.print_msg_on(&ls, "resolve_invokedynamic");
1871
  }
1872

1873
  // The returned linkage result is provisional up to the moment
1874
  // the interpreter or runtime performs a serialized check of
1875
  // the relevant ResolvedIndyEntry::method field.  This is done by the caller
1876
  // of this method, via CPC::set_dynamic_call, which uses
1877
  // an ObjectLocker to do the final serialization of updates
1878
  // to ResolvedIndyEntry state, including method.
1879

1880
  // Log dynamic info to CDS classlist.
1881
  ArchiveUtils::log_to_classlist(&bootstrap_specifier, CHECK);
1882
}
1883

1884
void LinkResolver::resolve_dynamic_call(CallInfo& result,
1885
                                        BootstrapInfo& bootstrap_specifier,
1886
                                        TRAPS) {
1887
  // JSR 292:  this must resolve to an implicitly generated method
1888
  // such as MH.linkToCallSite(*...) or some other call-site shape.
1889
  // The appendix argument is likely to be a freshly-created CallSite.
1890
  // It may also be a MethodHandle from an unwrapped ConstantCallSite,
1891
  // or any other reference.  The resolved_method as well as the appendix
1892
  // are both recorded together via CallInfo::set_handle.
1893
  SystemDictionary::invoke_bootstrap_method(bootstrap_specifier, THREAD);
1894
  Exceptions::wrap_dynamic_exception(/* is_indy */ true, THREAD);
1895

1896
  if (HAS_PENDING_EXCEPTION) {
1897
    if (!PENDING_EXCEPTION->is_a(vmClasses::LinkageError_klass())) {
1898
      // Let any random low-level IE or SOE or OOME just bleed through.
1899
      // Basically we pretend that the bootstrap method was never called,
1900
      // if it fails this way:  We neither record a successful linkage,
1901
      // nor do we memorize a LE for posterity.
1902
      return;
1903
    }
1904
    // JVMS 5.4.3 says: If an attempt by the Java Virtual Machine to resolve
1905
    // a symbolic reference fails because an error is thrown that is an
1906
    // instance of LinkageError (or a subclass), then subsequent attempts to
1907
    // resolve the reference always fail with the same error that was thrown
1908
    // as a result of the initial resolution attempt.
1909
    bool recorded_res_status = bootstrap_specifier.save_and_throw_indy_exc(CHECK);
1910
    if (!recorded_res_status) {
1911
      // Another thread got here just before we did.  So, either use the method
1912
      // that it resolved or throw the LinkageError exception that it threw.
1913
      bool is_done = bootstrap_specifier.resolve_previously_linked_invokedynamic(result, CHECK);
1914
      if (is_done) return;
1915
    }
1916
    assert(bootstrap_specifier.pool()->resolved_indy_entry_at(bootstrap_specifier.indy_index())->resolution_failed(),
1917
          "Resolution should have failed");
1918
  }
1919

1920
  bootstrap_specifier.resolve_newly_linked_invokedynamic(result, CHECK);
1921
  // Exceptions::wrap_dynamic_exception not used because
1922
  // set_handle doesn't throw linkage errors
1923
  JFR_ONLY(Jfr::on_resolution(result, CHECK);)
1924
}
1925

1926
// Selected method is abstract.
1927
void LinkResolver::throw_abstract_method_error(const methodHandle& resolved_method,
1928
                                               const methodHandle& selected_method,
1929
                                               Klass *recv_klass, TRAPS) {
1930
  Klass *resolved_klass = resolved_method->method_holder();
1931
  ResourceMark rm(THREAD);
1932
  stringStream ss;
1933

1934
  if (recv_klass != nullptr) {
1935
    ss.print("Receiver class %s does not define or inherit an "
1936
             "implementation of the",
1937
             recv_klass->external_name());
1938
  } else {
1939
    ss.print("Missing implementation of");
1940
  }
1941

1942
  assert(resolved_method.not_null(), "Sanity");
1943
  ss.print(" resolved method '%s%s",
1944
           resolved_method->is_abstract() ? "abstract " : "",
1945
           resolved_method->is_private()  ? "private "  : "");
1946
  resolved_method->signature()->print_as_signature_external_return_type(&ss);
1947
  ss.print(" %s(", resolved_method->name()->as_C_string());
1948
  resolved_method->signature()->print_as_signature_external_parameters(&ss);
1949
  ss.print(")' of %s %s.",
1950
           resolved_klass->external_kind(),
1951
           resolved_klass->external_name());
1952

1953
  if (selected_method.not_null() && !(resolved_method == selected_method)) {
1954
    ss.print(" Selected method is '%s%s",
1955
             selected_method->is_abstract() ? "abstract " : "",
1956
             selected_method->is_private()  ? "private "  : "");
1957
    selected_method->print_external_name(&ss);
1958
    ss.print("'.");
1959
  }
1960

1961
  THROW_MSG(vmSymbols::java_lang_AbstractMethodError(), ss.as_string());
1962
}
1963

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.