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);
|