8009531: Crash when redefining class with annotated method
authorcoleenp
Wed, 27 Mar 2013 08:19:50 -0400
changeset 16588 7e90e795813e
parent 16449 20ce131d6b8c
child 16590 f31b9e6777c7
8009531: Crash when redefining class with annotated method Summary: Neglected to copy the annotations in clone_with_new_data when they were moved to ConstMethod. Reviewed-by: acorn, sspitsyn, dcubed
hotspot/src/share/vm/oops/constMethod.cpp
hotspot/src/share/vm/oops/constMethod.hpp
hotspot/src/share/vm/oops/method.cpp
--- a/hotspot/src/share/vm/oops/constMethod.cpp	Tue Mar 26 15:20:05 2013 -0700
+++ b/hotspot/src/share/vm/oops/constMethod.cpp	Wed Mar 27 08:19:50 2013 -0400
@@ -363,6 +363,26 @@
   return (AnnotationArray**)constMethod_end() - offset;
 }
 
+// copy annotations from 'cm' to 'this'
+void ConstMethod::copy_annotations_from(ConstMethod* cm) {
+  if (cm->has_method_annotations()) {
+    assert(has_method_annotations(), "should be allocated already");
+    set_method_annotations(cm->method_annotations());
+  }
+  if (cm->has_parameter_annotations()) {
+    assert(has_parameter_annotations(), "should be allocated already");
+    set_parameter_annotations(cm->parameter_annotations());
+  }
+  if (cm->has_type_annotations()) {
+    assert(has_type_annotations(), "should be allocated already");
+    set_type_annotations(cm->type_annotations());
+  }
+  if (cm->has_default_annotations()) {
+    assert(has_default_annotations(), "should be allocated already");
+    set_default_annotations(cm->default_annotations());
+  }
+}
+
 // Printing
 
 void ConstMethod::print_on(outputStream* st) const {
--- a/hotspot/src/share/vm/oops/constMethod.hpp	Tue Mar 26 15:20:05 2013 -0700
+++ b/hotspot/src/share/vm/oops/constMethod.hpp	Wed Mar 27 08:19:50 2013 -0400
@@ -441,6 +441,9 @@
     return has_default_annotations() ? default_annotations()->length() : 0;
   }
 
+  // Copy annotations from other ConstMethod
+  void copy_annotations_from(ConstMethod* cm);
+
   // byte codes
   void    set_code(address code) {
     if (code_size() > 0) {
--- a/hotspot/src/share/vm/oops/method.cpp	Tue Mar 26 15:20:05 2013 -0700
+++ b/hotspot/src/share/vm/oops/method.cpp	Wed Mar 27 08:19:50 2013 -0400
@@ -1170,6 +1170,8 @@
     newm->set_stackmap_data(stackmap_data);
   }
 
+  // copy annotations over to new method
+  newcm->copy_annotations_from(cm);
   return newm;
 }