Mercurial > hg > truffle
diff src/share/vm/oops/instanceKlass.hpp @ 8719:c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
Summary: Store metadata on ClassFileParser instance to be cleaned up by destructor. This enabled some refactoring of the enormous parseClassFile function.
Reviewed-by: jmasa, acorn
author | coleenp |
---|---|
date | Wed, 13 Mar 2013 17:34:29 -0400 |
parents | 35ef86296a5d |
children | b9a918201d47 6337ca4dcad8 |
line wrap: on
line diff
--- a/src/share/vm/oops/instanceKlass.hpp Wed Mar 13 15:15:56 2013 -0400 +++ b/src/share/vm/oops/instanceKlass.hpp Wed Mar 13 17:34:29 2013 -0400 @@ -147,7 +147,8 @@ AccessFlags access_flags, bool is_anonymous); public: - static Klass* allocate_instance_klass(ClassLoaderData* loader_data, + static InstanceKlass* allocate_instance_klass( + ClassLoaderData* loader_data, int vtable_len, int itable_len, int static_field_size, @@ -266,7 +267,6 @@ u1 _init_state; // state of class u1 _reference_type; // reference type - JvmtiCachedClassFieldMap* _jvmti_cached_class_field_map; // JVMTI: used during heap iteration NOT_PRODUCT(int _verify_count;) // to avoid redundant verifies @@ -358,16 +358,19 @@ // method ordering Array<int>* method_ordering() const { return _method_ordering; } void set_method_ordering(Array<int>* m) { _method_ordering = m; } + void copy_method_ordering(intArray* m, TRAPS); // interfaces Array<Klass*>* local_interfaces() const { return _local_interfaces; } void set_local_interfaces(Array<Klass*>* a) { guarantee(_local_interfaces == NULL || a == NULL, "Just checking"); _local_interfaces = a; } + Array<Klass*>* transitive_interfaces() const { return _transitive_interfaces; } void set_transitive_interfaces(Array<Klass*>* a) { guarantee(_transitive_interfaces == NULL || a == NULL, "Just checking"); - _transitive_interfaces = a; } + _transitive_interfaces = a; + } private: friend class fieldDescriptor; @@ -383,10 +386,9 @@ int java_fields_count() const { return (int)_java_fields_count; } Array<u2>* fields() const { return _fields; } - void set_fields(Array<u2>* f, u2 java_fields_count) { guarantee(_fields == NULL || f == NULL, "Just checking"); - _fields = f; + _fields = f; _java_fields_count = java_fields_count; } @@ -916,8 +918,15 @@ void clean_method_data(BoolObjectClosure* is_alive); // Explicit metaspace deallocation of fields - // For RedefineClasses, we need to deallocate instanceKlasses + // For RedefineClasses and class file parsing errors, we need to deallocate + // instanceKlasses and the metadata they point to. void deallocate_contents(ClassLoaderData* loader_data); + static void deallocate_methods(ClassLoaderData* loader_data, + Array<Method*>* methods); + void static deallocate_interfaces(ClassLoaderData* loader_data, + Klass* super_klass, + Array<Klass*>* local_interfaces, + Array<Klass*>* transitive_interfaces); // The constant pool is on stack if any of the methods are executing or // referenced by handles.