174 if (method->has_localvariable_table()) { 175 local_variable_table_length = method->localvariable_table_length(); 176 ++attr_count; 177 if (local_variable_table_length != 0) { 178 // Compute the size of the local variable table attribute (VM stores raw): 179 // LocalVariableTable_attribute { 180 // u2 attribute_name_index; 181 // u4 attribute_length; 182 // u2 local_variable_table_length; 183 // { 184 // u2 start_pc; 185 // u2 length; 186 // u2 name_index; 187 // u2 descriptor_index; 188 // u2 index; 189 // } 190 attr_size += 2 + 4 + 2 + local_variable_table_length * (2 + 2 + 2 + 2 + 2); 191 } 192 } 193 194 typeArrayHandle exception_table(thread(), const_method->exception_table()); 195 int exception_table_length = exception_table->length(); 196 int exception_table_entries = exception_table_length / 4; 197 int code_size = const_method->code_size(); 198 int size = 199 2+2+4 + // max_stack, max_locals, code_length 200 code_size + // code 201 2 + // exception_table_length 202 (2+2+2+2) * exception_table_entries + // exception_table 203 2 + // attributes_count 204 attr_size; // attributes 205 206 write_attribute_name_index("Code"); 207 write_u4(size); 208 write_u2(method->max_stack()); 209 write_u2(method->max_locals()); 210 write_u4(code_size); 211 copy_bytecodes(method, (unsigned char*)writeable_address(code_size)); 212 write_u2(exception_table_entries); 213 for (int index = 0; index < exception_table_length; ) { 214 write_u2(exception_table->int_at(index++)); 215 write_u2(exception_table->int_at(index++)); 216 write_u2(exception_table->int_at(index++)); 217 write_u2(exception_table->int_at(index++)); 218 } 219 write_u2(attr_count); 220 if (line_num_cnt != 0) { 221 write_line_number_table_attribute(method, line_num_cnt); 222 } 223 if (stackmap_len != 0) { 224 write_stackmap_table_attribute(method, stackmap_len); 225 } 226 if (local_variable_table_length != 0) { 227 write_local_variable_table_attribute(method, local_variable_table_length); 228 } 229 } 230 231 // Write Exceptions attribute 232 // JVMSpec| Exceptions_attribute { 233 // JVMSpec| u2 attribute_name_index; 234 // JVMSpec| u4 attribute_length; 235 // JVMSpec| u2 number_of_exceptions; 236 // JVMSpec| u2 exception_index_table[number_of_exceptions]; 237 // JVMSpec| } | 174 if (method->has_localvariable_table()) { 175 local_variable_table_length = method->localvariable_table_length(); 176 ++attr_count; 177 if (local_variable_table_length != 0) { 178 // Compute the size of the local variable table attribute (VM stores raw): 179 // LocalVariableTable_attribute { 180 // u2 attribute_name_index; 181 // u4 attribute_length; 182 // u2 local_variable_table_length; 183 // { 184 // u2 start_pc; 185 // u2 length; 186 // u2 name_index; 187 // u2 descriptor_index; 188 // u2 index; 189 // } 190 attr_size += 2 + 4 + 2 + local_variable_table_length * (2 + 2 + 2 + 2 + 2); 191 } 192 } 193 194 ExceptionTable exception_table(method()); 195 int exception_table_length = exception_table.length(); 196 int code_size = const_method->code_size(); 197 int size = 198 2+2+4 + // max_stack, max_locals, code_length 199 code_size + // code 200 2 + // exception_table_length 201 (2+2+2+2) * exception_table_length + // exception_table 202 2 + // attributes_count 203 attr_size; // attributes 204 205 write_attribute_name_index("Code"); 206 write_u4(size); 207 write_u2(method->max_stack()); 208 write_u2(method->max_locals()); 209 write_u4(code_size); 210 copy_bytecodes(method, (unsigned char*)writeable_address(code_size)); 211 write_u2(exception_table_length); 212 for (int index = 0; index < exception_table_length; index++) { 213 write_u2(exception_table.start_pc(index)); 214 write_u2(exception_table.end_pc(index)); 215 write_u2(exception_table.handler_pc(index)); 216 write_u2(exception_table.catch_type_index(index)); 217 } 218 write_u2(attr_count); 219 if (line_num_cnt != 0) { 220 write_line_number_table_attribute(method, line_num_cnt); 221 } 222 if (stackmap_len != 0) { 223 write_stackmap_table_attribute(method, stackmap_len); 224 } 225 if (local_variable_table_length != 0) { 226 write_local_variable_table_attribute(method, local_variable_table_length); 227 } 228 } 229 230 // Write Exceptions attribute 231 // JVMSpec| Exceptions_attribute { 232 // JVMSpec| u2 attribute_name_index; 233 // JVMSpec| u4 attribute_length; 234 // JVMSpec| u2 number_of_exceptions; 235 // JVMSpec| u2 exception_index_table[number_of_exceptions]; 236 // JVMSpec| } |