// Compute size of LineNumberTable u2 JvmtiClassFileReconstituter::line_number_table_entries(methodHandle method) { // The line number table is compressed so we don't know how big it is until decompressed. // Decompression is really fast so we just do it twice. u2 num_entries = 0; CompressedLineNumberReadStream stream(method->compressed_linenumber_table()); while (stream.read_pair()) { num_entries++; } return num_entries; }
// Write LineNumberTable attribute // JVMSpec| LineNumberTable_attribute { // JVMSpec| u2 attribute_name_index; // JVMSpec| u4 attribute_length; // JVMSpec| u2 line_number_table_length; // JVMSpec| { u2 start_pc; // JVMSpec| u2 line_number; // JVMSpec| } line_number_table[line_number_table_length]; // JVMSpec| } void JvmtiClassFileReconstituter::write_line_number_table_attribute(methodHandle method, u2 num_entries) { write_attribute_name_index("LineNumberTable"); write_u4(2 + num_entries * (2 + 2)); write_u2(num_entries); CompressedLineNumberReadStream stream(method->compressed_linenumber_table()); while (stream.read_pair()) { write_u2(stream.bci()); write_u2(stream.line()); } }