comparison src/share/vm/runtime/relocator.cpp @ 6605:4ee06e614636

7116786: RFE: Detailed information on VerifyErrors Summary: Provide additional detail in VerifyError messages Reviewed-by: sspitsyn, acorn
author kamg
date Mon, 06 Aug 2012 15:54:45 -0400
parents 8150fa46d2ed
children da91efe96a93
comparison
equal deleted inserted replaced
6604:c3c2141203e7 6605:4ee06e614636
463 // The width of instruction at "bci" is changing by "delta". Adjust the stack 463 // The width of instruction at "bci" is changing by "delta". Adjust the stack
464 // map frames. 464 // map frames.
465 void Relocator::adjust_stack_map_table(int bci, int delta) { 465 void Relocator::adjust_stack_map_table(int bci, int delta) {
466 if (method()->has_stackmap_table()) { 466 if (method()->has_stackmap_table()) {
467 typeArrayOop data = method()->stackmap_data(); 467 typeArrayOop data = method()->stackmap_data();
468 // The data in the array is a classfile representation of the stackmap 468 // The data in the array is a classfile representation of the stackmap table
469 // table attribute, less the initial u2 tag and u4 attribute_length fields. 469 stack_map_table* sm_table =
470 stack_map_table_attribute* attr = stack_map_table_attribute::at( 470 stack_map_table::at((address)data->byte_at_addr(0));
471 (address)data->byte_at_addr(0) - (sizeof(u2) + sizeof(u4))); 471
472 472 int count = sm_table->number_of_entries();
473 int count = attr->number_of_entries(); 473 stack_map_frame* frame = sm_table->entries();
474 stack_map_frame* frame = attr->entries();
475 int bci_iter = -1; 474 int bci_iter = -1;
476 bool offset_adjusted = false; // only need to adjust one offset 475 bool offset_adjusted = false; // only need to adjust one offset
477 476
478 for (int i = 0; i < count; ++i) { 477 for (int i = 0; i < count; ++i) {
479 int offset_delta = frame->offset_delta(); 478 int offset_delta = frame->offset_delta();
484 483
485 if (frame->is_valid_offset(new_offset_delta)) { 484 if (frame->is_valid_offset(new_offset_delta)) {
486 frame->set_offset_delta(new_offset_delta); 485 frame->set_offset_delta(new_offset_delta);
487 } else { 486 } else {
488 assert(frame->is_same_frame() || 487 assert(frame->is_same_frame() ||
489 frame->is_same_frame_1_stack_item_frame(), 488 frame->is_same_locals_1_stack_item_frame(),
490 "Frame must be one of the compressed forms"); 489 "Frame must be one of the compressed forms");
491 // The new delta exceeds the capacity of the 'same_frame' or 490 // The new delta exceeds the capacity of the 'same_frame' or
492 // 'same_frame_1_stack_item_frame' frame types. We need to 491 // 'same_frame_1_stack_item_frame' frame types. We need to
493 // convert these frames to the extended versions, but the extended 492 // convert these frames to the extended versions, but the extended
494 // version is bigger and requires more room. So we allocate a 493 // version is bigger and requires more room. So we allocate a
511 510
512 // Now convert the frames in place 511 // Now convert the frames in place
513 if (frame->is_same_frame()) { 512 if (frame->is_same_frame()) {
514 same_frame_extended::create_at(frame_addr, new_offset_delta); 513 same_frame_extended::create_at(frame_addr, new_offset_delta);
515 } else { 514 } else {
516 same_frame_1_stack_item_extended::create_at( 515 same_locals_1_stack_item_extended::create_at(
517 frame_addr, new_offset_delta, NULL); 516 frame_addr, new_offset_delta, NULL);
518 // the verification_info_type should already be at the right spot 517 // the verification_info_type should already be at the right spot
519 } 518 }
520 } 519 }
521 offset_adjusted = true; // needs to be done only once, since subsequent 520 offset_adjusted = true; // needs to be done only once, since subsequent