< prev index next >

src/hotspot/share/prims/jvmtiRedefineClasses.cpp

Print this page
rev 52749 : Bootstrap method consolidation
* clean up and simplify JDK support code for BSM invocation
* simplify JVM bootstrap handshake: use BootstrapCallInfo only
* remove unused JVM paths and data fields
* move bootstrap argument processing from MethodHandleNatives to ConstantPool
* remove ConstantGroup; merge argument access into BootstrapCallInfo
* adjust BSM argument access: remove copyArguments, add argumentRef API
* add metadata-free BSM modes, including symbolic arguments from CP


 489       int new_ref_i = find_or_append_indirect_entry(scratch_cp, ref_i, merge_cp_p,
 490                                                     merge_cp_length_p, THREAD);
 491       if (new_ref_i != ref_i) {
 492         log_trace(redefine, class, constantpool)
 493           ("MethodHandle entry@%d ref_index change: %d to %d", *merge_cp_length_p, ref_i, new_ref_i);
 494       }
 495       (*merge_cp_p)->method_handle_index_at_put(*merge_cp_length_p, ref_kind, new_ref_i);
 496       if (scratch_i != *merge_cp_length_p) {
 497         // The new entry in *merge_cp_p is at a different index than
 498         // the new entry in scratch_cp so we need to map the index values.
 499         map_index(scratch_cp, scratch_i, *merge_cp_length_p);
 500       }
 501       (*merge_cp_length_p)++;
 502     } break;
 503 
 504     // this is an indirect CP entry so it needs special handling
 505     case JVM_CONSTANT_Dynamic:  // fall through
 506     case JVM_CONSTANT_InvokeDynamic:
 507     {
 508       // Index of the bootstrap specifier in the operands array
 509       int old_bs_i = scratch_cp->invoke_dynamic_bootstrap_specifier_index(scratch_i);
 510       int new_bs_i = find_or_append_operand(scratch_cp, old_bs_i, merge_cp_p,
 511                                             merge_cp_length_p, THREAD);
 512       // The bootstrap method NameAndType_info index
 513       int old_ref_i = scratch_cp->invoke_dynamic_name_and_type_ref_index_at(scratch_i);
 514       int new_ref_i = find_or_append_indirect_entry(scratch_cp, old_ref_i, merge_cp_p,
 515                                                     merge_cp_length_p, THREAD);
 516       if (new_bs_i != old_bs_i) {
 517         log_trace(redefine, class, constantpool)
 518           ("Dynamic entry@%d bootstrap_method_attr_index change: %d to %d",
 519            *merge_cp_length_p, old_bs_i, new_bs_i);
 520       }
 521       if (new_ref_i != old_ref_i) {
 522         log_trace(redefine, class, constantpool)
 523           ("Dynamic entry@%d name_and_type_index change: %d to %d", *merge_cp_length_p, old_ref_i, new_ref_i);
 524       }
 525 
 526       if (scratch_cp->tag_at(scratch_i).is_dynamic_constant())
 527         (*merge_cp_p)->dynamic_constant_at_put(*merge_cp_length_p, new_bs_i, new_ref_i);
 528       else
 529         (*merge_cp_p)->invoke_dynamic_at_put(*merge_cp_length_p, new_bs_i, new_ref_i);
 530       if (scratch_i != *merge_cp_length_p) {
 531         // The new entry in *merge_cp_p is at a different index than
 532         // the new entry in scratch_cp so we need to map the index values.
 533         map_index(scratch_cp, scratch_i, *merge_cp_length_p);




 489       int new_ref_i = find_or_append_indirect_entry(scratch_cp, ref_i, merge_cp_p,
 490                                                     merge_cp_length_p, THREAD);
 491       if (new_ref_i != ref_i) {
 492         log_trace(redefine, class, constantpool)
 493           ("MethodHandle entry@%d ref_index change: %d to %d", *merge_cp_length_p, ref_i, new_ref_i);
 494       }
 495       (*merge_cp_p)->method_handle_index_at_put(*merge_cp_length_p, ref_kind, new_ref_i);
 496       if (scratch_i != *merge_cp_length_p) {
 497         // The new entry in *merge_cp_p is at a different index than
 498         // the new entry in scratch_cp so we need to map the index values.
 499         map_index(scratch_cp, scratch_i, *merge_cp_length_p);
 500       }
 501       (*merge_cp_length_p)++;
 502     } break;
 503 
 504     // this is an indirect CP entry so it needs special handling
 505     case JVM_CONSTANT_Dynamic:  // fall through
 506     case JVM_CONSTANT_InvokeDynamic:
 507     {
 508       // Index of the bootstrap specifier in the operands array
 509       int old_bs_i = scratch_cp->bootstrap_methods_attribute_index(scratch_i);
 510       int new_bs_i = find_or_append_operand(scratch_cp, old_bs_i, merge_cp_p,
 511                                             merge_cp_length_p, THREAD);
 512       // The bootstrap method NameAndType_info index
 513       int old_ref_i = scratch_cp->bootstrap_name_and_type_ref_index_at(scratch_i);
 514       int new_ref_i = find_or_append_indirect_entry(scratch_cp, old_ref_i, merge_cp_p,
 515                                                     merge_cp_length_p, THREAD);
 516       if (new_bs_i != old_bs_i) {
 517         log_trace(redefine, class, constantpool)
 518           ("Dynamic entry@%d bootstrap_method_attr_index change: %d to %d",
 519            *merge_cp_length_p, old_bs_i, new_bs_i);
 520       }
 521       if (new_ref_i != old_ref_i) {
 522         log_trace(redefine, class, constantpool)
 523           ("Dynamic entry@%d name_and_type_index change: %d to %d", *merge_cp_length_p, old_ref_i, new_ref_i);
 524       }
 525 
 526       if (scratch_cp->tag_at(scratch_i).is_dynamic_constant())
 527         (*merge_cp_p)->dynamic_constant_at_put(*merge_cp_length_p, new_bs_i, new_ref_i);
 528       else
 529         (*merge_cp_p)->invoke_dynamic_at_put(*merge_cp_length_p, new_bs_i, new_ref_i);
 530       if (scratch_i != *merge_cp_length_p) {
 531         // The new entry in *merge_cp_p is at a different index than
 532         // the new entry in scratch_cp so we need to map the index values.
 533         map_index(scratch_cp, scratch_i, *merge_cp_length_p);


< prev index next >