Mercurial > hg > truffle
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()) { |