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