539 stack_map_table* sm_table = |
539 stack_map_table* sm_table = |
540 stack_map_table::at((address)data->adr_at(0)); |
540 stack_map_table::at((address)data->adr_at(0)); |
541 stack_map_frame* sm_frame = sm_table->entries(); |
541 stack_map_frame* sm_frame = sm_table->entries(); |
542 streamIndentor si2(ss); |
542 streamIndentor si2(ss); |
543 int current_offset = -1; |
543 int current_offset = -1; |
544 // Subtract two from StackMapAttribute length because the length includes |
544 address end_of_sm_table = (address)sm_table + method->stackmap_data()->length(); |
545 // two bytes for number of table entries. |
|
546 size_t sm_table_space = method->stackmap_data()->length() - 2; |
|
547 for (u2 i = 0; i < sm_table->number_of_entries(); ++i) { |
545 for (u2 i = 0; i < sm_table->number_of_entries(); ++i) { |
548 ss->indent(); |
546 ss->indent(); |
549 size_t sm_frame_size = sm_frame->size(); |
547 if (!sm_frame->verify((address)sm_frame, end_of_sm_table)) { |
550 // If the size of the next stackmap exceeds the length of the entire |
|
551 // stackmap table then print a truncated message and return. |
|
552 if (sm_frame_size > sm_table_space) { |
|
553 sm_frame->print_truncated(ss, current_offset); |
548 sm_frame->print_truncated(ss, current_offset); |
554 return; |
549 return; |
555 } |
550 } |
556 sm_table_space -= sm_frame_size; |
|
557 sm_frame->print_on(ss, current_offset); |
551 sm_frame->print_on(ss, current_offset); |
558 ss->cr(); |
552 ss->cr(); |
559 current_offset += sm_frame->offset_delta(); |
553 current_offset += sm_frame->offset_delta(); |
560 sm_frame = sm_frame->next(); |
554 sm_frame = sm_frame->next(); |
561 } |
555 } |