8005994: Method annotations are allocated unnecessarily during class file parsing
Summary: Also reviewed by: vitalyd@gmail.com
Reviewed-by: coleenp, acorn
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp Tue Jan 15 13:32:13 2013 +0100
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp Tue Jan 15 10:09:45 2013 +0100
@@ -2475,26 +2475,38 @@
*has_default_methods = true;
}
methods->at_put(index, method());
- if (*methods_annotations == NULL) {
- *methods_annotations =
- MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
+
+ if (method_annotations != NULL) {
+ if (*methods_annotations == NULL) {
+ *methods_annotations =
+ MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
+ }
+ (*methods_annotations)->at_put(index, method_annotations);
}
- (*methods_annotations)->at_put(index, method_annotations);
- if (*methods_parameter_annotations == NULL) {
- *methods_parameter_annotations =
- MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
+
+ if (method_parameter_annotations != NULL) {
+ if (*methods_parameter_annotations == NULL) {
+ *methods_parameter_annotations =
+ MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
+ }
+ (*methods_parameter_annotations)->at_put(index, method_parameter_annotations);
}
- (*methods_parameter_annotations)->at_put(index, method_parameter_annotations);
- if (*methods_default_annotations == NULL) {
- *methods_default_annotations =
- MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
+
+ if (method_default_annotations != NULL) {
+ if (*methods_default_annotations == NULL) {
+ *methods_default_annotations =
+ MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
+ }
+ (*methods_default_annotations)->at_put(index, method_default_annotations);
}
- (*methods_default_annotations)->at_put(index, method_default_annotations);
- if (*methods_type_annotations == NULL) {
- *methods_type_annotations =
- MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
+
+ if (method_type_annotations != NULL) {
+ if (*methods_type_annotations == NULL) {
+ *methods_type_annotations =
+ MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
+ }
+ (*methods_type_annotations)->at_put(index, method_type_annotations);
}
- (*methods_type_annotations)->at_put(index, method_type_annotations);
}
if (_need_verify && length > 1) {
@@ -3309,8 +3321,7 @@
bool has_final_method = false;
AccessFlags promoted_flags;
promoted_flags.set_flags(0);
- // These need to be oop pointers because they are allocated lazily
- // inside parse_methods inside a nested HandleMark
+
Array<AnnotationArray*>* methods_annotations = NULL;
Array<AnnotationArray*>* methods_parameter_annotations = NULL;
Array<AnnotationArray*>* methods_default_annotations = NULL;
--- a/hotspot/src/share/vm/prims/jvm.cpp Tue Jan 15 13:32:13 2013 +0100
+++ b/hotspot/src/share/vm/prims/jvm.cpp Tue Jan 15 10:09:45 2013 +0100
@@ -1582,8 +1582,11 @@
if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
if (k->oop_is_instance()) {
- typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->type_annotations()->class_annotations(), CHECK_NULL);
- return (jbyteArray) JNIHandles::make_local(env, a);
+ Annotations* type_annotations = InstanceKlass::cast(k)->type_annotations();
+ if (type_annotations != NULL) {
+ typeArrayOop a = Annotations::make_java_array(type_annotations->class_annotations(), CHECK_NULL);
+ return (jbyteArray) JNIHandles::make_local(env, a);
+ }
}
}
return NULL;