54 Klass* ArrayKlass::java_super() const {
55 if (super() == NULL) return NULL; // bootstrap case
56 // Array klasses have primary supertypes which are not reported to Java.
57 // Example super chain: String[][] -> Object[][] -> Object[] -> Object
58 return SystemDictionary::Object_klass();
59 }
60
61
62 oop ArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
63 ShouldNotReachHere();
64 return NULL;
65 }
66
67 Method* ArrayKlass::uncached_lookup_method(Symbol* name, Symbol* signature) const {
68 // There are no methods in an array klass but the super class (Object) has some
69 assert(super(), "super klass must be present");
70 return super()->uncached_lookup_method(name, signature);
71 }
72
73 ArrayKlass::ArrayKlass(Symbol* name) {
74 set_alloc_size(0);
75 set_name(name);
76
77 set_super(Universe::is_bootstrapping() ? (Klass*)NULL : SystemDictionary::Object_klass());
78 set_layout_helper(Klass::_lh_neutral_value);
79 set_dimension(1);
80 set_higher_dimension(NULL);
81 set_lower_dimension(NULL);
82 set_component_mirror(NULL);
83 // Arrays don't add any new methods, so their vtable is the same size as
84 // the vtable of klass Object.
85 int vtable_size = Universe::base_vtable_size();
86 set_vtable_length(vtable_size);
87 set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5)
88 }
89
90
91 // Initialization of vtables and mirror object is done separatly from base_create_array_klass,
92 // since a GC can happen. At this point all instance variables of the ArrayKlass must be setup.
93 void ArrayKlass::complete_create_array_klass(ArrayKlass* k, KlassHandle super_klass, TRAPS) {
94 ResourceMark rm(THREAD);
143 return o;
144 }
145
146 void ArrayKlass::array_klasses_do(void f(Klass* k, TRAPS), TRAPS) {
147 Klass* k = this;
148 // Iterate over this array klass and all higher dimensions
149 while (k != NULL) {
150 f(k, CHECK);
151 k = ArrayKlass::cast(k)->higher_dimension();
152 }
153 }
154
155 void ArrayKlass::array_klasses_do(void f(Klass* k)) {
156 Klass* k = this;
157 // Iterate over this array klass and all higher dimensions
158 while (k != NULL) {
159 f(k);
160 k = ArrayKlass::cast(k)->higher_dimension();
161 }
162 }
163
164
165 void ArrayKlass::with_array_klasses_do(void f(Klass* k)) {
166 array_klasses_do(f);
167 }
168
169
170 // GC support
171
172 void ArrayKlass::oops_do(OopClosure* cl) {
173 Klass::oops_do(cl);
174
175 cl->do_oop(adr_component_mirror());
176 }
177
178 // JVM support
179
180 jint ArrayKlass::compute_modifier_flags(TRAPS) const {
181 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
182 }
183
184 // JVMTI support
185
186 jint ArrayKlass::jvmti_class_status() const {
187 return JVMTI_CLASS_STATUS_ARRAY;
188 }
|
54 Klass* ArrayKlass::java_super() const {
55 if (super() == NULL) return NULL; // bootstrap case
56 // Array klasses have primary supertypes which are not reported to Java.
57 // Example super chain: String[][] -> Object[][] -> Object[] -> Object
58 return SystemDictionary::Object_klass();
59 }
60
61
62 oop ArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
63 ShouldNotReachHere();
64 return NULL;
65 }
66
67 Method* ArrayKlass::uncached_lookup_method(Symbol* name, Symbol* signature) const {
68 // There are no methods in an array klass but the super class (Object) has some
69 assert(super(), "super klass must be present");
70 return super()->uncached_lookup_method(name, signature);
71 }
72
73 ArrayKlass::ArrayKlass(Symbol* name) {
74 set_name(name);
75
76 set_super(Universe::is_bootstrapping() ? (Klass*)NULL : SystemDictionary::Object_klass());
77 set_layout_helper(Klass::_lh_neutral_value);
78 set_dimension(1);
79 set_higher_dimension(NULL);
80 set_lower_dimension(NULL);
81 set_component_mirror(NULL);
82 // Arrays don't add any new methods, so their vtable is the same size as
83 // the vtable of klass Object.
84 int vtable_size = Universe::base_vtable_size();
85 set_vtable_length(vtable_size);
86 set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5)
87 }
88
89
90 // Initialization of vtables and mirror object is done separatly from base_create_array_klass,
91 // since a GC can happen. At this point all instance variables of the ArrayKlass must be setup.
92 void ArrayKlass::complete_create_array_klass(ArrayKlass* k, KlassHandle super_klass, TRAPS) {
93 ResourceMark rm(THREAD);
142 return o;
143 }
144
145 void ArrayKlass::array_klasses_do(void f(Klass* k, TRAPS), TRAPS) {
146 Klass* k = this;
147 // Iterate over this array klass and all higher dimensions
148 while (k != NULL) {
149 f(k, CHECK);
150 k = ArrayKlass::cast(k)->higher_dimension();
151 }
152 }
153
154 void ArrayKlass::array_klasses_do(void f(Klass* k)) {
155 Klass* k = this;
156 // Iterate over this array klass and all higher dimensions
157 while (k != NULL) {
158 f(k);
159 k = ArrayKlass::cast(k)->higher_dimension();
160 }
161 }
162
163 // GC support
164
165 void ArrayKlass::oops_do(OopClosure* cl) {
166 Klass::oops_do(cl);
167
168 cl->do_oop(adr_component_mirror());
169 }
170
171 // JVM support
172
173 jint ArrayKlass::compute_modifier_flags(TRAPS) const {
174 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
175 }
176
177 // JVMTI support
178
179 jint ArrayKlass::jvmti_class_status() const {
180 return JVMTI_CLASS_STATUS_ARRAY;
181 }
|