--- a/hotspot/src/share/vm/code/nmethod.cpp Tue May 07 14:30:11 2013 -0700
+++ b/hotspot/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);
}
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp Tue May 07 14:30:11 2013 -0700
+++ b/hotspot/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<u2>* old_inner_classes = the_class->inner_classes();
the_class->set_inner_classes(scratch_class->inner_classes());