797 writer->write_u4((u4)*i); 798 break; 799 } 800 case JVM_SIGNATURE_LONG : { 801 jlong* l = (jlong*)addr; 802 writer->write_u8((u8)*l); 803 break; 804 } 805 case JVM_SIGNATURE_BOOLEAN : { 806 jboolean* b = (jboolean*)addr; 807 writer->write_u1((u1)*b); 808 break; 809 } 810 default : ShouldNotReachHere(); 811 } 812 } 813 814 // returns the size of the instance of the given class 815 u4 DumperSupport::instance_size(Klass* k) { 816 HandleMark hm; 817 instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), k); 818 819 u4 size = 0; 820 821 for (FieldStream fld(ikh, false, false); !fld.eos(); fld.next()) { 822 if (!fld.access_flags().is_static()) { 823 Symbol* sig = fld.signature(); 824 switch (sig->byte_at(0)) { 825 case JVM_SIGNATURE_CLASS : 826 case JVM_SIGNATURE_ARRAY : size += oopSize; break; 827 828 case JVM_SIGNATURE_BYTE : 829 case JVM_SIGNATURE_BOOLEAN : size += 1; break; 830 831 case JVM_SIGNATURE_CHAR : 832 case JVM_SIGNATURE_SHORT : size += 2; break; 833 834 case JVM_SIGNATURE_INT : 835 case JVM_SIGNATURE_FLOAT : size += 4; break; 836 837 case JVM_SIGNATURE_LONG : 838 case JVM_SIGNATURE_DOUBLE : size += 8; break; 839 840 default : ShouldNotReachHere(); 841 } 842 } 843 } 844 return size; 845 } 846 847 // dumps static fields of the given class 848 void DumperSupport::dump_static_fields(DumpWriter* writer, Klass* k) { 849 HandleMark hm; 850 instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), k); 851 852 // pass 1 - count the static fields 853 u2 field_count = 0; 854 for (FieldStream fldc(ikh, true, true); !fldc.eos(); fldc.next()) { 855 if (fldc.access_flags().is_static()) field_count++; 856 } 857 858 writer->write_u2(field_count); 859 860 // pass 2 - dump the field descriptors and raw values 861 for (FieldStream fld(ikh, true, true); !fld.eos(); fld.next()) { 862 if (fld.access_flags().is_static()) { 863 Symbol* sig = fld.signature(); 864 865 writer->write_symbolID(fld.name()); // name 866 writer->write_u1(sig2tag(sig)); // type 867 868 // value 869 int offset = fld.offset(); 870 address addr = (address)ikh->java_mirror() + offset; 871 872 dump_field_value(writer, sig->byte_at(0), addr); 873 } 874 } 875 } 876 877 // dump the raw values of the instance fields of the given object 878 void DumperSupport::dump_instance_fields(DumpWriter* writer, oop o) { 879 HandleMark hm; 880 instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), o->klass()); 881 882 for (FieldStream fld(ikh, false, false); !fld.eos(); fld.next()) { 883 if (!fld.access_flags().is_static()) { 884 Symbol* sig = fld.signature(); 885 address addr = (address)o + fld.offset(); 886 887 dump_field_value(writer, sig->byte_at(0), addr); 888 } 889 } 890 } 891 892 // dumps the definition of the instance fields for a given class 893 void DumperSupport::dump_instance_field_descriptors(DumpWriter* writer, Klass* k) { 894 HandleMark hm; 895 instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), k); 896 897 // pass 1 - count the instance fields 898 u2 field_count = 0; 899 for (FieldStream fldc(ikh, true, true); !fldc.eos(); fldc.next()) { 900 if (!fldc.access_flags().is_static()) field_count++; 901 } 902 903 writer->write_u2(field_count); 904 905 // pass 2 - dump the field descriptors 906 for (FieldStream fld(ikh, true, true); !fld.eos(); fld.next()) { 907 if (!fld.access_flags().is_static()) { 908 Symbol* sig = fld.signature(); 909 910 writer->write_symbolID(fld.name()); // name 911 writer->write_u1(sig2tag(sig)); // type 912 } 913 } 914 } 915 916 // creates HPROF_GC_INSTANCE_DUMP record for the given object 917 void DumperSupport::dump_instance(DumpWriter* writer, oop o) { 918 Klass* k = o->klass(); 919 920 writer->write_u1(HPROF_GC_INSTANCE_DUMP); 921 writer->write_objectID(o); 922 writer->write_u4(STACK_TRACE_ID); 923 924 // class ID 925 writer->write_classID(k); 926 | 797 writer->write_u4((u4)*i); 798 break; 799 } 800 case JVM_SIGNATURE_LONG : { 801 jlong* l = (jlong*)addr; 802 writer->write_u8((u8)*l); 803 break; 804 } 805 case JVM_SIGNATURE_BOOLEAN : { 806 jboolean* b = (jboolean*)addr; 807 writer->write_u1((u1)*b); 808 break; 809 } 810 default : ShouldNotReachHere(); 811 } 812 } 813 814 // returns the size of the instance of the given class 815 u4 DumperSupport::instance_size(Klass* k) { 816 HandleMark hm; 817 InstanceKlass* ik = InstanceKlass::cast(k); 818 819 u4 size = 0; 820 821 for (FieldStream fld(ik, false, false); !fld.eos(); fld.next()) { 822 if (!fld.access_flags().is_static()) { 823 Symbol* sig = fld.signature(); 824 switch (sig->byte_at(0)) { 825 case JVM_SIGNATURE_CLASS : 826 case JVM_SIGNATURE_ARRAY : size += oopSize; break; 827 828 case JVM_SIGNATURE_BYTE : 829 case JVM_SIGNATURE_BOOLEAN : size += 1; break; 830 831 case JVM_SIGNATURE_CHAR : 832 case JVM_SIGNATURE_SHORT : size += 2; break; 833 834 case JVM_SIGNATURE_INT : 835 case JVM_SIGNATURE_FLOAT : size += 4; break; 836 837 case JVM_SIGNATURE_LONG : 838 case JVM_SIGNATURE_DOUBLE : size += 8; break; 839 840 default : ShouldNotReachHere(); 841 } 842 } 843 } 844 return size; 845 } 846 847 // dumps static fields of the given class 848 void DumperSupport::dump_static_fields(DumpWriter* writer, Klass* k) { 849 HandleMark hm; 850 InstanceKlass* ik = InstanceKlass::cast(k); 851 852 // pass 1 - count the static fields 853 u2 field_count = 0; 854 for (FieldStream fldc(ik, true, true); !fldc.eos(); fldc.next()) { 855 if (fldc.access_flags().is_static()) field_count++; 856 } 857 858 writer->write_u2(field_count); 859 860 // pass 2 - dump the field descriptors and raw values 861 for (FieldStream fld(ik, true, true); !fld.eos(); fld.next()) { 862 if (fld.access_flags().is_static()) { 863 Symbol* sig = fld.signature(); 864 865 writer->write_symbolID(fld.name()); // name 866 writer->write_u1(sig2tag(sig)); // type 867 868 // value 869 int offset = fld.offset(); 870 address addr = (address)ik->java_mirror() + offset; 871 872 dump_field_value(writer, sig->byte_at(0), addr); 873 } 874 } 875 } 876 877 // dump the raw values of the instance fields of the given object 878 void DumperSupport::dump_instance_fields(DumpWriter* writer, oop o) { 879 HandleMark hm; 880 InstanceKlass* ik = InstanceKlass::cast(o->klass()); 881 882 for (FieldStream fld(ik, false, false); !fld.eos(); fld.next()) { 883 if (!fld.access_flags().is_static()) { 884 Symbol* sig = fld.signature(); 885 address addr = (address)o + fld.offset(); 886 887 dump_field_value(writer, sig->byte_at(0), addr); 888 } 889 } 890 } 891 892 // dumps the definition of the instance fields for a given class 893 void DumperSupport::dump_instance_field_descriptors(DumpWriter* writer, Klass* k) { 894 HandleMark hm; 895 InstanceKlass* ik = InstanceKlass::cast(k); 896 897 // pass 1 - count the instance fields 898 u2 field_count = 0; 899 for (FieldStream fldc(ik, true, true); !fldc.eos(); fldc.next()) { 900 if (!fldc.access_flags().is_static()) field_count++; 901 } 902 903 writer->write_u2(field_count); 904 905 // pass 2 - dump the field descriptors 906 for (FieldStream fld(ik, true, true); !fld.eos(); fld.next()) { 907 if (!fld.access_flags().is_static()) { 908 Symbol* sig = fld.signature(); 909 910 writer->write_symbolID(fld.name()); // name 911 writer->write_u1(sig2tag(sig)); // type 912 } 913 } 914 } 915 916 // creates HPROF_GC_INSTANCE_DUMP record for the given object 917 void DumperSupport::dump_instance(DumpWriter* writer, oop o) { 918 Klass* k = o->klass(); 919 920 writer->write_u1(HPROF_GC_INSTANCE_DUMP); 921 writer->write_objectID(o); 922 writer->write_u4(STACK_TRACE_ID); 923 924 // class ID 925 writer->write_classID(k); 926 |