comparison src/share/vm/code/nmethod.cpp @ 7005:45029b3ac59f

fixed bug in the resetting of static call stubs that caused infinite, safepoint free loops in non-product builds of the VM
author Doug Simon <doug.simon@oracle.com>
date Thu, 22 Nov 2012 23:36:04 +0100
parents bf2ea3ed3bce
children 7d815d842ee0
comparison
equal deleted inserted replaced
7004:1d419abb0081 7005:45029b3ac59f
1790 // all strong references alive. Any weak references should have been 1790 // all strong references alive. Any weak references should have been
1791 // cleared as well. Visit all the metadata and ensure that it's 1791 // cleared as well. Visit all the metadata and ensure that it's
1792 // really alive. 1792 // really alive.
1793 void nmethod::verify_metadata_loaders(address low_boundary, BoolObjectClosure* is_alive) { 1793 void nmethod::verify_metadata_loaders(address low_boundary, BoolObjectClosure* is_alive) {
1794 #ifdef ASSERT 1794 #ifdef ASSERT
1795 RelocIterator iter(this, low_boundary); 1795 RelocIterator iter(this, low_boundary);
1796 while (iter.next()) { 1796 while (iter.next()) {
1797 // static_stub_Relocations may have dangling references to 1797 // static_stub_Relocations may have dangling references to
1798 // Method*s so trim them out here. Otherwise it looks like 1798 // Method*s so trim them out here. Otherwise it looks like
1799 // compiled code is maintaining a link to dead metadata. 1799 // compiled code is maintaining a link to dead metadata.
1800 address static_call_addr = NULL; 1800 address static_call_addr = NULL;
1801 if (iter.type() == relocInfo::opt_virtual_call_type) { 1801 if (iter.type() == relocInfo::opt_virtual_call_type) {
1802 CompiledIC* cic = CompiledIC_at(iter.reloc()); 1802 CompiledIC* cic = CompiledIC_at(iter.reloc());
1803 if (!cic->is_call_to_interpreted()) { 1803 if (!cic->is_call_to_interpreted()) {
1804 static_call_addr = iter.addr(); 1804 static_call_addr = iter.addr();
1805 cic->set_to_clean();
1805 } 1806 }
1806 } else if (iter.type() == relocInfo::static_call_type) { 1807 } else if (iter.type() == relocInfo::static_call_type) {
1807 CompiledStaticCall* csc = compiledStaticCall_at(iter.reloc()); 1808 CompiledStaticCall* csc = compiledStaticCall_at(iter.reloc());
1808 if (!csc->is_call_to_interpreted()) { 1809 if (!csc->is_call_to_interpreted()) {
1809 static_call_addr = iter.addr(); 1810 static_call_addr = iter.addr();
1811 csc->set_to_clean();
1810 } 1812 }
1811 } 1813 }
1812 if (static_call_addr != NULL) { 1814 if (static_call_addr != NULL) {
1813 RelocIterator sciter(this, low_boundary); 1815 RelocIterator sciter(this, low_boundary);
1814 while (sciter.next()) { 1816 while (sciter.next()) {