# HG changeset patch # User coleenp # Date 1367977607 25200 # Node ID 28ae1d38d2965da85030f58d3bee4d106dac2d4f # Parent 7243490a684726330004cacb1e76dbd269327411# Parent a1cc1d1e7ce58c35498d03fce5f818524d8a1f75 Merge diff -r 7243490a6847 -r 28ae1d38d296 src/share/vm/code/nmethod.cpp --- a/src/share/vm/code/nmethod.cpp Tue May 07 14:30:11 2013 -0700 +++ b/src/share/vm/code/nmethod.cpp Tue May 07 18:46:47 2013 -0700 @@ -1794,6 +1794,19 @@ Metadata* md = r->metadata_value(); f(md); } + } else if (iter.type() == relocInfo::virtual_call_type) { + // Check compiledIC holders associated with this nmethod + CompiledIC *ic = CompiledIC_at(iter.reloc()); + if (ic->is_icholder_call()) { + CompiledICHolder* cichk = ic->cached_icholder(); + f(cichk->holder_method()); + f(cichk->holder_klass()); + } else { + Metadata* ic_oop = ic->cached_metadata(); + if (ic_oop != NULL) { + f(ic_oop); + } + } } } } @@ -1804,6 +1817,7 @@ Metadata* md = *p; f(md); } + // Call function Method*, not embedded in these other places. if (_method != NULL) f(_method); } diff -r 7243490a6847 -r 28ae1d38d296 src/share/vm/prims/jvmtiRedefineClasses.cpp --- a/src/share/vm/prims/jvmtiRedefineClasses.cpp Tue May 07 14:30:11 2013 -0700 +++ b/src/share/vm/prims/jvmtiRedefineClasses.cpp Tue May 07 18:46:47 2013 -0700 @@ -3366,6 +3366,10 @@ } #endif + // NULL out in scratch class to not delete twice. The class to be redefined + // always owns these bytes. + scratch_class->set_cached_class_file(NULL, 0); + // Replace inner_classes Array* old_inner_classes = the_class->inner_classes(); the_class->set_inner_classes(scratch_class->inner_classes());