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
--- 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()