< prev index next >

src/hotspot/share/oops/objArrayKlass.cpp

Print this page




  81         {
  82           MutexUnlocker mu(MultiArray_lock);
  83           super_klass = element_super->array_klass(CHECK_NULL);
  84           for( int i = element_supers->length()-1; i >= 0; i-- ) {
  85             Klass* elem_super = element_supers->at(i);
  86             elem_super->array_klass(CHECK_NULL);
  87           }
  88           // Now retry from the beginning
  89           ek = element_klass->array_klass(n, CHECK_NULL);
  90         }  // re-lock
  91         return ek;
  92       }
  93     } else {
  94       // The element type is already Object.  Object[] has direct super of Object.
  95       super_klass = SystemDictionary::Object_klass();
  96     }
  97   }
  98 
  99   // Create type name for klass.
 100   Symbol* name = NULL;
 101   if (!element_klass->is_instance_klass() ||
 102       (name = InstanceKlass::cast(element_klass)->array_name()) == NULL) {
 103 
 104     ResourceMark rm(THREAD);
 105     char *name_str = element_klass->name()->as_C_string();
 106     int len = element_klass->name()->utf8_length();
 107     char *new_str = NEW_RESOURCE_ARRAY(char, len + 4);
 108     int idx = 0;
 109     new_str[idx++] = JVM_SIGNATURE_ARRAY;
 110     if (element_klass->is_instance_klass()) { // it could be an array or simple type
 111       new_str[idx++] = JVM_SIGNATURE_CLASS;
 112     }
 113     memcpy(&new_str[idx], name_str, len * sizeof(char));
 114     idx += len;
 115     if (element_klass->is_instance_klass()) {
 116       new_str[idx++] = JVM_SIGNATURE_ENDCLASS;
 117     }
 118     new_str[idx++] = '\0';
 119     name = SymbolTable::new_permanent_symbol(new_str);
 120     if (element_klass->is_instance_klass()) {
 121       InstanceKlass* ik = InstanceKlass::cast(element_klass);
 122       ik->set_array_name(name);
 123     }
 124   }
 125 
 126   // Initialize instance variables
 127   ObjArrayKlass* oak = ObjArrayKlass::allocate(loader_data, n, element_klass, name, CHECK_NULL);
 128 
 129   ModuleEntry* module = oak->module();
 130   assert(module != NULL, "No module entry for array");
 131 
 132   // Call complete_create_array_klass after all instance variables has been initialized.
 133   ArrayKlass::complete_create_array_klass(oak, super_klass, module, CHECK_NULL);
 134 
 135   // Add all classes to our internal class loader list here,
 136   // including classes in the bootstrap (NULL) class loader.
 137   // Do this step after creating the mirror so that if the
 138   // mirror creation fails, loaded_classes_do() doesn't find
 139   // an array class without a mirror.
 140   loader_data->add_class(oak);
 141 
 142   return oak;
 143 }
 144 
 145 ObjArrayKlass::ObjArrayKlass(int n, Klass* element_klass, Symbol* name) : ArrayKlass(name, ID) {
 146   this->set_dimension(n);
 147   this->set_element_klass(element_klass);
 148   // decrement refcount because object arrays are not explicitly freed.  The
 149   // InstanceKlass array_name() keeps the name counted while the klass is
 150   // loaded.
 151   name->decrement_refcount();
 152 
 153   Klass* bk;
 154   if (element_klass->is_objArray_klass()) {
 155     bk = ObjArrayKlass::cast(element_klass)->bottom_klass();
 156   } else {
 157     bk = element_klass;
 158   }
 159   assert(bk != NULL && (bk->is_instance_klass() || bk->is_typeArray_klass()), "invalid bottom klass");
 160   this->set_bottom_klass(bk);
 161   this->set_class_loader_data(bk->class_loader_data());
 162 
 163   this->set_layout_helper(array_layout_helper(T_OBJECT));
 164   assert(this->is_array_klass(), "sanity");
 165   assert(this->is_objArray_klass(), "sanity");
 166 }
 167 
 168 int ObjArrayKlass::oop_size(oop obj) const {
 169   assert(obj->is_objArray(), "must be object array");
 170   return objArrayOop(obj)->object_size();
 171 }
 172 
 173 objArrayOop ObjArrayKlass::allocate(int length, TRAPS) {
 174   check_array_allocation_length(length, arrayOopDesc::max_array_length(T_OBJECT), CHECK_NULL);
 175   int size = objArrayOopDesc::object_size(length);
 176   return (objArrayOop)Universe::heap()->array_allocate(this, size, length,
 177                                                        /* do_zero */ true, THREAD);
 178 }
 179 
 180 static int multi_alloc_counter = 0;
 181 
 182 oop ObjArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
 183   int length = *sizes;
 184   // Call to lower_dimension uses this pointer, so most be called before a
 185   // possible GC




  81         {
  82           MutexUnlocker mu(MultiArray_lock);
  83           super_klass = element_super->array_klass(CHECK_NULL);
  84           for( int i = element_supers->length()-1; i >= 0; i-- ) {
  85             Klass* elem_super = element_supers->at(i);
  86             elem_super->array_klass(CHECK_NULL);
  87           }
  88           // Now retry from the beginning
  89           ek = element_klass->array_klass(n, CHECK_NULL);
  90         }  // re-lock
  91         return ek;
  92       }
  93     } else {
  94       // The element type is already Object.  Object[] has direct super of Object.
  95       super_klass = SystemDictionary::Object_klass();
  96     }
  97   }
  98 
  99   // Create type name for klass.
 100   Symbol* name = NULL;
 101   {


 102     ResourceMark rm(THREAD);
 103     char *name_str = element_klass->name()->as_C_string();
 104     int len = element_klass->name()->utf8_length();
 105     char *new_str = NEW_RESOURCE_ARRAY(char, len + 4);
 106     int idx = 0;
 107     new_str[idx++] = JVM_SIGNATURE_ARRAY;
 108     if (element_klass->is_instance_klass()) { // it could be an array or simple type
 109       new_str[idx++] = JVM_SIGNATURE_CLASS;
 110     }
 111     memcpy(&new_str[idx], name_str, len * sizeof(char));
 112     idx += len;
 113     if (element_klass->is_instance_klass()) {
 114       new_str[idx++] = JVM_SIGNATURE_ENDCLASS;
 115     }
 116     new_str[idx++] = '\0';
 117     name = SymbolTable::new_symbol(new_str);




 118   }
 119 
 120   // Initialize instance variables
 121   ObjArrayKlass* oak = ObjArrayKlass::allocate(loader_data, n, element_klass, name, CHECK_NULL);
 122 
 123   ModuleEntry* module = oak->module();
 124   assert(module != NULL, "No module entry for array");
 125 
 126   // Call complete_create_array_klass after all instance variables has been initialized.
 127   ArrayKlass::complete_create_array_klass(oak, super_klass, module, CHECK_NULL);
 128 
 129   // Add all classes to our internal class loader list here,
 130   // including classes in the bootstrap (NULL) class loader.
 131   // Do this step after creating the mirror so that if the
 132   // mirror creation fails, loaded_classes_do() doesn't find
 133   // an array class without a mirror.
 134   loader_data->add_class(oak);
 135 
 136   return oak;
 137 }
 138 
 139 ObjArrayKlass::ObjArrayKlass(int n, Klass* element_klass, Symbol* name) : ArrayKlass(name, ID) {
 140   set_dimension(n);
 141   set_element_klass(element_klass);




 142 
 143   Klass* bk;
 144   if (element_klass->is_objArray_klass()) {
 145     bk = ObjArrayKlass::cast(element_klass)->bottom_klass();
 146   } else {
 147     bk = element_klass;
 148   }
 149   assert(bk != NULL && (bk->is_instance_klass() || bk->is_typeArray_klass()), "invalid bottom klass");
 150   set_bottom_klass(bk);
 151   set_class_loader_data(bk->class_loader_data());
 152 
 153   set_layout_helper(array_layout_helper(T_OBJECT));
 154   assert(is_array_klass(), "sanity");
 155   assert(is_objArray_klass(), "sanity");
 156 }
 157 
 158 int ObjArrayKlass::oop_size(oop obj) const {
 159   assert(obj->is_objArray(), "must be object array");
 160   return objArrayOop(obj)->object_size();
 161 }
 162 
 163 objArrayOop ObjArrayKlass::allocate(int length, TRAPS) {
 164   check_array_allocation_length(length, arrayOopDesc::max_array_length(T_OBJECT), CHECK_NULL);
 165   int size = objArrayOopDesc::object_size(length);
 166   return (objArrayOop)Universe::heap()->array_allocate(this, size, length,
 167                                                        /* do_zero */ true, THREAD);
 168 }
 169 
 170 static int multi_alloc_counter = 0;
 171 
 172 oop ObjArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
 173   int length = *sizes;
 174   // Call to lower_dimension uses this pointer, so most be called before a
 175   // possible GC


< prev index next >