Merge
This commit is contained in:
commit
81f94a04b9
@ -3108,21 +3108,39 @@ void ClassFileParser::apply_parsed_class_attributes(instanceKlassHandle k) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Transfer ownership of metadata allocated to the InstanceKlass.
|
// Create the Annotations object that will
|
||||||
void ClassFileParser::apply_parsed_class_metadata(
|
// hold the annotations array for the Klass.
|
||||||
instanceKlassHandle this_klass,
|
void ClassFileParser::create_combined_annotations(TRAPS) {
|
||||||
int java_fields_count, TRAPS) {
|
if (_annotations == NULL &&
|
||||||
// Assign annotations if needed
|
_type_annotations == NULL &&
|
||||||
if (_annotations != NULL || _type_annotations != NULL ||
|
_fields_annotations == NULL &&
|
||||||
_fields_annotations != NULL || _fields_type_annotations != NULL) {
|
_fields_type_annotations == NULL) {
|
||||||
|
// Don't create the Annotations object unnecessarily.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Annotations* annotations = Annotations::allocate(_loader_data, CHECK);
|
Annotations* annotations = Annotations::allocate(_loader_data, CHECK);
|
||||||
annotations->set_class_annotations(_annotations);
|
annotations->set_class_annotations(_annotations);
|
||||||
annotations->set_class_type_annotations(_type_annotations);
|
annotations->set_class_type_annotations(_type_annotations);
|
||||||
annotations->set_fields_annotations(_fields_annotations);
|
annotations->set_fields_annotations(_fields_annotations);
|
||||||
annotations->set_fields_type_annotations(_fields_type_annotations);
|
annotations->set_fields_type_annotations(_fields_type_annotations);
|
||||||
this_klass->set_annotations(annotations);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// This is the Annotations object that will be
|
||||||
|
// assigned to InstanceKlass being constructed.
|
||||||
|
_combined_annotations = annotations;
|
||||||
|
|
||||||
|
// The annotations arrays below has been transfered the
|
||||||
|
// _combined_annotations so these fields can now be cleared.
|
||||||
|
_annotations = NULL;
|
||||||
|
_type_annotations = NULL;
|
||||||
|
_fields_annotations = NULL;
|
||||||
|
_fields_type_annotations = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transfer ownership of metadata allocated to the InstanceKlass.
|
||||||
|
void ClassFileParser::apply_parsed_class_metadata(
|
||||||
|
instanceKlassHandle this_klass,
|
||||||
|
int java_fields_count, TRAPS) {
|
||||||
_cp->set_pool_holder(this_klass());
|
_cp->set_pool_holder(this_klass());
|
||||||
this_klass->set_constants(_cp);
|
this_klass->set_constants(_cp);
|
||||||
this_klass->set_fields(_fields, java_fields_count);
|
this_klass->set_fields(_fields, java_fields_count);
|
||||||
@ -3130,6 +3148,7 @@ void ClassFileParser::apply_parsed_class_metadata(
|
|||||||
this_klass->set_inner_classes(_inner_classes);
|
this_klass->set_inner_classes(_inner_classes);
|
||||||
this_klass->set_local_interfaces(_local_interfaces);
|
this_klass->set_local_interfaces(_local_interfaces);
|
||||||
this_klass->set_transitive_interfaces(_transitive_interfaces);
|
this_klass->set_transitive_interfaces(_transitive_interfaces);
|
||||||
|
this_klass->set_annotations(_combined_annotations);
|
||||||
|
|
||||||
// Clear out these fields so they don't get deallocated by the destructor
|
// Clear out these fields so they don't get deallocated by the destructor
|
||||||
clear_class_metadata();
|
clear_class_metadata();
|
||||||
@ -4002,6 +4021,10 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
|
|||||||
ClassAnnotationCollector parsed_annotations;
|
ClassAnnotationCollector parsed_annotations;
|
||||||
parse_classfile_attributes(&parsed_annotations, CHECK_(nullHandle));
|
parse_classfile_attributes(&parsed_annotations, CHECK_(nullHandle));
|
||||||
|
|
||||||
|
// Finalize the Annotations metadata object,
|
||||||
|
// now that all annotation arrays have been created.
|
||||||
|
create_combined_annotations(CHECK_(nullHandle));
|
||||||
|
|
||||||
// Make sure this is the end of class file stream
|
// Make sure this is the end of class file stream
|
||||||
guarantee_property(cfs->at_eos(), "Extra bytes at the end of class file %s", CHECK_(nullHandle));
|
guarantee_property(cfs->at_eos(), "Extra bytes at the end of class file %s", CHECK_(nullHandle));
|
||||||
|
|
||||||
@ -4302,10 +4325,27 @@ ClassFileParser::~ClassFileParser() {
|
|||||||
InstanceKlass::deallocate_interfaces(_loader_data, _super_klass(),
|
InstanceKlass::deallocate_interfaces(_loader_data, _super_klass(),
|
||||||
_local_interfaces, _transitive_interfaces);
|
_local_interfaces, _transitive_interfaces);
|
||||||
|
|
||||||
MetadataFactory::free_array<u1>(_loader_data, _annotations);
|
if (_combined_annotations != NULL) {
|
||||||
MetadataFactory::free_array<u1>(_loader_data, _type_annotations);
|
// After all annotations arrays have been created, they are installed into the
|
||||||
Annotations::free_contents(_loader_data, _fields_annotations);
|
// Annotations object that will be assigned to the InstanceKlass being created.
|
||||||
Annotations::free_contents(_loader_data, _fields_type_annotations);
|
|
||||||
|
// Deallocate the Annotations object and the installed annotations arrays.
|
||||||
|
_combined_annotations->deallocate_contents(_loader_data);
|
||||||
|
|
||||||
|
// If the _combined_annotations pointer is non-NULL,
|
||||||
|
// then the other annotations fields should have been cleared.
|
||||||
|
assert(_annotations == NULL, "Should have been cleared");
|
||||||
|
assert(_type_annotations == NULL, "Should have been cleared");
|
||||||
|
assert(_fields_annotations == NULL, "Should have been cleared");
|
||||||
|
assert(_fields_type_annotations == NULL, "Should have been cleared");
|
||||||
|
} else {
|
||||||
|
// If the annotations arrays were not installed into the Annotations object,
|
||||||
|
// then they have to be deallocated explicitly.
|
||||||
|
MetadataFactory::free_array<u1>(_loader_data, _annotations);
|
||||||
|
MetadataFactory::free_array<u1>(_loader_data, _type_annotations);
|
||||||
|
Annotations::free_contents(_loader_data, _fields_annotations);
|
||||||
|
Annotations::free_contents(_loader_data, _fields_type_annotations);
|
||||||
|
}
|
||||||
|
|
||||||
clear_class_metadata();
|
clear_class_metadata();
|
||||||
|
|
||||||
|
@ -75,6 +75,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
|
|||||||
Array<u2>* _inner_classes;
|
Array<u2>* _inner_classes;
|
||||||
Array<Klass*>* _local_interfaces;
|
Array<Klass*>* _local_interfaces;
|
||||||
Array<Klass*>* _transitive_interfaces;
|
Array<Klass*>* _transitive_interfaces;
|
||||||
|
Annotations* _combined_annotations;
|
||||||
AnnotationArray* _annotations;
|
AnnotationArray* _annotations;
|
||||||
AnnotationArray* _type_annotations;
|
AnnotationArray* _type_annotations;
|
||||||
Array<AnnotationArray*>* _fields_annotations;
|
Array<AnnotationArray*>* _fields_annotations;
|
||||||
@ -86,6 +87,8 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
|
|||||||
void set_class_generic_signature_index(u2 x) { _generic_signature_index = x; }
|
void set_class_generic_signature_index(u2 x) { _generic_signature_index = x; }
|
||||||
void set_class_sde_buffer(char* x, int len) { _sde_buffer = x; _sde_length = len; }
|
void set_class_sde_buffer(char* x, int len) { _sde_buffer = x; _sde_length = len; }
|
||||||
|
|
||||||
|
void create_combined_annotations(TRAPS);
|
||||||
|
|
||||||
void init_parsed_class_attributes(ClassLoaderData* loader_data) {
|
void init_parsed_class_attributes(ClassLoaderData* loader_data) {
|
||||||
_loader_data = loader_data;
|
_loader_data = loader_data;
|
||||||
_synthetic_flag = false;
|
_synthetic_flag = false;
|
||||||
@ -110,6 +113,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
|
|||||||
_inner_classes = NULL;
|
_inner_classes = NULL;
|
||||||
_local_interfaces = NULL;
|
_local_interfaces = NULL;
|
||||||
_transitive_interfaces = NULL;
|
_transitive_interfaces = NULL;
|
||||||
|
_combined_annotations = NULL;
|
||||||
_annotations = _type_annotations = NULL;
|
_annotations = _type_annotations = NULL;
|
||||||
_fields_annotations = _fields_type_annotations = NULL;
|
_fields_annotations = _fields_type_annotations = NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user