comparison src/share/vm/classfile/systemDictionary.cpp @ 1913:3b2dea75431e

6984311: JSR 292 needs optional bootstrap method parameters Summary: Allow CONSTANT_InvokeDynamic nodes to have any number of extra operands. Reviewed-by: twisti
author jrose
date Sat, 30 Oct 2010 13:08:23 -0700
parents 87d6a4d1ecbc
children 2d26b0046e0d f95d63e2154a
comparison
equal deleted inserted replaced
1912:8213b0f5c92d 1913:3b2dea75431e
2553 } 2553 }
2554 return call_site_oop; 2554 return call_site_oop;
2555 } 2555 }
2556 2556
2557 Handle SystemDictionary::find_bootstrap_method(methodHandle caller_method, int caller_bci, 2557 Handle SystemDictionary::find_bootstrap_method(methodHandle caller_method, int caller_bci,
2558 int cache_index, TRAPS) { 2558 int cache_index,
2559 Handle& argument_info_result,
2560 TRAPS) {
2559 Handle empty; 2561 Handle empty;
2560 2562
2561 constantPoolHandle pool; 2563 constantPoolHandle pool;
2562 { 2564 {
2563 klassOop caller = caller_method->method_holder(); 2565 klassOop caller = caller_method->method_holder();
2567 2569
2568 int constant_pool_index = pool->cache()->entry_at(cache_index)->constant_pool_index(); 2570 int constant_pool_index = pool->cache()->entry_at(cache_index)->constant_pool_index();
2569 constantTag tag = pool->tag_at(constant_pool_index); 2571 constantTag tag = pool->tag_at(constant_pool_index);
2570 2572
2571 if (tag.is_invoke_dynamic()) { 2573 if (tag.is_invoke_dynamic()) {
2572 // JVM_CONSTANT_InvokeDynamic is an ordered pair of [bootm, name&type] 2574 // JVM_CONSTANT_InvokeDynamic is an ordered pair of [bootm, name&type], plus optional arguments
2573 // The bootm, being a JVM_CONSTANT_MethodHandle, has its own cache entry. 2575 // The bootm, being a JVM_CONSTANT_MethodHandle, has its own cache entry.
2574 int bsm_index = pool->invoke_dynamic_bootstrap_method_ref_index_at(constant_pool_index); 2576 int bsm_index = pool->invoke_dynamic_bootstrap_method_ref_index_at(constant_pool_index);
2575 if (bsm_index != 0) { 2577 if (bsm_index != 0) {
2576 int bsm_index_in_cache = pool->cache()->entry_at(cache_index)->bootstrap_method_index_in_cache(); 2578 int bsm_index_in_cache = pool->cache()->entry_at(cache_index)->bootstrap_method_index_in_cache();
2577 DEBUG_ONLY(int bsm_index_2 = pool->cache()->entry_at(bsm_index_in_cache)->constant_pool_index()); 2579 DEBUG_ONLY(int bsm_index_2 = pool->cache()->entry_at(bsm_index_in_cache)->constant_pool_index());
2583 oop bsm_oop = pool->resolve_cached_constant_at(bsm_index_in_cache, CHECK_(empty)); 2585 oop bsm_oop = pool->resolve_cached_constant_at(bsm_index_in_cache, CHECK_(empty));
2584 if (TraceMethodHandles) { 2586 if (TraceMethodHandles) {
2585 tty->print_cr("bootstrap method for "PTR_FORMAT" at %d retrieved as "PTR_FORMAT":", 2587 tty->print_cr("bootstrap method for "PTR_FORMAT" at %d retrieved as "PTR_FORMAT":",
2586 (intptr_t) caller_method(), caller_bci, (intptr_t) bsm_oop); 2588 (intptr_t) caller_method(), caller_bci, (intptr_t) bsm_oop);
2587 } 2589 }
2588 assert(bsm_oop->is_oop() 2590 assert(bsm_oop->is_oop(), "must be sane");
2589 && java_dyn_MethodHandle::is_instance(bsm_oop), "must be sane"); 2591 // caller must verify that it is of type MethodHandle
2590 return Handle(THREAD, bsm_oop); 2592 Handle bsm(THREAD, bsm_oop);
2593 bsm_oop = NULL; // safety
2594
2595 // Extract the optional static arguments.
2596 Handle argument_info; // either null, or one arg, or Object[]{arg...}
2597 int argc = pool->invoke_dynamic_argument_count_at(constant_pool_index);
2598 if (TraceInvokeDynamic) {
2599 tty->print_cr("find_bootstrap_method: [%d/%d] CONSTANT_InvokeDynamic: %d[%d]",
2600 constant_pool_index, cache_index, bsm_index, argc);
2601 }
2602 if (argc > 0) {
2603 objArrayHandle arg_array;
2604 if (argc > 1) {
2605 objArrayOop arg_array_oop = oopFactory::new_objArray(SystemDictionary::Object_klass(), argc, CHECK_(empty));
2606 arg_array = objArrayHandle(THREAD, arg_array_oop);
2607 argument_info = arg_array;
2608 }
2609 for (int arg_i = 0; arg_i < argc; arg_i++) {
2610 int arg_index = pool->invoke_dynamic_argument_index_at(constant_pool_index, arg_i);
2611 oop arg_oop = pool->resolve_possibly_cached_constant_at(arg_index, CHECK_(empty));
2612 if (arg_array.is_null()) {
2613 argument_info = Handle(THREAD, arg_oop);
2614 } else {
2615 arg_array->obj_at_put(arg_i, arg_oop);
2616 }
2617 }
2618 }
2619
2620 argument_info_result = argument_info; // return argument_info to caller
2621 return bsm;
2591 } 2622 }
2592 // else null BSM; fall through 2623 // else null BSM; fall through
2593 } else if (tag.is_name_and_type()) { 2624 } else if (tag.is_name_and_type()) {
2594 // JSR 292 EDR does not have JVM_CONSTANT_InvokeDynamic 2625 // JSR 292 EDR does not have JVM_CONSTANT_InvokeDynamic
2595 // a bare name&type defaults its BSM to null, so fall through... 2626 // a bare name&type defaults its BSM to null, so fall through...
2598 } 2629 }
2599 2630
2600 // Fall through to pick up the per-class bootstrap method. 2631 // Fall through to pick up the per-class bootstrap method.
2601 // This mechanism may go away in the PFD. 2632 // This mechanism may go away in the PFD.
2602 assert(AllowTransitionalJSR292, "else the verifier should have stopped us already"); 2633 assert(AllowTransitionalJSR292, "else the verifier should have stopped us already");
2634 argument_info_result = empty; // return no argument_info to caller
2603 oop bsm_oop = instanceKlass::cast(caller_method->method_holder())->bootstrap_method(); 2635 oop bsm_oop = instanceKlass::cast(caller_method->method_holder())->bootstrap_method();
2604 if (bsm_oop != NULL) { 2636 if (bsm_oop != NULL) {
2605 if (TraceMethodHandles) { 2637 if (TraceMethodHandles) {
2606 tty->print_cr("bootstrap method for "PTR_FORMAT" registered as "PTR_FORMAT":", 2638 tty->print_cr("bootstrap method for "PTR_FORMAT" registered as "PTR_FORMAT":",
2607 (intptr_t) caller_method(), (intptr_t) bsm_oop); 2639 (intptr_t) caller_method(), (intptr_t) bsm_oop);
2608 } 2640 }
2609 assert(bsm_oop->is_oop() 2641 assert(bsm_oop->is_oop(), "must be sane");
2610 && java_dyn_MethodHandle::is_instance(bsm_oop), "must be sane");
2611 return Handle(THREAD, bsm_oop); 2642 return Handle(THREAD, bsm_oop);
2612 } 2643 }
2613 2644
2614 return empty; 2645 return empty;
2615 } 2646 }