8007153: Ensure that MethodParameters API works properly with RedefineClasses
authoremc
Tue, 19 Feb 2013 11:36:52 -0500
changeset 15744 fd58c7e770b3
parent 15742 b0ec3b170702
child 15745 fc43fd9458ce
8007153: Ensure that MethodParameters API works properly with RedefineClasses Summary: Adds code to HotSpot to properly update MethodParameter attributes' constant pool indexes when redefineClasses is called Reviewed-by: coleenp, sspitsyn
hotspot/src/share/vm/oops/method.hpp
hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp
--- a/hotspot/src/share/vm/oops/method.hpp	Mon Feb 18 12:49:53 2013 +0100
+++ b/hotspot/src/share/vm/oops/method.hpp	Tue Feb 19 11:36:52 2013 -0500
@@ -456,6 +456,8 @@
   void print_codes_on(int from, int to, outputStream* st) const    PRODUCT_RETURN;
 
   // method parameters
+  bool has_method_parameters() const
+                         { return constMethod()->has_method_parameters(); }
   int method_parameters_length() const
                          { return constMethod()->method_parameters_length(); }
   MethodParametersElement* method_parameters_start() const
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp	Mon Feb 18 12:49:53 2013 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp	Tue Feb 19 11:36:52 2013 -0500
@@ -1558,6 +1558,18 @@
       } break;
     }
   } // end for each bytecode
+
+  // We also need to rewrite the parameter name indexes, if there is
+  // method parameter data present
+  if(method->has_method_parameters()) {
+    const int len = method->method_parameters_length();
+    MethodParametersElement* elem = method->method_parameters_start();
+
+    for (int i = 0; i < len; i++) {
+      const u2 cp_index = elem[i].name_cp_index;
+      elem[i].name_cp_index = find_new_index(cp_index);
+    }
+  }
 } // end rewrite_cp_refs_in_method()