src/share/vm/oops/cpCacheOop.cpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 468,477 **** --- 468,494 ---- } return false; } + // a constant pool cache entry should never contain old or obsolete methods + bool ConstantPoolCacheEntry::check_no_old_or_obsolete_entries() { + if (is_vfinal()) { + methodOop m = (methodOop)_f2; + // Return false if _f2 refers to an old or an obsolete method. + // _f2 == NULL || !m->is_method() are just as unexpected here. + return (m != NULL && m->is_method() && !m->is_old() && !m->is_obsolete()); + } else if ((oop)_f1 == NULL || !((oop)_f1)->is_method()) { + // _f1 == NULL || !_f1->is_method() are OK here + return true; + } + + methodOop m = (methodOop)_f1; + // return false if _f1 refers to an old or an obsolete method + return (!m->is_old() && !m->is_obsolete()); + } + bool ConstantPoolCacheEntry::is_interesting_method_entry(klassOop k) { if (!is_method_entry()) { // not a method entry so not interesting by default return false; }
*** 490,500 **** } m = (methodOop)_f1; } assert(m != NULL && m->is_method(), "sanity check"); ! if (m == NULL || !m->is_method() || m->method_holder() != k) { // robustness for above sanity checks or method is not in // the interesting class return false; } --- 507,517 ---- } m = (methodOop)_f1; } assert(m != NULL && m->is_method(), "sanity check"); ! if (m == NULL || !m->is_method() || (k != NULL && m->method_holder() != k)) { // robustness for above sanity checks or method is not in // the interesting class return false; }
*** 502,521 **** return true; } void ConstantPoolCacheEntry::print(outputStream* st, int index) const { // print separator ! if (index == 0) tty->print_cr(" -------------"); // print entry tty->print("%3d ("PTR_FORMAT") ", index, (intptr_t)this); if (is_secondary_entry()) tty->print_cr("[%5d|secondary]", main_entry_index()); else tty->print_cr("[%02x|%02x|%5d]", bytecode_2(), bytecode_1(), constant_pool_index()); tty->print_cr(" [ "PTR_FORMAT"]", (intptr_t)(oop)_f1); tty->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_f2); tty->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_flags); tty->print_cr(" -------------"); } void ConstantPoolCacheEntry::verify(outputStream* st) const { // not implemented yet --- 519,547 ---- return true; } void ConstantPoolCacheEntry::print(outputStream* st, int index) const { // print separator ! if (index == 0) { ! // adds a searchable prefix when RedefineClasses() tracing is enabled ! RC_TRACE_NO_CR(0x00004000, ("")); ! tty->print_cr(" -------------"); ! } // print entry + RC_TRACE_NO_CR(0x00004000, ("")); tty->print("%3d ("PTR_FORMAT") ", index, (intptr_t)this); if (is_secondary_entry()) tty->print_cr("[%5d|secondary]", main_entry_index()); else tty->print_cr("[%02x|%02x|%5d]", bytecode_2(), bytecode_1(), constant_pool_index()); + RC_TRACE_NO_CR(0x00004000, ("")); tty->print_cr(" [ "PTR_FORMAT"]", (intptr_t)(oop)_f1); + RC_TRACE_NO_CR(0x00004000, ("")); tty->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_f2); + RC_TRACE_NO_CR(0x00004000, ("")); tty->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_flags); + RC_TRACE_NO_CR(0x00004000, ("")); tty->print_cr(" -------------"); } void ConstantPoolCacheEntry::verify(outputStream* st) const { // not implemented yet
*** 574,579 **** --- 600,626 ---- // break out and get to the next interesting entry if there one break; } } } + } + + // the constant pool cache should never contain old or obsolete methods + bool constantPoolCacheOopDesc::check_no_old_or_obsolete_entries() { + for (int i = 1; i < length(); i++) { + if (entry_at(i)->is_interesting_method_entry(NULL) && + !entry_at(i)->check_no_old_or_obsolete_entries()) { + return false; + } + } + return true; + } + + void constantPoolCacheOopDesc::dump_cache() { + for (int i = 1; i < length(); i++) { + if (entry_at(i)->is_interesting_method_entry(NULL)) { + // adds a searchable prefix when RedefineClasses() tracing is enabled + RC_TRACE_NO_CR(0x00004000, ("")); + entry_at(i)->print(tty, i); + } + } }