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