14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "classfile/javaClasses.hpp"
27 #include "classfile/systemDictionary.hpp"
28 #include "gc_implementation/shared/markSweep.inline.hpp"
29 #include "gc_interface/collectedHeap.inline.hpp"
30 #include "oops/instanceKlass.hpp"
31 #include "oops/objArrayKlassKlass.hpp"
32 #include "oops/oop.inline.hpp"
33 #include "oops/oop.inline2.hpp"
34
35 klassOop objArrayKlassKlass::create_klass(TRAPS) {
36 objArrayKlassKlass o;
37 KlassHandle h_this_klass(THREAD, Universe::klassKlassObj());
38 KlassHandle k = base_create_klass(h_this_klass, header_size(), o.vtbl_value(), CHECK_0);
39 assert(k()->size() == align_object_size(header_size()), "wrong size for object");
40 java_lang_Class::create_mirror(k, CHECK_0); // Allocate mirror
41 return k();
42 }
43
44 klassOop objArrayKlassKlass::allocate_system_objArray_klass(TRAPS) {
45 // system_objArrays have no instance klass, so allocate with fake class, then reset to NULL
46 KlassHandle kk(THREAD, Universe::intArrayKlassObj());
47 klassOop k = allocate_objArray_klass(1, kk, CHECK_0);
48 objArrayKlass* tk = (objArrayKlass*) k->klass_part();
49 tk->set_element_klass(NULL);
50 tk->set_bottom_klass(NULL);
51 return k;
52 }
53
219 objArrayKlass* oak = objArrayKlass::cast((klassOop)obj);
220 blk->do_oop(oak->element_klass_addr());
221 blk->do_oop(oak->bottom_klass_addr());
222
223 return arrayKlassKlass::oop_oop_iterate(obj, blk);
224 }
225
226
227 int
228 objArrayKlassKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) {
229 assert(obj->is_klass(), "must be klass");
230 assert(klassOop(obj)->klass_part()->oop_is_objArray_slow(), "must be obj array");
231
232 objArrayKlass* oak = objArrayKlass::cast((klassOop)obj);
233 oop* addr;
234 addr = oak->element_klass_addr();
235 if (mr.contains(addr)) blk->do_oop(addr);
236 addr = oak->bottom_klass_addr();
237 if (mr.contains(addr)) blk->do_oop(addr);
238
239 return arrayKlassKlass::oop_oop_iterate(obj, blk);
240 }
241
242 #ifndef SERIALGC
243 void objArrayKlassKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
244 assert(obj->blueprint()->oop_is_objArrayKlass(),"must be an obj array klass");
245 }
246
247 int objArrayKlassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
248 assert(obj->is_klass(), "must be klass");
249 assert(klassOop(obj)->klass_part()->oop_is_objArray_slow(), "must be obj array");
250
251 objArrayKlass* oak = objArrayKlass::cast((klassOop)obj);
252 PSParallelCompact::adjust_pointer(oak->element_klass_addr());
253 PSParallelCompact::adjust_pointer(oak->bottom_klass_addr());
254
255 return arrayKlassKlass::oop_update_pointers(cm, obj);
256 }
257 #endif // SERIALGC
258
259 #ifndef PRODUCT
260
261 // Printing
262
263 void objArrayKlassKlass::oop_print_on(oop obj, outputStream* st) {
264 assert(obj->is_klass(), "must be klass");
270 }
271
272 #endif //PRODUCT
273
274 void objArrayKlassKlass::oop_print_value_on(oop obj, outputStream* st) {
275 assert(obj->is_klass(), "must be klass");
276 objArrayKlass* oak = (objArrayKlass*) klassOop(obj)->klass_part();
277
278 oak->element_klass()->print_value_on(st);
279 st->print("[]");
280 }
281
282 const char* objArrayKlassKlass::internal_name() const {
283 return "{object array class}";
284 }
285
286
287 // Verification
288
289 void objArrayKlassKlass::oop_verify_on(oop obj, outputStream* st) {
290 klassKlass::oop_verify_on(obj, st);
291 objArrayKlass* oak = objArrayKlass::cast((klassOop)obj);
292 guarantee(oak->element_klass()->is_perm(), "should be in permspace");
293 guarantee(oak->element_klass()->is_klass(), "should be klass");
294 guarantee(oak->bottom_klass()->is_perm(), "should be in permspace");
295 guarantee(oak->bottom_klass()->is_klass(), "should be klass");
296 Klass* bk = Klass::cast(oak->bottom_klass());
297 guarantee(bk->oop_is_instance() || bk->oop_is_typeArray(), "invalid bottom klass");
298 }
|
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "classfile/javaClasses.hpp"
27 #include "classfile/systemDictionary.hpp"
28 #include "gc_implementation/shared/markSweep.inline.hpp"
29 #include "gc_interface/collectedHeap.inline.hpp"
30 #include "oops/instanceKlass.hpp"
31 #include "oops/objArrayKlassKlass.hpp"
32 #include "oops/oop.inline.hpp"
33 #include "oops/oop.inline2.hpp"
34 #ifndef SERIALGC
35 #include "gc_implementation/parNew/parOopClosures.inline.hpp"
36 #include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp"
37 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp"
38 #include "memory/cardTableRS.hpp"
39 #include "oops/oop.pcgc.inline.hpp"
40 #endif
41
42 klassOop objArrayKlassKlass::create_klass(TRAPS) {
43 objArrayKlassKlass o;
44 KlassHandle h_this_klass(THREAD, Universe::klassKlassObj());
45 KlassHandle k = base_create_klass(h_this_klass, header_size(), o.vtbl_value(), CHECK_0);
46 assert(k()->size() == align_object_size(header_size()), "wrong size for object");
47 java_lang_Class::create_mirror(k, CHECK_0); // Allocate mirror
48 return k();
49 }
50
51 klassOop objArrayKlassKlass::allocate_system_objArray_klass(TRAPS) {
52 // system_objArrays have no instance klass, so allocate with fake class, then reset to NULL
53 KlassHandle kk(THREAD, Universe::intArrayKlassObj());
54 klassOop k = allocate_objArray_klass(1, kk, CHECK_0);
55 objArrayKlass* tk = (objArrayKlass*) k->klass_part();
56 tk->set_element_klass(NULL);
57 tk->set_bottom_klass(NULL);
58 return k;
59 }
60
226 objArrayKlass* oak = objArrayKlass::cast((klassOop)obj);
227 blk->do_oop(oak->element_klass_addr());
228 blk->do_oop(oak->bottom_klass_addr());
229
230 return arrayKlassKlass::oop_oop_iterate(obj, blk);
231 }
232
233
234 int
235 objArrayKlassKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) {
236 assert(obj->is_klass(), "must be klass");
237 assert(klassOop(obj)->klass_part()->oop_is_objArray_slow(), "must be obj array");
238
239 objArrayKlass* oak = objArrayKlass::cast((klassOop)obj);
240 oop* addr;
241 addr = oak->element_klass_addr();
242 if (mr.contains(addr)) blk->do_oop(addr);
243 addr = oak->bottom_klass_addr();
244 if (mr.contains(addr)) blk->do_oop(addr);
245
246 return arrayKlassKlass::oop_oop_iterate_m(obj, blk, mr);
247 }
248
249 #ifndef SERIALGC
250 void objArrayKlassKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
251 assert(obj->blueprint()->oop_is_objArrayKlass(),"must be an obj array klass");
252 objArrayKlass* oak = objArrayKlass::cast((klassOop)obj);
253 oop* p = oak->element_klass_addr();
254 if (PSScavenge::should_scavenge(p)) {
255 pm->claim_or_forward_depth(p);
256 }
257 p = oak->bottom_klass_addr();
258 if (PSScavenge::should_scavenge(p)) {
259 pm->claim_or_forward_depth(p);
260 }
261
262 arrayKlassKlass::oop_push_contents(pm, obj);
263 }
264
265 int objArrayKlassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
266 assert(obj->is_klass(), "must be klass");
267 assert(klassOop(obj)->klass_part()->oop_is_objArray_slow(), "must be obj array");
268
269 objArrayKlass* oak = objArrayKlass::cast((klassOop)obj);
270 PSParallelCompact::adjust_pointer(oak->element_klass_addr());
271 PSParallelCompact::adjust_pointer(oak->bottom_klass_addr());
272
273 return arrayKlassKlass::oop_update_pointers(cm, obj);
274 }
275 #endif // SERIALGC
276
277 #ifndef PRODUCT
278
279 // Printing
280
281 void objArrayKlassKlass::oop_print_on(oop obj, outputStream* st) {
282 assert(obj->is_klass(), "must be klass");
288 }
289
290 #endif //PRODUCT
291
292 void objArrayKlassKlass::oop_print_value_on(oop obj, outputStream* st) {
293 assert(obj->is_klass(), "must be klass");
294 objArrayKlass* oak = (objArrayKlass*) klassOop(obj)->klass_part();
295
296 oak->element_klass()->print_value_on(st);
297 st->print("[]");
298 }
299
300 const char* objArrayKlassKlass::internal_name() const {
301 return "{object array class}";
302 }
303
304
305 // Verification
306
307 void objArrayKlassKlass::oop_verify_on(oop obj, outputStream* st) {
308 arrayKlassKlass::oop_verify_on(obj, st);
309 objArrayKlass* oak = objArrayKlass::cast((klassOop)obj);
310 guarantee(oak->element_klass()->is_perm(), "should be in permspace");
311 guarantee(oak->element_klass()->is_klass(), "should be klass");
312 guarantee(oak->bottom_klass()->is_perm(), "should be in permspace");
313 guarantee(oak->bottom_klass()->is_klass(), "should be klass");
314 Klass* bk = Klass::cast(oak->bottom_klass());
315 guarantee(bk->oop_is_instance() || bk->oop_is_typeArray(), "invalid bottom klass");
316 }
|