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;
|