提交 a838b8ba 编写于 作者: C coleenp

8030633: nsk/jvmti/RedefineClasses/StressRedefine failed invalid method ordering length on Solaris

Summary: A method with no declared methods was getting an AME overpass method with the latest change.  The method_ordering array was not updated for the new methods.
Reviewed-by: dcubed, acorn, dsamersoff, lfoltan, hseigel
上级 ded2ab37
...@@ -1044,7 +1044,8 @@ static void merge_in_new_methods(InstanceKlass* klass, ...@@ -1044,7 +1044,8 @@ static void merge_in_new_methods(InstanceKlass* klass,
Array<Method*>* merged_methods = MetadataFactory::new_array<Method*>( Array<Method*>* merged_methods = MetadataFactory::new_array<Method*>(
klass->class_loader_data(), new_size, NULL, CHECK); klass->class_loader_data(), new_size, NULL, CHECK);
if (original_ordering != NULL && original_ordering->length() > 0) { // original_ordering might be empty if this class has no methods of its own
if (JvmtiExport::can_maintain_original_method_order() || DumpSharedSpaces) {
merged_ordering = MetadataFactory::new_array<int>( merged_ordering = MetadataFactory::new_array<int>(
klass->class_loader_data(), new_size, CHECK); klass->class_loader_data(), new_size, CHECK);
} }
...@@ -1071,6 +1072,8 @@ static void merge_in_new_methods(InstanceKlass* klass, ...@@ -1071,6 +1072,8 @@ static void merge_in_new_methods(InstanceKlass* klass,
merged_methods->at_put(i, orig_method); merged_methods->at_put(i, orig_method);
original_methods->at_put(orig_idx, NULL); original_methods->at_put(orig_idx, NULL);
if (merged_ordering->length() > 0) { if (merged_ordering->length() > 0) {
assert(original_ordering != NULL && original_ordering->length() > 0,
"should have original order information for this method");
merged_ordering->at_put(i, original_ordering->at(orig_idx)); merged_ordering->at_put(i, original_ordering->at(orig_idx));
} }
++orig_idx; ++orig_idx;
...@@ -1099,13 +1102,14 @@ static void merge_in_new_methods(InstanceKlass* klass, ...@@ -1099,13 +1102,14 @@ static void merge_in_new_methods(InstanceKlass* klass,
// Replace klass methods with new merged lists // Replace klass methods with new merged lists
klass->set_methods(merged_methods); klass->set_methods(merged_methods);
klass->set_initial_method_idnum(new_size); klass->set_initial_method_idnum(new_size);
klass->set_method_ordering(merged_ordering);
// Free metadata
ClassLoaderData* cld = klass->class_loader_data(); ClassLoaderData* cld = klass->class_loader_data();
if (original_methods ->length() > 0) { if (original_methods->length() > 0) {
MetadataFactory::free_array(cld, original_methods); MetadataFactory::free_array(cld, original_methods);
} }
if (original_ordering->length() > 0) { if (original_ordering != NULL && original_ordering->length() > 0) {
klass->set_method_ordering(merged_ordering);
MetadataFactory::free_array(cld, original_ordering); MetadataFactory::free_array(cld, original_ordering);
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册