changeset 15744:fd58c7e770b3

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
author emc
date Tue, 19 Feb 2013 11:36:52 -0500
parents b0ec3b170702
children fc43fd9458ce
files hotspot/src/share/vm/oops/method.hpp hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp
diffstat 2 files changed, 14 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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()