comparison src/share/vm/prims/jvmtiClassFileReconstituter.cpp @ 5967:f7c4174b33ba

7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field. Summary: Fold instanceKlass::_enclosing_method_class_index and instanceKlass::_enclosing_method_method_index into the instanceKlass::_inner_classes array. Reviewed-by: never, coleenp Contributed-by: Jiangli Zhou <jiangli.zhou@oracle.com>
author jiangli
date Tue, 13 Mar 2012 13:50:48 -0400
parents ff29ce866f23
children 04ade88d9712 8150fa46d2ed
comparison
equal deleted inserted replaced
5933:fde683df4c27 5967:f7c4174b33ba
290 write_u2(generic_signature_index); 290 write_u2(generic_signature_index);
291 } 291 }
292 292
293 // Compute the number of entries in the InnerClasses attribute 293 // Compute the number of entries in the InnerClasses attribute
294 u2 JvmtiClassFileReconstituter::inner_classes_attribute_length() { 294 u2 JvmtiClassFileReconstituter::inner_classes_attribute_length() {
295 typeArrayOop inner_class_list = ikh()->inner_classes(); 295 InnerClassesIterator iter(ikh());
296 return (inner_class_list == NULL) ? 0 : inner_class_list->length(); 296 return iter.length();
297 } 297 }
298 298
299 // Write an annotation attribute. The VM stores them in raw form, so all we need 299 // Write an annotation attribute. The VM stores them in raw form, so all we need
300 // to do is add the attrubute name and fill in the length. 300 // to do is add the attrubute name and fill in the length.
301 // JSR202| *Annotations_attribute { 301 // JSR202| *Annotations_attribute {
322 // JVMSpec| u2 inner_name_index; 322 // JVMSpec| u2 inner_name_index;
323 // JVMSpec| u2 inner_class_access_flags; 323 // JVMSpec| u2 inner_class_access_flags;
324 // JVMSpec| } classes[number_of_classes]; 324 // JVMSpec| } classes[number_of_classes];
325 // JVMSpec| } 325 // JVMSpec| }
326 void JvmtiClassFileReconstituter::write_inner_classes_attribute(int length) { 326 void JvmtiClassFileReconstituter::write_inner_classes_attribute(int length) {
327 typeArrayOop inner_class_list = ikh()->inner_classes(); 327 InnerClassesIterator iter(ikh());
328 guarantee(inner_class_list != NULL && inner_class_list->length() == length, 328 guarantee(iter.length() != 0 && iter.length() == length,
329 "caller must check"); 329 "caller must check");
330 typeArrayHandle inner_class_list_h(thread(), inner_class_list);
331 assert (length % instanceKlass::inner_class_next_offset == 0, "just checking");
332 u2 entry_count = length / instanceKlass::inner_class_next_offset; 330 u2 entry_count = length / instanceKlass::inner_class_next_offset;
333 u4 size = 2 + entry_count * (2+2+2+2); 331 u4 size = 2 + entry_count * (2+2+2+2);
334 332
335 write_attribute_name_index("InnerClasses"); 333 write_attribute_name_index("InnerClasses");
336 write_u4(size); 334 write_u4(size);
337 write_u2(entry_count); 335 write_u2(entry_count);
338 for (int i = 0; i < length; i += instanceKlass::inner_class_next_offset) { 336 for (; !iter.done(); iter.next()) {
339 write_u2(inner_class_list_h->ushort_at( 337 write_u2(iter.inner_class_info_index());
340 i + instanceKlass::inner_class_inner_class_info_offset)); 338 write_u2(iter.outer_class_info_index());
341 write_u2(inner_class_list_h->ushort_at( 339 write_u2(iter.inner_name_index());
342 i + instanceKlass::inner_class_outer_class_info_offset)); 340 write_u2(iter.inner_access_flags());
343 write_u2(inner_class_list_h->ushort_at(
344 i + instanceKlass::inner_class_inner_name_offset));
345 write_u2(inner_class_list_h->ushort_at(
346 i + instanceKlass::inner_class_access_flags_offset));
347 } 341 }
348 } 342 }
349 343
350 // Write Synthetic attribute 344 // Write Synthetic attribute
351 // JVMSpec| Synthetic_attribute { 345 // JVMSpec| Synthetic_attribute {