Mercurial > hg > graal-compiler
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 { |