src/share/vm/oops/cpCache.cpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1998, 2014, 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, 2015, 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.
*** 453,463 **** // RC_TRACE macro has an embedded ResourceMark RC_TRACE(0x00400000, ("cpc vf-entry update: %s(%s)", new_method->name()->as_C_string(), new_method->signature()->as_C_string())); } - return true; } // f1() is not used with virtual entries so bail out return false; --- 453,462 ----
*** 481,491 **** // RC_TRACE macro has an embedded ResourceMark RC_TRACE(0x00400000, ("cpc entry update: %s(%s)", new_method->name()->as_C_string(), new_method->signature()->as_C_string())); } - return true; } return false; } --- 480,489 ----
*** 508,547 **** return (NOT_PRODUCT(_f1->is_valid() &&) _f1->is_method() && (f1_as_method()->is_deleted() || (!f1_as_method()->is_old() && !f1_as_method()->is_obsolete()))); } ! bool ConstantPoolCacheEntry::is_interesting_method_entry(Klass* k) { if (!is_method_entry()) { // not a method entry so not interesting by default ! return false; } - Method* m = NULL; if (is_vfinal()) { // virtual and final so _f2 contains method ptr instead of vtable index m = f2_as_vfinal_method(); } else if (is_f1_null()) { // NULL _f1 means this is a virtual entry so also not interesting ! return false; } else { if (!(_f1->is_method())) { // _f1 can also contain a Klass* for an interface ! return false; } m = f1_as_method(); } - 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; } - // the method is in the interesting class so the entry is interesting ! return true; } #endif // INCLUDE_JVMTI void ConstantPoolCacheEntry::print(outputStream* st, int index) const { // print separator --- 506,542 ---- return (NOT_PRODUCT(_f1->is_valid() &&) _f1->is_method() && (f1_as_method()->is_deleted() || (!f1_as_method()->is_old() && !f1_as_method()->is_obsolete()))); } ! Method* ConstantPoolCacheEntry::get_interesting_method_entry(Klass* k) { if (!is_method_entry()) { // not a method entry so not interesting by default ! return NULL; } Method* m = NULL; if (is_vfinal()) { // virtual and final so _f2 contains method ptr instead of vtable index m = f2_as_vfinal_method(); } else if (is_f1_null()) { // NULL _f1 means this is a virtual entry so also not interesting ! return NULL; } else { if (!(_f1->is_method())) { // _f1 can also contain a Klass* for an interface ! return NULL; } m = f1_as_method(); } 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 NULL; } // the method is in the interesting class so the entry is interesting ! return m; } #endif // INCLUDE_JVMTI void ConstantPoolCacheEntry::print(outputStream* st, int index) const { // print separator
*** 625,635 **** // get shorthand for the interesting class Klass* old_holder = old_methods[0]->method_holder(); for (int i = 0; i < length(); i++) { ! if (!entry_at(i)->is_interesting_method_entry(old_holder)) { // skip uninteresting methods continue; } // The ConstantPoolCache contains entries for several different --- 620,630 ---- // get shorthand for the interesting class Klass* old_holder = old_methods[0]->method_holder(); for (int i = 0; i < length(); i++) { ! if (entry_at(i)->get_interesting_method_entry(old_holder) == NULL) { // skip uninteresting methods continue; } // The ConstantPoolCache contains entries for several different
*** 649,672 **** } } } } // the constant pool cache should never contain old or obsolete methods bool ConstantPoolCache::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 ConstantPoolCache::dump_cache() { for (int i = 1; i < length(); i++) { ! if (entry_at(i)->is_interesting_method_entry(NULL)) { entry_at(i)->print(tty, i); } } } #endif // INCLUDE_JVMTI --- 644,690 ---- } } } } + // If any entry of this ConstantPoolCache points to any of + // old_methods, replace it with the corresponding new_method. + void ConstantPoolCache::adjust_method_entries(InstanceKlass* holder, bool * trace_name_printed) { + for (int i = 0; i < length(); i++) { + ConstantPoolCacheEntry* entry = entry_at(i); + Method* old_method = entry->get_interesting_method_entry(holder); + if (old_method == NULL || !old_method->is_old()) { + continue; // skip uninteresting entries + } + if (old_method->is_deleted()) { + // clean up entries with deleted methods + entry->initialize_entry(entry->constant_pool_index()); + continue; + } + Method* new_method = holder->method_with_idnum(old_method->orig_method_idnum()); + + assert(new_method != NULL, "method_with_idnum() should not be NULL"); + assert(old_method != new_method, "sanity check"); + + entry_at(i)->adjust_method_entry(old_method, new_method, trace_name_printed); + } + } + // the constant pool cache should never contain old or obsolete methods bool ConstantPoolCache::check_no_old_or_obsolete_entries() { for (int i = 1; i < length(); i++) { ! if (entry_at(i)->get_interesting_method_entry(NULL) != NULL && !entry_at(i)->check_no_old_or_obsolete_entries()) { return false; } } return true; } void ConstantPoolCache::dump_cache() { for (int i = 1; i < length(); i++) { ! if (entry_at(i)->get_interesting_method_entry(NULL) != NULL) { entry_at(i)->print(tty, i); } } } #endif // INCLUDE_JVMTI