23 */
24
25 #include "precompiled.hpp"
26 #include "classfile/symbolTable.hpp"
27 #include "interpreter/bytecodeStream.hpp"
28 #include "oops/fieldStreams.hpp"
29 #include "prims/jvmtiClassFileReconstituter.hpp"
30 #include "runtime/signature.hpp"
31 #include "utilities/bytes.hpp"
32
33 // FIXME: add Deprecated attribute
34 // FIXME: fix Synthetic attribute
35 // FIXME: per Serguei, add error return handling for ConstantPool::copy_cpool_bytes()
36
37
38 // Write the field information portion of ClassFile structure
39 // JVMSpec| u2 fields_count;
40 // JVMSpec| field_info fields[fields_count];
41 void JvmtiClassFileReconstituter::write_field_infos() {
42 HandleMark hm(thread());
43 Array<AnnotationArray*>* fields_anno = ikh()->fields_annotations();
44 Array<AnnotationArray*>* fields_type_anno = ikh()->fields_type_annotations();
45
46 // Compute the real number of Java fields
47 int java_fields = ikh()->java_fields_count();
48
49 write_u2(java_fields);
50 for (JavaFieldStream fs(ikh()); !fs.done(); fs.next()) {
51 AccessFlags access_flags = fs.access_flags();
52 int name_index = fs.name_index();
53 int signature_index = fs.signature_index();
54 int initial_value_index = fs.initval_index();
55 guarantee(name_index != 0 && signature_index != 0, "bad constant pool index for field");
56 // int offset = ikh()->field_offset( index );
57 int generic_signature_index = fs.generic_signature_index();
58 AnnotationArray* anno = fields_anno == NULL ? NULL : fields_anno->at(fs.index());
59 AnnotationArray* type_anno = fields_type_anno == NULL ? NULL : fields_type_anno->at(fs.index());
60
61 // JVMSpec| field_info {
62 // JVMSpec| u2 access_flags;
63 // JVMSpec| u2 name_index;
64 // JVMSpec| u2 descriptor_index;
65 // JVMSpec| u2 attributes_count;
66 // JVMSpec| attribute_info attributes[attributes_count];
67 // JVMSpec| }
68
69 write_u2(access_flags.as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS);
70 write_u2(name_index);
71 write_u2(signature_index);
72 int attr_count = 0;
73 if (initial_value_index != 0) {
74 ++attr_count;
75 }
76 if (access_flags.is_synthetic()) {
261 int checked_exceptions_length = const_method->checked_exceptions_length();
262 int size =
263 2 + // number_of_exceptions
264 2 * checked_exceptions_length; // exception_index_table
265
266 write_attribute_name_index("Exceptions");
267 write_u4(size);
268 write_u2(checked_exceptions_length);
269 for (int index = 0; index < checked_exceptions_length; index++) {
270 write_u2(checked_exceptions[index].class_cp_index);
271 }
272 }
273
274 // Write SourceFile attribute
275 // JVMSpec| SourceFile_attribute {
276 // JVMSpec| u2 attribute_name_index;
277 // JVMSpec| u4 attribute_length;
278 // JVMSpec| u2 sourcefile_index;
279 // JVMSpec| }
280 void JvmtiClassFileReconstituter::write_source_file_attribute() {
281 assert(ikh()->source_file_name() != NULL, "caller must check");
282
283 write_attribute_name_index("SourceFile");
284 write_u4(2); // always length 2
285 write_u2(symbol_to_cpool_index(ikh()->source_file_name()));
286 }
287
288 // Write SourceDebugExtension attribute
289 // JSR45| SourceDebugExtension_attribute {
290 // JSR45| u2 attribute_name_index;
291 // JSR45| u4 attribute_length;
292 // JSR45| u1 debug_extension[attribute_length];
293 // JSR45| }
294 void JvmtiClassFileReconstituter::write_source_debug_extension_attribute() {
295 assert(ikh()->source_debug_extension() != NULL, "caller must check");
296
297 write_attribute_name_index("SourceDebugExtension");
298 int len = (int)strlen(ikh()->source_debug_extension());
299 write_u4(len);
300 u1* ext = (u1*)ikh()->source_debug_extension();
301 for (int i=0; i<len; i++) {
302 write_u1(ext[i]);
303 }
304 }
305
306 // Write (generic) Signature attribute
307 // JVMSpec| Signature_attribute {
308 // JVMSpec| u2 attribute_name_index;
309 // JVMSpec| u4 attribute_length;
310 // JVMSpec| u2 signature_index;
311 // JVMSpec| }
312 void JvmtiClassFileReconstituter::write_signature_attribute(u2 generic_signature_index) {
313 write_attribute_name_index("Signature");
314 write_u4(2); // always length 2
315 write_u2(generic_signature_index);
316 }
317
318 // Compute the number of entries in the InnerClasses attribute
319 u2 JvmtiClassFileReconstituter::inner_classes_attribute_length() {
320 InnerClassesIterator iter(ikh());
321 return iter.length();
322 }
323
324 // Write an annotation attribute. The VM stores them in raw form, so all we need
325 // to do is add the attrubute name and fill in the length.
326 // JSR202| *Annotations_attribute {
327 // JSR202| u2 attribute_name_index;
328 // JSR202| u4 attribute_length;
329 // JSR202| ...
330 // JSR202| }
331 void JvmtiClassFileReconstituter::write_annotations_attribute(const char* attr_name,
332 AnnotationArray* annos) {
333 u4 length = annos->length();
334 write_attribute_name_index(attr_name);
335 write_u4(length);
336 memcpy(writeable_address(length), annos->adr_at(0), length);
337 }
338
339 // BootstrapMethods_attribute {
340 // u2 attribute_name_index;
370 for (int arg = 0; arg < num_bootstrap_arguments; arg++) {
371 u2 bootstrap_argument = cpool()->operand_argument_index_at(n, arg);
372 write_u2(bootstrap_argument);
373 }
374 }
375 }
376
377
378 // Write InnerClasses attribute
379 // JVMSpec| InnerClasses_attribute {
380 // JVMSpec| u2 attribute_name_index;
381 // JVMSpec| u4 attribute_length;
382 // JVMSpec| u2 number_of_classes;
383 // JVMSpec| { u2 inner_class_info_index;
384 // JVMSpec| u2 outer_class_info_index;
385 // JVMSpec| u2 inner_name_index;
386 // JVMSpec| u2 inner_class_access_flags;
387 // JVMSpec| } classes[number_of_classes];
388 // JVMSpec| }
389 void JvmtiClassFileReconstituter::write_inner_classes_attribute(int length) {
390 InnerClassesIterator iter(ikh());
391 guarantee(iter.length() != 0 && iter.length() == length,
392 "caller must check");
393 u2 entry_count = length / InstanceKlass::inner_class_next_offset;
394 u4 size = 2 + entry_count * (2+2+2+2);
395
396 write_attribute_name_index("InnerClasses");
397 write_u4(size);
398 write_u2(entry_count);
399 for (; !iter.done(); iter.next()) {
400 write_u2(iter.inner_class_info_index());
401 write_u2(iter.outer_class_info_index());
402 write_u2(iter.inner_name_index());
403 write_u2(iter.inner_access_flags());
404 }
405 }
406
407 // Write Synthetic attribute
408 // JVMSpec| Synthetic_attribute {
409 // JVMSpec| u2 attribute_name_index;
410 // JVMSpec| u4 attribute_length;
601 }
602 if (generic_signature_index != 0) {
603 write_signature_attribute(generic_signature_index);
604 }
605 if (anno != NULL) {
606 write_annotations_attribute("RuntimeVisibleAnnotations", anno);
607 }
608 if (param_anno != NULL) {
609 write_annotations_attribute("RuntimeVisibleParameterAnnotations", param_anno);
610 }
611 if (type_anno != NULL) {
612 write_annotations_attribute("RuntimeVisibleTypeAnnotations", type_anno);
613 }
614 }
615
616 // Write the class attributes portion of ClassFile structure
617 // JVMSpec| u2 attributes_count;
618 // JVMSpec| attribute_info attributes[attributes_count];
619 void JvmtiClassFileReconstituter::write_class_attributes() {
620 u2 inner_classes_length = inner_classes_attribute_length();
621 Symbol* generic_signature = ikh()->generic_signature();
622 AnnotationArray* anno = ikh()->class_annotations();
623 AnnotationArray* type_anno = ikh()->class_type_annotations();
624
625 int attr_count = 0;
626 if (generic_signature != NULL) {
627 ++attr_count;
628 }
629 if (ikh()->source_file_name() != NULL) {
630 ++attr_count;
631 }
632 if (ikh()->source_debug_extension() != NULL) {
633 ++attr_count;
634 }
635 if (inner_classes_length > 0) {
636 ++attr_count;
637 }
638 if (anno != NULL) {
639 ++attr_count; // has RuntimeVisibleAnnotations attribute
640 }
641 if (type_anno != NULL) {
642 ++attr_count; // has RuntimeVisibleTypeAnnotations attribute
643 }
644 if (cpool()->operands() != NULL) {
645 ++attr_count;
646 }
647
648 write_u2(attr_count);
649
650 if (generic_signature != NULL) {
651 write_signature_attribute(symbol_to_cpool_index(generic_signature));
652 }
653 if (ikh()->source_file_name() != NULL) {
654 write_source_file_attribute();
655 }
656 if (ikh()->source_debug_extension() != NULL) {
657 write_source_debug_extension_attribute();
658 }
659 if (inner_classes_length > 0) {
660 write_inner_classes_attribute(inner_classes_length);
661 }
662 if (anno != NULL) {
663 write_annotations_attribute("RuntimeVisibleAnnotations", anno);
664 }
665 if (type_anno != NULL) {
666 write_annotations_attribute("RuntimeVisibleTypeAnnotations", type_anno);
667 }
668 if (cpool()->operands() != NULL) {
669 write_bootstrapmethod_attribute();
670 }
671 }
672
673 // Write the method information portion of ClassFile structure
674 // JVMSpec| u2 methods_count;
675 // JVMSpec| method_info methods[methods_count];
676 void JvmtiClassFileReconstituter::write_method_infos() {
677 HandleMark hm(thread());
678 Array<Method*>* methods = ikh()->methods();
679 int num_methods = methods->length();
680 int num_overpass = 0;
681
682 // count the generated default interface methods
683 // these will not be re-created by write_method_info
684 // and should not be included in the total count
685 for (int index = 0; index < num_methods; index++) {
686 Method* method = methods->at(index);
687 if (method->is_overpass()) {
688 num_overpass++;
689 }
690 }
691
692 write_u2(num_methods - num_overpass);
693 if (JvmtiExport::can_maintain_original_method_order()) {
694 int index;
695 int original_index;
696 intArray method_order(num_methods, num_methods, 0);
697
698 // invert the method order mapping
699 for (index = 0; index < num_methods; index++) {
700 original_index = ikh()->method_ordering()->at(index);
701 assert(original_index >= 0 && original_index < num_methods,
702 "invalid original method index");
703 method_order.at_put(original_index, index);
704 }
705
706 // write in original order
707 for (original_index = 0; original_index < num_methods; original_index++) {
708 index = method_order.at(original_index);
709 methodHandle method(thread(), methods->at(index));
710 write_method_info(method);
711 }
712 } else {
713 // method order not preserved just dump the method infos
714 for (int index = 0; index < num_methods; index++) {
715 methodHandle method(thread(), methods->at(index));
716 write_method_info(method);
717 }
718 }
719 }
720
721 void JvmtiClassFileReconstituter::write_class_file_format() {
722 ReallocMark();
723
724 // JVMSpec| ClassFile {
725 // JVMSpec| u4 magic;
726 write_u4(0xCAFEBABE);
727
728 // JVMSpec| u2 minor_version;
729 // JVMSpec| u2 major_version;
730 write_u2(ikh()->minor_version());
731 u2 major = ikh()->major_version();
732 write_u2(major);
733
734 // JVMSpec| u2 constant_pool_count;
735 // JVMSpec| cp_info constant_pool[constant_pool_count-1];
736 write_u2(cpool()->length());
737 copy_cpool_bytes(writeable_address(cpool_size()));
738
739 // JVMSpec| u2 access_flags;
740 write_u2(ikh()->access_flags().get_flags() & JVM_RECOGNIZED_CLASS_MODIFIERS);
741
742 // JVMSpec| u2 this_class;
743 // JVMSpec| u2 super_class;
744 write_u2(class_symbol_to_cpool_index(ikh()->name()));
745 Klass* super_class = ikh()->super();
746 write_u2(super_class == NULL? 0 : // zero for java.lang.Object
747 class_symbol_to_cpool_index(super_class->name()));
748
749 // JVMSpec| u2 interfaces_count;
750 // JVMSpec| u2 interfaces[interfaces_count];
751 Array<Klass*>* interfaces = ikh()->local_interfaces();
752 int num_interfaces = interfaces->length();
753 write_u2(num_interfaces);
754 for (int index = 0; index < num_interfaces; index++) {
755 HandleMark hm(thread());
756 instanceKlassHandle iikh(thread(), interfaces->at(index));
757 write_u2(class_symbol_to_cpool_index(iikh->name()));
758 }
759
760 // JVMSpec| u2 fields_count;
761 // JVMSpec| field_info fields[fields_count];
762 write_field_infos();
763
764 // JVMSpec| u2 methods_count;
765 // JVMSpec| method_info methods[methods_count];
766 write_method_infos();
767
768 // JVMSpec| u2 attributes_count;
769 // JVMSpec| attribute_info attributes[attributes_count];
770 // JVMSpec| } /* end ClassFile 8?
771 write_class_attributes();
772 }
773
774 address JvmtiClassFileReconstituter::writeable_address(size_t size) {
775 size_t used_size = _buffer_ptr - _buffer;
776 if (size + used_size >= _buffer_size) {
777 // compute the new buffer size: must be at least twice as big as before
|
23 */
24
25 #include "precompiled.hpp"
26 #include "classfile/symbolTable.hpp"
27 #include "interpreter/bytecodeStream.hpp"
28 #include "oops/fieldStreams.hpp"
29 #include "prims/jvmtiClassFileReconstituter.hpp"
30 #include "runtime/signature.hpp"
31 #include "utilities/bytes.hpp"
32
33 // FIXME: add Deprecated attribute
34 // FIXME: fix Synthetic attribute
35 // FIXME: per Serguei, add error return handling for ConstantPool::copy_cpool_bytes()
36
37
38 // Write the field information portion of ClassFile structure
39 // JVMSpec| u2 fields_count;
40 // JVMSpec| field_info fields[fields_count];
41 void JvmtiClassFileReconstituter::write_field_infos() {
42 HandleMark hm(thread());
43 Array<AnnotationArray*>* fields_anno = ik()->fields_annotations();
44 Array<AnnotationArray*>* fields_type_anno = ik()->fields_type_annotations();
45
46 // Compute the real number of Java fields
47 int java_fields = ik()->java_fields_count();
48
49 write_u2(java_fields);
50 for (JavaFieldStream fs(ik()); !fs.done(); fs.next()) {
51 AccessFlags access_flags = fs.access_flags();
52 int name_index = fs.name_index();
53 int signature_index = fs.signature_index();
54 int initial_value_index = fs.initval_index();
55 guarantee(name_index != 0 && signature_index != 0, "bad constant pool index for field");
56 // int offset = ik()->field_offset( index );
57 int generic_signature_index = fs.generic_signature_index();
58 AnnotationArray* anno = fields_anno == NULL ? NULL : fields_anno->at(fs.index());
59 AnnotationArray* type_anno = fields_type_anno == NULL ? NULL : fields_type_anno->at(fs.index());
60
61 // JVMSpec| field_info {
62 // JVMSpec| u2 access_flags;
63 // JVMSpec| u2 name_index;
64 // JVMSpec| u2 descriptor_index;
65 // JVMSpec| u2 attributes_count;
66 // JVMSpec| attribute_info attributes[attributes_count];
67 // JVMSpec| }
68
69 write_u2(access_flags.as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS);
70 write_u2(name_index);
71 write_u2(signature_index);
72 int attr_count = 0;
73 if (initial_value_index != 0) {
74 ++attr_count;
75 }
76 if (access_flags.is_synthetic()) {
261 int checked_exceptions_length = const_method->checked_exceptions_length();
262 int size =
263 2 + // number_of_exceptions
264 2 * checked_exceptions_length; // exception_index_table
265
266 write_attribute_name_index("Exceptions");
267 write_u4(size);
268 write_u2(checked_exceptions_length);
269 for (int index = 0; index < checked_exceptions_length; index++) {
270 write_u2(checked_exceptions[index].class_cp_index);
271 }
272 }
273
274 // Write SourceFile attribute
275 // JVMSpec| SourceFile_attribute {
276 // JVMSpec| u2 attribute_name_index;
277 // JVMSpec| u4 attribute_length;
278 // JVMSpec| u2 sourcefile_index;
279 // JVMSpec| }
280 void JvmtiClassFileReconstituter::write_source_file_attribute() {
281 assert(ik()->source_file_name() != NULL, "caller must check");
282
283 write_attribute_name_index("SourceFile");
284 write_u4(2); // always length 2
285 write_u2(symbol_to_cpool_index(ik()->source_file_name()));
286 }
287
288 // Write SourceDebugExtension attribute
289 // JSR45| SourceDebugExtension_attribute {
290 // JSR45| u2 attribute_name_index;
291 // JSR45| u4 attribute_length;
292 // JSR45| u1 debug_extension[attribute_length];
293 // JSR45| }
294 void JvmtiClassFileReconstituter::write_source_debug_extension_attribute() {
295 assert(ik()->source_debug_extension() != NULL, "caller must check");
296
297 write_attribute_name_index("SourceDebugExtension");
298 int len = (int)strlen(ik()->source_debug_extension());
299 write_u4(len);
300 u1* ext = (u1*)ik()->source_debug_extension();
301 for (int i=0; i<len; i++) {
302 write_u1(ext[i]);
303 }
304 }
305
306 // Write (generic) Signature attribute
307 // JVMSpec| Signature_attribute {
308 // JVMSpec| u2 attribute_name_index;
309 // JVMSpec| u4 attribute_length;
310 // JVMSpec| u2 signature_index;
311 // JVMSpec| }
312 void JvmtiClassFileReconstituter::write_signature_attribute(u2 generic_signature_index) {
313 write_attribute_name_index("Signature");
314 write_u4(2); // always length 2
315 write_u2(generic_signature_index);
316 }
317
318 // Compute the number of entries in the InnerClasses attribute
319 u2 JvmtiClassFileReconstituter::inner_classes_attribute_length() {
320 InnerClassesIterator iter(ik());
321 return iter.length();
322 }
323
324 // Write an annotation attribute. The VM stores them in raw form, so all we need
325 // to do is add the attrubute name and fill in the length.
326 // JSR202| *Annotations_attribute {
327 // JSR202| u2 attribute_name_index;
328 // JSR202| u4 attribute_length;
329 // JSR202| ...
330 // JSR202| }
331 void JvmtiClassFileReconstituter::write_annotations_attribute(const char* attr_name,
332 AnnotationArray* annos) {
333 u4 length = annos->length();
334 write_attribute_name_index(attr_name);
335 write_u4(length);
336 memcpy(writeable_address(length), annos->adr_at(0), length);
337 }
338
339 // BootstrapMethods_attribute {
340 // u2 attribute_name_index;
370 for (int arg = 0; arg < num_bootstrap_arguments; arg++) {
371 u2 bootstrap_argument = cpool()->operand_argument_index_at(n, arg);
372 write_u2(bootstrap_argument);
373 }
374 }
375 }
376
377
378 // Write InnerClasses attribute
379 // JVMSpec| InnerClasses_attribute {
380 // JVMSpec| u2 attribute_name_index;
381 // JVMSpec| u4 attribute_length;
382 // JVMSpec| u2 number_of_classes;
383 // JVMSpec| { u2 inner_class_info_index;
384 // JVMSpec| u2 outer_class_info_index;
385 // JVMSpec| u2 inner_name_index;
386 // JVMSpec| u2 inner_class_access_flags;
387 // JVMSpec| } classes[number_of_classes];
388 // JVMSpec| }
389 void JvmtiClassFileReconstituter::write_inner_classes_attribute(int length) {
390 InnerClassesIterator iter(ik());
391 guarantee(iter.length() != 0 && iter.length() == length,
392 "caller must check");
393 u2 entry_count = length / InstanceKlass::inner_class_next_offset;
394 u4 size = 2 + entry_count * (2+2+2+2);
395
396 write_attribute_name_index("InnerClasses");
397 write_u4(size);
398 write_u2(entry_count);
399 for (; !iter.done(); iter.next()) {
400 write_u2(iter.inner_class_info_index());
401 write_u2(iter.outer_class_info_index());
402 write_u2(iter.inner_name_index());
403 write_u2(iter.inner_access_flags());
404 }
405 }
406
407 // Write Synthetic attribute
408 // JVMSpec| Synthetic_attribute {
409 // JVMSpec| u2 attribute_name_index;
410 // JVMSpec| u4 attribute_length;
601 }
602 if (generic_signature_index != 0) {
603 write_signature_attribute(generic_signature_index);
604 }
605 if (anno != NULL) {
606 write_annotations_attribute("RuntimeVisibleAnnotations", anno);
607 }
608 if (param_anno != NULL) {
609 write_annotations_attribute("RuntimeVisibleParameterAnnotations", param_anno);
610 }
611 if (type_anno != NULL) {
612 write_annotations_attribute("RuntimeVisibleTypeAnnotations", type_anno);
613 }
614 }
615
616 // Write the class attributes portion of ClassFile structure
617 // JVMSpec| u2 attributes_count;
618 // JVMSpec| attribute_info attributes[attributes_count];
619 void JvmtiClassFileReconstituter::write_class_attributes() {
620 u2 inner_classes_length = inner_classes_attribute_length();
621 Symbol* generic_signature = ik()->generic_signature();
622 AnnotationArray* anno = ik()->class_annotations();
623 AnnotationArray* type_anno = ik()->class_type_annotations();
624
625 int attr_count = 0;
626 if (generic_signature != NULL) {
627 ++attr_count;
628 }
629 if (ik()->source_file_name() != NULL) {
630 ++attr_count;
631 }
632 if (ik()->source_debug_extension() != NULL) {
633 ++attr_count;
634 }
635 if (inner_classes_length > 0) {
636 ++attr_count;
637 }
638 if (anno != NULL) {
639 ++attr_count; // has RuntimeVisibleAnnotations attribute
640 }
641 if (type_anno != NULL) {
642 ++attr_count; // has RuntimeVisibleTypeAnnotations attribute
643 }
644 if (cpool()->operands() != NULL) {
645 ++attr_count;
646 }
647
648 write_u2(attr_count);
649
650 if (generic_signature != NULL) {
651 write_signature_attribute(symbol_to_cpool_index(generic_signature));
652 }
653 if (ik()->source_file_name() != NULL) {
654 write_source_file_attribute();
655 }
656 if (ik()->source_debug_extension() != NULL) {
657 write_source_debug_extension_attribute();
658 }
659 if (inner_classes_length > 0) {
660 write_inner_classes_attribute(inner_classes_length);
661 }
662 if (anno != NULL) {
663 write_annotations_attribute("RuntimeVisibleAnnotations", anno);
664 }
665 if (type_anno != NULL) {
666 write_annotations_attribute("RuntimeVisibleTypeAnnotations", type_anno);
667 }
668 if (cpool()->operands() != NULL) {
669 write_bootstrapmethod_attribute();
670 }
671 }
672
673 // Write the method information portion of ClassFile structure
674 // JVMSpec| u2 methods_count;
675 // JVMSpec| method_info methods[methods_count];
676 void JvmtiClassFileReconstituter::write_method_infos() {
677 HandleMark hm(thread());
678 Array<Method*>* methods = ik()->methods();
679 int num_methods = methods->length();
680 int num_overpass = 0;
681
682 // count the generated default interface methods
683 // these will not be re-created by write_method_info
684 // and should not be included in the total count
685 for (int index = 0; index < num_methods; index++) {
686 Method* method = methods->at(index);
687 if (method->is_overpass()) {
688 num_overpass++;
689 }
690 }
691
692 write_u2(num_methods - num_overpass);
693 if (JvmtiExport::can_maintain_original_method_order()) {
694 int index;
695 int original_index;
696 intArray method_order(num_methods, num_methods, 0);
697
698 // invert the method order mapping
699 for (index = 0; index < num_methods; index++) {
700 original_index = ik()->method_ordering()->at(index);
701 assert(original_index >= 0 && original_index < num_methods,
702 "invalid original method index");
703 method_order.at_put(original_index, index);
704 }
705
706 // write in original order
707 for (original_index = 0; original_index < num_methods; original_index++) {
708 index = method_order.at(original_index);
709 methodHandle method(thread(), methods->at(index));
710 write_method_info(method);
711 }
712 } else {
713 // method order not preserved just dump the method infos
714 for (int index = 0; index < num_methods; index++) {
715 methodHandle method(thread(), methods->at(index));
716 write_method_info(method);
717 }
718 }
719 }
720
721 void JvmtiClassFileReconstituter::write_class_file_format() {
722 ReallocMark();
723
724 // JVMSpec| ClassFile {
725 // JVMSpec| u4 magic;
726 write_u4(0xCAFEBABE);
727
728 // JVMSpec| u2 minor_version;
729 // JVMSpec| u2 major_version;
730 write_u2(ik()->minor_version());
731 u2 major = ik()->major_version();
732 write_u2(major);
733
734 // JVMSpec| u2 constant_pool_count;
735 // JVMSpec| cp_info constant_pool[constant_pool_count-1];
736 write_u2(cpool()->length());
737 copy_cpool_bytes(writeable_address(cpool_size()));
738
739 // JVMSpec| u2 access_flags;
740 write_u2(ik()->access_flags().get_flags() & JVM_RECOGNIZED_CLASS_MODIFIERS);
741
742 // JVMSpec| u2 this_class;
743 // JVMSpec| u2 super_class;
744 write_u2(class_symbol_to_cpool_index(ik()->name()));
745 Klass* super_class = ik()->super();
746 write_u2(super_class == NULL? 0 : // zero for java.lang.Object
747 class_symbol_to_cpool_index(super_class->name()));
748
749 // JVMSpec| u2 interfaces_count;
750 // JVMSpec| u2 interfaces[interfaces_count];
751 Array<Klass*>* interfaces = ik()->local_interfaces();
752 int num_interfaces = interfaces->length();
753 write_u2(num_interfaces);
754 for (int index = 0; index < num_interfaces; index++) {
755 HandleMark hm(thread());
756 InstanceKlass* iik = InstanceKlass::cast(interfaces->at(index));
757 write_u2(class_symbol_to_cpool_index(iik->name()));
758 }
759
760 // JVMSpec| u2 fields_count;
761 // JVMSpec| field_info fields[fields_count];
762 write_field_infos();
763
764 // JVMSpec| u2 methods_count;
765 // JVMSpec| method_info methods[methods_count];
766 write_method_infos();
767
768 // JVMSpec| u2 attributes_count;
769 // JVMSpec| attribute_info attributes[attributes_count];
770 // JVMSpec| } /* end ClassFile 8?
771 write_class_attributes();
772 }
773
774 address JvmtiClassFileReconstituter::writeable_address(size_t size) {
775 size_t used_size = _buffer_ptr - _buffer;
776 if (size + used_size >= _buffer_size) {
777 // compute the new buffer size: must be at least twice as big as before
|