Mercurial > hg > truffle
comparison src/share/vm/oops/cpCache.cpp @ 8021:8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
Summary: Add/refine new tracing support using -XX:TraceRedefineClasses=16384.
Reviewed-by: coleenp, acorn, sspitsyn
author | dcubed |
---|---|
date | Wed, 06 Feb 2013 14:31:37 -0800 |
parents | 80e866b1d053 |
children | 461a3adac4d1 |
comparison
equal
deleted
inserted
replaced
7988:f3ea1af9207a | 8021:8d9fc28831cc |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
399 objArrayOop resolved_references = cpool->resolved_references(); | 399 objArrayOop resolved_references = cpool->resolved_references(); |
400 return resolved_references->obj_at(ref_index); | 400 return resolved_references->obj_at(ref_index); |
401 } | 401 } |
402 | 402 |
403 | 403 |
404 #if INCLUDE_JVMTI | |
404 // RedefineClasses() API support: | 405 // RedefineClasses() API support: |
405 // If this constantPoolCacheEntry refers to old_method then update it | 406 // If this ConstantPoolCacheEntry refers to old_method then update it |
406 // to refer to new_method. | 407 // to refer to new_method. |
407 bool ConstantPoolCacheEntry::adjust_method_entry(Method* old_method, | 408 bool ConstantPoolCacheEntry::adjust_method_entry(Method* old_method, |
408 Method* new_method, bool * trace_name_printed) { | 409 Method* new_method, bool * trace_name_printed) { |
409 | 410 |
410 if (is_vfinal()) { | 411 if (is_vfinal()) { |
458 } | 459 } |
459 | 460 |
460 return false; | 461 return false; |
461 } | 462 } |
462 | 463 |
463 #ifndef PRODUCT | 464 // a constant pool cache entry should never contain old or obsolete methods |
464 bool ConstantPoolCacheEntry::check_no_old_entries() { | 465 bool ConstantPoolCacheEntry::check_no_old_or_obsolete_entries() { |
465 if (is_vfinal()) { | 466 if (is_vfinal()) { |
467 // virtual and final so _f2 contains method ptr instead of vtable index | |
466 Metadata* f2 = (Metadata*)_f2; | 468 Metadata* f2 = (Metadata*)_f2; |
467 return (f2->is_valid() && f2->is_method() && !((Method*)f2)->is_old()); | 469 // Return false if _f2 refers to an old or an obsolete method. |
468 } else { | 470 // _f2 == NULL || !_f2->is_method() are just as unexpected here. |
469 return (_f1 == NULL || (_f1->is_valid() && _f1->is_method() && !((Method*)_f1)->is_old())); | 471 return (f2 != NULL NOT_PRODUCT(&& f2->is_valid()) && f2->is_method() && |
470 } | 472 !((Method*)f2)->is_old() && !((Method*)f2)->is_obsolete()); |
471 } | 473 } else if (_f1 == NULL || |
472 #endif | 474 (NOT_PRODUCT(_f1->is_valid() &&) !_f1->is_method())) { |
475 // _f1 == NULL || !_f1->is_method() are OK here | |
476 return true; | |
477 } | |
478 // return false if _f1 refers to an old or an obsolete method | |
479 return (NOT_PRODUCT(_f1->is_valid() &&) _f1->is_method() && | |
480 !((Method*)_f1)->is_old() && !((Method*)_f1)->is_obsolete()); | |
481 } | |
473 | 482 |
474 bool ConstantPoolCacheEntry::is_interesting_method_entry(Klass* k) { | 483 bool ConstantPoolCacheEntry::is_interesting_method_entry(Klass* k) { |
475 if (!is_method_entry()) { | 484 if (!is_method_entry()) { |
476 // not a method entry so not interesting by default | 485 // not a method entry so not interesting by default |
477 return false; | 486 return false; |
500 } | 509 } |
501 | 510 |
502 // the method is in the interesting class so the entry is interesting | 511 // the method is in the interesting class so the entry is interesting |
503 return true; | 512 return true; |
504 } | 513 } |
514 #endif // INCLUDE_JVMTI | |
505 | 515 |
506 void ConstantPoolCacheEntry::print(outputStream* st, int index) const { | 516 void ConstantPoolCacheEntry::print(outputStream* st, int index) const { |
507 // print separator | 517 // print separator |
508 if (index == 0) st->print_cr(" -------------"); | 518 if (index == 0) st->print_cr(" -------------"); |
509 // print entry | 519 // print entry |
510 st->print("%3d ("PTR_FORMAT") ", index, (intptr_t)this); | 520 st->print("%3d ("PTR_FORMAT") ", index, (intptr_t)this); |
511 st->print_cr("[%02x|%02x|%5d]", bytecode_2(), bytecode_1(), constant_pool_index()); | 521 st->print_cr("[%02x|%02x|%5d]", bytecode_2(), bytecode_1(), |
522 constant_pool_index()); | |
512 st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_f1); | 523 st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_f1); |
513 st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_f2); | 524 st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_f2); |
514 st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_flags); | 525 st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_flags); |
515 st->print_cr(" -------------"); | 526 st->print_cr(" -------------"); |
516 } | 527 } |
550 ref += ConstantPoolCacheEntry::_indy_resolved_references_entries - 1; // skip extra entries | 561 ref += ConstantPoolCacheEntry::_indy_resolved_references_entries - 1; // skip extra entries |
551 } | 562 } |
552 } | 563 } |
553 } | 564 } |
554 | 565 |
566 #if INCLUDE_JVMTI | |
555 // RedefineClasses() API support: | 567 // RedefineClasses() API support: |
556 // If any entry of this constantPoolCache points to any of | 568 // If any entry of this ConstantPoolCache points to any of |
557 // old_methods, replace it with the corresponding new_method. | 569 // old_methods, replace it with the corresponding new_method. |
558 void ConstantPoolCache::adjust_method_entries(Method** old_methods, Method** new_methods, | 570 void ConstantPoolCache::adjust_method_entries(Method** old_methods, Method** new_methods, |
559 int methods_length, bool * trace_name_printed) { | 571 int methods_length, bool * trace_name_printed) { |
560 | 572 |
561 if (methods_length == 0) { | 573 if (methods_length == 0) { |
570 if (!entry_at(i)->is_interesting_method_entry(old_holder)) { | 582 if (!entry_at(i)->is_interesting_method_entry(old_holder)) { |
571 // skip uninteresting methods | 583 // skip uninteresting methods |
572 continue; | 584 continue; |
573 } | 585 } |
574 | 586 |
575 // The constantPoolCache contains entries for several different | 587 // The ConstantPoolCache contains entries for several different |
576 // things, but we only care about methods. In fact, we only care | 588 // things, but we only care about methods. In fact, we only care |
577 // about methods in the same class as the one that contains the | 589 // about methods in the same class as the one that contains the |
578 // old_methods. At this point, we have an interesting entry. | 590 // old_methods. At this point, we have an interesting entry. |
579 | 591 |
580 for (int j = 0; j < methods_length; j++) { | 592 for (int j = 0; j < methods_length; j++) { |
589 } | 601 } |
590 } | 602 } |
591 } | 603 } |
592 } | 604 } |
593 | 605 |
594 #ifndef PRODUCT | 606 // the constant pool cache should never contain old or obsolete methods |
595 bool ConstantPoolCache::check_no_old_entries() { | 607 bool ConstantPoolCache::check_no_old_or_obsolete_entries() { |
596 for (int i = 1; i < length(); i++) { | 608 for (int i = 1; i < length(); i++) { |
597 if (entry_at(i)->is_interesting_method_entry(NULL) && | 609 if (entry_at(i)->is_interesting_method_entry(NULL) && |
598 !entry_at(i)->check_no_old_entries()) { | 610 !entry_at(i)->check_no_old_or_obsolete_entries()) { |
599 return false; | 611 return false; |
600 } | 612 } |
601 } | 613 } |
602 return true; | 614 return true; |
603 } | 615 } |
604 #endif // PRODUCT | 616 |
617 void ConstantPoolCache::dump_cache() { | |
618 for (int i = 1; i < length(); i++) { | |
619 if (entry_at(i)->is_interesting_method_entry(NULL)) { | |
620 entry_at(i)->print(tty, i); | |
621 } | |
622 } | |
623 } | |
624 #endif // INCLUDE_JVMTI | |
605 | 625 |
606 | 626 |
607 // Printing | 627 // Printing |
608 | 628 |
609 void ConstantPoolCache::print_on(outputStream* st) const { | 629 void ConstantPoolCache::print_on(outputStream* st) const { |