< prev index next >

src/hotspot/share/oops/objArrayKlass.cpp

Print this page




  46 #include "runtime/handles.inline.hpp"
  47 #include "runtime/mutexLocker.hpp"
  48 #include "utilities/macros.hpp"
  49 
  50 ObjArrayKlass* ObjArrayKlass::allocate(ClassLoaderData* loader_data, int n, Klass* k, Symbol* name, TRAPS) {
  51   assert(ObjArrayKlass::header_size() <= InstanceKlass::header_size(),
  52       "array klasses must be same size as InstanceKlass");
  53 
  54   int size = ArrayKlass::static_size(ObjArrayKlass::header_size());
  55 
  56   return new (loader_data, size, THREAD) ObjArrayKlass(n, k, name);
  57 }
  58 
  59 Klass* ObjArrayKlass::allocate_objArray_klass(ClassLoaderData* loader_data,
  60                                                 int n, Klass* element_klass, TRAPS) {
  61 
  62   // Eagerly allocate the direct array supertype.
  63   Klass* super_klass = NULL;
  64   if (!Universe::is_bootstrapping() || SystemDictionary::Object_klass_loaded()) {
  65     Klass* element_super = element_klass->super();
  66     if (element_super == SystemDictionary::___Value_klass()) {
  67       element_super = NULL;
  68     }
  69     if (element_super != NULL) {
  70       // The element type has a direct super.  E.g., String[] has direct super of Object[].
  71       super_klass = element_super->array_klass_or_null();
  72       bool supers_exist = super_klass != NULL;
  73       // Also, see if the element has secondary supertypes.
  74       // We need an array type for each.
  75       Array<Klass*>* element_supers = element_klass->secondary_supers();
  76       for( int i = element_supers->length()-1; i >= 0; i-- ) {
  77         Klass* elem_super = element_supers->at(i);
  78         if (elem_super->array_klass_or_null() == NULL) {
  79           supers_exist = false;
  80           break;
  81         }
  82       }
  83       if (!supers_exist) {
  84         // Oops.  Not allocated yet.  Back out, allocate it, and retry.
  85         Klass* ek = NULL;
  86         {
  87           MutexUnlocker mu(MultiArray_lock);
  88           MutexUnlocker mc(Compile_lock);   // for vtables




  46 #include "runtime/handles.inline.hpp"
  47 #include "runtime/mutexLocker.hpp"
  48 #include "utilities/macros.hpp"
  49 
  50 ObjArrayKlass* ObjArrayKlass::allocate(ClassLoaderData* loader_data, int n, Klass* k, Symbol* name, TRAPS) {
  51   assert(ObjArrayKlass::header_size() <= InstanceKlass::header_size(),
  52       "array klasses must be same size as InstanceKlass");
  53 
  54   int size = ArrayKlass::static_size(ObjArrayKlass::header_size());
  55 
  56   return new (loader_data, size, THREAD) ObjArrayKlass(n, k, name);
  57 }
  58 
  59 Klass* ObjArrayKlass::allocate_objArray_klass(ClassLoaderData* loader_data,
  60                                                 int n, Klass* element_klass, TRAPS) {
  61 
  62   // Eagerly allocate the direct array supertype.
  63   Klass* super_klass = NULL;
  64   if (!Universe::is_bootstrapping() || SystemDictionary::Object_klass_loaded()) {
  65     Klass* element_super = element_klass->super();



  66     if (element_super != NULL) {
  67       // The element type has a direct super.  E.g., String[] has direct super of Object[].
  68       super_klass = element_super->array_klass_or_null();
  69       bool supers_exist = super_klass != NULL;
  70       // Also, see if the element has secondary supertypes.
  71       // We need an array type for each.
  72       Array<Klass*>* element_supers = element_klass->secondary_supers();
  73       for( int i = element_supers->length()-1; i >= 0; i-- ) {
  74         Klass* elem_super = element_supers->at(i);
  75         if (elem_super->array_klass_or_null() == NULL) {
  76           supers_exist = false;
  77           break;
  78         }
  79       }
  80       if (!supers_exist) {
  81         // Oops.  Not allocated yet.  Back out, allocate it, and retry.
  82         Klass* ek = NULL;
  83         {
  84           MutexUnlocker mu(MultiArray_lock);
  85           MutexUnlocker mc(Compile_lock);   // for vtables


< prev index next >