< prev index next >

src/hotspot/share/oops/arrayKlass.cpp

Print this page




 113 }
 114 
 115 GrowableArray<Klass*>* ArrayKlass::compute_secondary_supers(int num_extra_slots,
 116                                                             Array<InstanceKlass*>* transitive_interfaces) {
 117   // interfaces = { cloneable_klass, serializable_klass };
 118   assert(num_extra_slots == 0, "sanity of primitive array type");
 119   assert(transitive_interfaces == NULL, "sanity");
 120   // Must share this for correct bootstrapping!
 121   set_secondary_supers(Universe::the_array_interfaces_array());
 122   return NULL;
 123 }
 124 
 125 bool ArrayKlass::compute_is_subtype_of(Klass* k) {
 126   // An array is a subtype of Serializable, Clonable, and Object
 127   return    k == SystemDictionary::Object_klass()
 128          || k == SystemDictionary::Cloneable_klass()
 129          || k == SystemDictionary::Serializable_klass();
 130 }
 131 
 132 objArrayOop ArrayKlass::allocate_arrayArray(int n, int length, TRAPS) {
 133   if (length < 0) {
 134     THROW_MSG_0(vmSymbols::java_lang_NegativeArraySizeException(), err_msg("%d", length));
 135   }
 136   if (length > arrayOopDesc::max_array_length(T_ARRAY)) {
 137     report_java_out_of_memory("Requested array size exceeds VM limit");
 138     JvmtiExport::post_array_size_exhausted();
 139     THROW_OOP_0(Universe::out_of_memory_error_array_size());
 140   }
 141   int size = objArrayOopDesc::object_size(length);
 142   Klass* k = array_klass(n+dimension(), CHECK_0);
 143   ArrayKlass* ak = ArrayKlass::cast(k);
 144   objArrayOop o = (objArrayOop)Universe::heap()->array_allocate(ak, size, length,
 145                                                                 /* do_zero */ true, CHECK_0);
 146   // initialization to NULL not necessary, area already cleared
 147   return o;
 148 }
 149 
 150 void ArrayKlass::array_klasses_do(void f(Klass* k, TRAPS), TRAPS) {
 151   Klass* k = this;
 152   // Iterate over this array klass and all higher dimensions
 153   while (k != NULL) {
 154     f(k, CHECK);
 155     k = ArrayKlass::cast(k)->higher_dimension();
 156   }
 157 }
 158 
 159 void ArrayKlass::array_klasses_do(void f(Klass* k)) {
 160   Klass* k = this;




 113 }
 114 
 115 GrowableArray<Klass*>* ArrayKlass::compute_secondary_supers(int num_extra_slots,
 116                                                             Array<InstanceKlass*>* transitive_interfaces) {
 117   // interfaces = { cloneable_klass, serializable_klass };
 118   assert(num_extra_slots == 0, "sanity of primitive array type");
 119   assert(transitive_interfaces == NULL, "sanity");
 120   // Must share this for correct bootstrapping!
 121   set_secondary_supers(Universe::the_array_interfaces_array());
 122   return NULL;
 123 }
 124 
 125 bool ArrayKlass::compute_is_subtype_of(Klass* k) {
 126   // An array is a subtype of Serializable, Clonable, and Object
 127   return    k == SystemDictionary::Object_klass()
 128          || k == SystemDictionary::Cloneable_klass()
 129          || k == SystemDictionary::Serializable_klass();
 130 }
 131 
 132 objArrayOop ArrayKlass::allocate_arrayArray(int n, int length, TRAPS) {
 133   check_array_allocation_length(length, arrayOopDesc::max_array_length(T_ARRAY), CHECK_0);







 134   int size = objArrayOopDesc::object_size(length);
 135   Klass* k = array_klass(n+dimension(), CHECK_0);
 136   ArrayKlass* ak = ArrayKlass::cast(k);
 137   objArrayOop o = (objArrayOop)Universe::heap()->array_allocate(ak, size, length,
 138                                                                 /* do_zero */ true, CHECK_0);
 139   // initialization to NULL not necessary, area already cleared
 140   return o;
 141 }
 142 
 143 void ArrayKlass::array_klasses_do(void f(Klass* k, TRAPS), TRAPS) {
 144   Klass* k = this;
 145   // Iterate over this array klass and all higher dimensions
 146   while (k != NULL) {
 147     f(k, CHECK);
 148     k = ArrayKlass::cast(k)->higher_dimension();
 149   }
 150 }
 151 
 152 void ArrayKlass::array_klasses_do(void f(Klass* k)) {
 153   Klass* k = this;


< prev index next >