Mercurial > hg > graal-compiler
comparison src/share/vm/oops/constantPoolKlass.cpp @ 3368:69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
Reviewed-by: kvn, ysr
author | never |
---|---|
date | Tue, 10 May 2011 17:44:14 -0700 |
parents | 6c97c830fb6f |
children | 81d815b05abb |
comparison
equal
deleted
inserted
replaced
3367:3b1d58916d5f | 3368:69c94f488271 |
---|---|
283 } | 283 } |
284 | 284 |
285 void constantPoolKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { | 285 void constantPoolKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { |
286 assert(obj->is_constantPool(), "should be constant pool"); | 286 assert(obj->is_constantPool(), "should be constant pool"); |
287 constantPoolOop cp = (constantPoolOop) obj; | 287 constantPoolOop cp = (constantPoolOop) obj; |
288 if (cp->tags() != NULL && | 288 if (cp->tags() != NULL) { |
289 (!JavaObjectsInPerm || (EnableInvokeDynamic && cp->has_pseudo_string()))) { | |
290 for (int i = 1; i < cp->length(); ++i) { | 289 for (int i = 1; i < cp->length(); ++i) { |
291 if (cp->tag_at(i).is_string()) { | 290 if (cp->is_pointer_entry(i)) { |
292 oop* base = cp->obj_at_addr_raw(i); | 291 oop* base = cp->obj_at_addr_raw(i); |
293 if (PSScavenge::should_scavenge(base)) { | 292 if (PSScavenge::should_scavenge(base)) { |
294 pm->claim_or_forward_depth(base); | 293 pm->claim_or_forward_depth(base); |
295 } | 294 } |
296 } | 295 } |
337 if (cp->is_pseudo_string_at(index)) { | 336 if (cp->is_pseudo_string_at(index)) { |
338 anObj = cp->pseudo_string_at(index); | 337 anObj = cp->pseudo_string_at(index); |
339 } else { | 338 } else { |
340 anObj = cp->string_at(index, CATCH); | 339 anObj = cp->string_at(index, CATCH); |
341 } | 340 } |
341 anObj->print_value_on(st); | |
342 st->print(" {0x%lx}", (address)anObj); | |
343 break; | |
344 case JVM_CONSTANT_Object : | |
345 anObj = cp->object_at(index); | |
342 anObj->print_value_on(st); | 346 anObj->print_value_on(st); |
343 st->print(" {0x%lx}", (address)anObj); | 347 st->print(" {0x%lx}", (address)anObj); |
344 break; | 348 break; |
345 case JVM_CONSTANT_Integer : | 349 case JVM_CONSTANT_Integer : |
346 st->print("%d", cp->int_at(index)); | 350 st->print("%d", cp->int_at(index)); |
430 guarantee(obj->is_constantPool(), "object must be constant pool"); | 434 guarantee(obj->is_constantPool(), "object must be constant pool"); |
431 constantPoolOop cp = constantPoolOop(obj); | 435 constantPoolOop cp = constantPoolOop(obj); |
432 guarantee(cp->is_perm(), "should be in permspace"); | 436 guarantee(cp->is_perm(), "should be in permspace"); |
433 if (!cp->partially_loaded()) { | 437 if (!cp->partially_loaded()) { |
434 for (int i = 0; i< cp->length(); i++) { | 438 for (int i = 0; i< cp->length(); i++) { |
439 constantTag tag = cp->tag_at(i); | |
435 CPSlot entry = cp->slot_at(i); | 440 CPSlot entry = cp->slot_at(i); |
436 if (cp->tag_at(i).is_klass()) { | 441 if (tag.is_klass()) { |
437 if (entry.is_oop()) { | 442 if (entry.is_oop()) { |
438 guarantee(entry.get_oop()->is_perm(), "should be in permspace"); | 443 guarantee(entry.get_oop()->is_perm(), "should be in permspace"); |
439 guarantee(entry.get_oop()->is_klass(), "should be klass"); | 444 guarantee(entry.get_oop()->is_klass(), "should be klass"); |
440 } | 445 } |
441 } | 446 } else if (tag.is_unresolved_klass()) { |
442 if (cp->tag_at(i).is_unresolved_klass()) { | |
443 if (entry.is_oop()) { | 447 if (entry.is_oop()) { |
444 guarantee(entry.get_oop()->is_perm(), "should be in permspace"); | 448 guarantee(entry.get_oop()->is_perm(), "should be in permspace"); |
445 guarantee(entry.get_oop()->is_klass(), "should be klass"); | 449 guarantee(entry.get_oop()->is_klass(), "should be klass"); |
446 } | 450 } |
447 } | 451 } else if (tag.is_symbol()) { |
448 if (cp->tag_at(i).is_symbol()) { | |
449 guarantee(entry.get_symbol()->refcount() != 0, "should have nonzero reference count"); | 452 guarantee(entry.get_symbol()->refcount() != 0, "should have nonzero reference count"); |
450 } | 453 } else if (tag.is_unresolved_string()) { |
451 if (cp->tag_at(i).is_unresolved_string()) { | |
452 if (entry.is_oop()) { | 454 if (entry.is_oop()) { |
453 guarantee(entry.get_oop()->is_perm(), "should be in permspace"); | 455 guarantee(entry.get_oop()->is_perm(), "should be in permspace"); |
454 guarantee(entry.get_oop()->is_instance(), "should be instance"); | 456 guarantee(entry.get_oop()->is_instance(), "should be instance"); |
455 } | 457 } |
456 else { | 458 else { |
457 guarantee(entry.get_symbol()->refcount() != 0, "should have nonzero reference count"); | 459 guarantee(entry.get_symbol()->refcount() != 0, "should have nonzero reference count"); |
458 } | 460 } |
459 } | 461 } else if (tag.is_string()) { |
460 if (cp->tag_at(i).is_string()) { | |
461 if (!cp->has_pseudo_string()) { | 462 if (!cp->has_pseudo_string()) { |
462 if (entry.is_oop()) { | 463 if (entry.is_oop()) { |
463 guarantee(!JavaObjectsInPerm || entry.get_oop()->is_perm(), | 464 guarantee(!JavaObjectsInPerm || entry.get_oop()->is_perm(), |
464 "should be in permspace"); | 465 "should be in permspace"); |
465 guarantee(entry.get_oop()->is_instance(), "should be instance"); | 466 guarantee(entry.get_oop()->is_instance(), "should be instance"); |
466 } | 467 } |
467 } else { | 468 } else { |
468 // can be non-perm, can be non-instance (array) | 469 // can be non-perm, can be non-instance (array) |
469 } | 470 } |
470 } | 471 } else if (tag.is_object()) { |
471 // FIXME: verify JSR 292 tags JVM_CONSTANT_MethodHandle, etc. | 472 assert(entry.get_oop()->is_oop(), "should be some valid oop"); |
473 } else { | |
474 assert(!cp->is_pointer_entry(i), "unhandled oop type in constantPoolKlass::verify_on"); | |
475 } | |
472 } | 476 } |
473 guarantee(cp->tags()->is_perm(), "should be in permspace"); | 477 guarantee(cp->tags()->is_perm(), "should be in permspace"); |
474 guarantee(cp->tags()->is_typeArray(), "should be type array"); | 478 guarantee(cp->tags()->is_typeArray(), "should be type array"); |
475 if (cp->cache() != NULL) { | 479 if (cp->cache() != NULL) { |
476 // Note: cache() can be NULL before a class is completely setup or | 480 // Note: cache() can be NULL before a class is completely setup or |