Mercurial > hg > truffle
comparison src/share/vm/oops/klassVtable.cpp @ 16:f8236e79048a
6664627: Merge changes made only in hotspot 11 forward to jdk 7
Reviewed-by: jcoomes
author | dcubed |
---|---|
date | Wed, 05 Dec 2007 09:00:00 -0800 |
parents | a61af66fc99e |
children | ba764ed4b6f2 |
comparison
equal
deleted
inserted
replaced
1:92489cdc94d1 | 16:f8236e79048a |
---|---|
733 assert(_table_offset >= 0 && _size_offset_table >= 0 && _size_method_table >= 0, "wrong computation"); | 733 assert(_table_offset >= 0 && _size_offset_table >= 0 && _size_method_table >= 0, "wrong computation"); |
734 return; | 734 return; |
735 } | 735 } |
736 } | 736 } |
737 | 737 |
738 // This lenght of the itable was either zero, or it has not yet been initialized. | 738 // The length of the itable was either zero, or it has not yet been initialized. |
739 _table_offset = 0; | 739 _table_offset = 0; |
740 _size_offset_table = 0; | 740 _size_offset_table = 0; |
741 _size_method_table = 0; | 741 _size_method_table = 0; |
742 } | 742 } |
743 | 743 |
868 | 868 |
869 static int initialize_count = 0; | 869 static int initialize_count = 0; |
870 | 870 |
871 // Initialization | 871 // Initialization |
872 void klassItable::initialize_itable(bool checkconstraints, TRAPS) { | 872 void klassItable::initialize_itable(bool checkconstraints, TRAPS) { |
873 // Cannot be setup doing bootstrapping | 873 // Cannot be setup doing bootstrapping, interfaces don't have |
874 if (Universe::is_bootstrapping()) return; | 874 // itables, and klass with only ones entry have empty itables |
875 | 875 if (Universe::is_bootstrapping() || |
876 int num_interfaces = nof_interfaces(); | 876 _klass->is_interface() || |
877 _klass->itable_length() == itableOffsetEntry::size()) return; | |
878 | |
879 // There's alway an extra itable entry so we can null-terminate it. | |
880 guarantee(size_offset_table() >= 1, "too small"); | |
881 int num_interfaces = size_offset_table() - 1; | |
877 if (num_interfaces > 0) { | 882 if (num_interfaces > 0) { |
878 if (TraceItables) tty->print_cr("%3d: Initializing itables for %s", ++initialize_count, _klass->name()->as_C_string()); | 883 if (TraceItables) tty->print_cr("%3d: Initializing itables for %s", ++initialize_count, |
879 | 884 _klass->name()->as_C_string()); |
880 // In debug mode, we got an extra NULL/NULL entry | 885 |
881 debug_only(num_interfaces--); | |
882 assert(num_interfaces > 0, "to few interfaces in offset itable"); | |
883 | 886 |
884 // Interate through all interfaces | 887 // Interate through all interfaces |
885 int i; | 888 int i; |
886 for(i = 0; i < num_interfaces; i++) { | 889 for(i = 0; i < num_interfaces; i++) { |
887 itableOffsetEntry* ioe = offset_entry(i); | 890 itableOffsetEntry* ioe = offset_entry(i); |
888 KlassHandle interf_h (THREAD, ioe->interface_klass()); | 891 KlassHandle interf_h (THREAD, ioe->interface_klass()); |
889 assert(interf_h() != NULL && ioe->offset() != 0, "bad offset entry in itable"); | 892 assert(interf_h() != NULL && ioe->offset() != 0, "bad offset entry in itable"); |
890 initialize_itable_for_interface(ioe->offset(), interf_h, checkconstraints, CHECK); | 893 initialize_itable_for_interface(ioe->offset(), interf_h, checkconstraints, CHECK); |
891 } | 894 } |
892 | 895 |
893 #ifdef ASSERT | 896 } |
894 // Check that the last entry is empty | 897 // Check that the last entry is empty |
895 itableOffsetEntry* ioe = offset_entry(i); | 898 itableOffsetEntry* ioe = offset_entry(size_offset_table() - 1); |
896 assert(ioe->interface_klass() == NULL && ioe->offset() == 0, "terminator entry missing"); | 899 guarantee(ioe->interface_klass() == NULL && ioe->offset() == 0, "terminator entry missing"); |
897 #endif | |
898 } | |
899 } | 900 } |
900 | 901 |
901 | 902 |
902 void klassItable::initialize_itable_for_interface(int method_table_offset, KlassHandle interf_h, bool checkconstraints, TRAPS) { | 903 void klassItable::initialize_itable_for_interface(int method_table_offset, KlassHandle interf_h, bool checkconstraints, TRAPS) { |
903 objArrayHandle methods(THREAD, instanceKlass::cast(interf_h())->methods()); | 904 objArrayHandle methods(THREAD, instanceKlass::cast(interf_h())->methods()); |
970 // Progress to next entry | 971 // Progress to next entry |
971 ime_num++; | 972 ime_num++; |
972 } | 973 } |
973 } | 974 } |
974 | 975 |
975 // Update entry for specic methodOop | 976 // Update entry for specific methodOop |
976 void klassItable::initialize_with_method(methodOop m) { | 977 void klassItable::initialize_with_method(methodOop m) { |
977 itableMethodEntry* ime = method_entry(0); | 978 itableMethodEntry* ime = method_entry(0); |
978 for(int i = 0; i < _size_method_table; i++) { | 979 for(int i = 0; i < _size_method_table; i++) { |
979 if (ime->method() == m) { | 980 if (ime->method() == m) { |
980 ime->initialize(m); | 981 ime->initialize(m); |
1083 int klassItable::compute_itable_size(objArrayHandle transitive_interfaces) { | 1084 int klassItable::compute_itable_size(objArrayHandle transitive_interfaces) { |
1084 // Count no of interfaces and total number of interface methods | 1085 // Count no of interfaces and total number of interface methods |
1085 CountInterfacesClosure cic; | 1086 CountInterfacesClosure cic; |
1086 visit_all_interfaces(transitive_interfaces(), &cic); | 1087 visit_all_interfaces(transitive_interfaces(), &cic); |
1087 | 1088 |
1088 // Add one extra entry in debug mode, so we can null-terminate the table | 1089 // There's alway an extra itable entry so we can null-terminate it. |
1089 int nof_methods = cic.nof_methods(); | 1090 int itable_size = calc_itable_size(cic.nof_interfaces() + 1, cic.nof_methods()); |
1090 int nof_interfaces = cic.nof_interfaces(); | |
1091 debug_only(if (nof_interfaces > 0) nof_interfaces++); | |
1092 | |
1093 int itable_size = calc_itable_size(nof_interfaces, nof_methods); | |
1094 | 1091 |
1095 // Statistics | 1092 // Statistics |
1096 update_stats(itable_size * HeapWordSize); | 1093 update_stats(itable_size * HeapWordSize); |
1097 | 1094 |
1098 return itable_size; | 1095 return itable_size; |
1108 CountInterfacesClosure cic; | 1105 CountInterfacesClosure cic; |
1109 visit_all_interfaces(klass->transitive_interfaces(), &cic); | 1106 visit_all_interfaces(klass->transitive_interfaces(), &cic); |
1110 int nof_methods = cic.nof_methods(); | 1107 int nof_methods = cic.nof_methods(); |
1111 int nof_interfaces = cic.nof_interfaces(); | 1108 int nof_interfaces = cic.nof_interfaces(); |
1112 | 1109 |
1113 // Add one extra entry in debug mode, so we can null-terminate the table | 1110 // Add one extra entry so we can null-terminate the table |
1114 debug_only(if (nof_interfaces > 0) nof_interfaces++); | 1111 nof_interfaces++; |
1115 | 1112 |
1116 assert(compute_itable_size(objArrayHandle(klass->transitive_interfaces())) == | 1113 assert(compute_itable_size(objArrayHandle(klass->transitive_interfaces())) == |
1117 calc_itable_size(nof_interfaces, nof_methods), | 1114 calc_itable_size(nof_interfaces, nof_methods), |
1118 "mismatch calculation of itable size"); | 1115 "mismatch calculation of itable size"); |
1119 | 1116 |