< prev index next >

src/hotspot/share/oops/arrayKlass.cpp

Print this page




  81   // super klass of an array, (j.l.Object) should not have
  82   // any overpass methods present.
  83   return super()->uncached_lookup_method(name, signature, Klass::skip_overpass, private_mode);
  84 }
  85 
  86 ArrayKlass::ArrayKlass(Symbol* name, KlassID id) :
  87   Klass(id),
  88   _dimension(1),
  89   _higher_dimension(NULL),
  90   _lower_dimension(NULL) {
  91     // Arrays don't add any new methods, so their vtable is the same size as
  92     // the vtable of klass Object.
  93     set_vtable_length(Universe::base_vtable_size());
  94     set_name(name);
  95     set_super(Universe::is_bootstrapping() ? NULL : SystemDictionary::Object_klass());
  96     set_layout_helper(Klass::_lh_neutral_value);
  97     set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5)
  98     JFR_ONLY(INIT_ID(this);)
  99 }
 100 
 101 Symbol* ArrayKlass::create_element_klass_array_name(Klass* element_klass, TRAPS) {
 102   Symbol* name = NULL;
 103   if (!element_klass->is_instance_klass() ||
 104       (name = InstanceKlass::cast(element_klass)->array_name()) == NULL) {
 105 
 106     ResourceMark rm(THREAD);
 107     char *name_str = element_klass->name()->as_C_string();
 108     int len = element_klass->name()->utf8_length();
 109     char *new_str = NEW_RESOURCE_ARRAY(char, len + 4);
 110     int idx = 0;
 111     new_str[idx++] = '[';
 112     if (element_klass->is_instance_klass()) { // it could be an array or simple type
 113       // Temporary hack, for arrays of value types, this code should be removed
 114       // once value types have their own array types
 115       // With Q-descriptors, the code below needs to be reworked.
 116       // It is still correct today because the only kind of value array supported
 117       // is array of null-free values which map to the Q-signature.
 118       // As soon as both arrays of null-free values and arrays of nullable values
 119       // are supported, this code has to be rewritten to consider the kind of the
 120       // array instead of the kind of the elements.
 121       if (element_klass->is_value()) {
 122         new_str[idx++] = 'Q';
 123       } else {
 124         new_str[idx++] = 'L';
 125       }
 126     }
 127     memcpy(&new_str[idx], name_str, len * sizeof(char));
 128     idx += len;
 129     if (element_klass->is_instance_klass()) {
 130       new_str[idx++] = ';';
 131     }
 132     new_str[idx++] = '\0';
 133     name = SymbolTable::new_permanent_symbol(new_str, CHECK_NULL);
 134     if (element_klass->is_instance_klass() || element_klass->is_value()) {
 135       InstanceKlass* ik = InstanceKlass::cast(element_klass);
 136       ik->set_array_name(name);
 137     }
 138   }
 139 
 140   return name;
 141 }
 142 
 143 // Initialization of vtables and mirror object is done separatly from base_create_array_klass,
 144 // since a GC can happen. At this point all instance variables of the ArrayKlass must be setup.
 145 void ArrayKlass::complete_create_array_klass(ArrayKlass* k, Klass* super_klass, ModuleEntry* module_entry, TRAPS) {
 146   k->initialize_supers(super_klass, NULL, CHECK);
 147   k->vtable().initialize_vtable(false, CHECK);
 148 
 149   // During bootstrapping, before java.base is defined, the module_entry may not be present yet.
 150   // These classes will be put on a fixup list and their module fields will be patched once
 151   // java.base is defined.
 152   assert((module_entry != NULL) || ((module_entry == NULL) && !ModuleEntryTable::javabase_defined()),
 153          "module entry not available post " JAVA_BASE_NAME " definition");
 154   oop module = (module_entry != NULL) ? module_entry->module() : (oop)NULL;
 155   java_lang_Class::create_mirror(k, Handle(THREAD, k->class_loader()), Handle(THREAD, module), Handle(), CHECK);
 156 }
 157 
 158 GrowableArray<Klass*>* ArrayKlass::compute_secondary_supers(int num_extra_slots,
 159                                                             Array<InstanceKlass*>* transitive_interfaces) {
 160   // interfaces = { cloneable_klass, serializable_klass };
 161   assert(num_extra_slots == 0, "sanity of primitive array type");
 162   assert(transitive_interfaces == NULL, "sanity");
 163   // Must share this for correct bootstrapping!
 164   set_secondary_supers(Universe::the_array_interfaces_array());
 165   return NULL;
 166 }
 167 
 168 objArrayOop ArrayKlass::allocate_arrayArray(int n, int length, TRAPS) {
 169   check_array_allocation_length(length, arrayOopDesc::max_array_length(T_ARRAY), CHECK_0);
 170   int size = objArrayOopDesc::object_size(length);
 171   Klass* k = array_klass(n+dimension(), CHECK_0);
 172   ArrayKlass* ak = ArrayKlass::cast(k);
 173   objArrayOop o = (objArrayOop)Universe::heap()->array_allocate(ak, size, length,
 174                                                                 /* do_zero */ true, CHECK_0);
 175   // initialization to NULL not necessary, area already cleared
 176   return o;
 177 }
 178 
 179 void ArrayKlass::array_klasses_do(void f(Klass* k, TRAPS), TRAPS) {
 180   Klass* k = this;
 181   // Iterate over this array klass and all higher dimensions
 182   while (k != NULL) {
 183     f(k, CHECK);
 184     k = ArrayKlass::cast(k)->higher_dimension();
 185   }
 186 }
 187 
 188 void ArrayKlass::array_klasses_do(void f(Klass* k)) {
 189   Klass* k = this;
 190   // Iterate over this array klass and all higher dimensions
 191   while (k != NULL) {
 192     f(k);
 193     k = ArrayKlass::cast(k)->higher_dimension();
 194   }
 195 }
 196 
 197 // JVM support
 198 
 199 jint ArrayKlass::compute_modifier_flags(TRAPS) const {
 200   return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
 201 }
 202 
 203 // JVMTI support
 204 
 205 jint ArrayKlass::jvmti_class_status() const {




  81   // super klass of an array, (j.l.Object) should not have
  82   // any overpass methods present.
  83   return super()->uncached_lookup_method(name, signature, Klass::skip_overpass, private_mode);
  84 }
  85 
  86 ArrayKlass::ArrayKlass(Symbol* name, KlassID id) :
  87   Klass(id),
  88   _dimension(1),
  89   _higher_dimension(NULL),
  90   _lower_dimension(NULL) {
  91     // Arrays don't add any new methods, so their vtable is the same size as
  92     // the vtable of klass Object.
  93     set_vtable_length(Universe::base_vtable_size());
  94     set_name(name);
  95     set_super(Universe::is_bootstrapping() ? NULL : SystemDictionary::Object_klass());
  96     set_layout_helper(Klass::_lh_neutral_value);
  97     set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5)
  98     JFR_ONLY(INIT_ID(this);)
  99 }
 100 
 101 Symbol* ArrayKlass::create_element_klass_array_name(bool is_qtype, Klass* element_klass, TRAPS) {
 102   Symbol* name = NULL;
 103   if (!element_klass->is_instance_klass() || is_qtype ||
 104       (name = InstanceKlass::cast(element_klass)->array_name()) == NULL) {
 105 
 106     ResourceMark rm(THREAD);
 107     char *name_str = element_klass->name()->as_C_string();
 108     int len = element_klass->name()->utf8_length();
 109     char *new_str = NEW_RESOURCE_ARRAY(char, len + 4);
 110     int idx = 0;
 111     new_str[idx++] = '[';
 112     if (element_klass->is_instance_klass()) { // it could be an array or simple type
 113       if (is_qtype) {








 114         new_str[idx++] = 'Q';
 115       } else {
 116         new_str[idx++] = 'L';
 117       }
 118     }
 119     memcpy(&new_str[idx], name_str, len * sizeof(char));
 120     idx += len;
 121     if (element_klass->is_instance_klass()) {
 122       new_str[idx++] = ';';
 123     }
 124     new_str[idx++] = '\0';
 125     name = SymbolTable::new_permanent_symbol(new_str, CHECK_NULL);
 126     if (element_klass->is_instance_klass() && (!is_qtype)) {
 127       InstanceKlass* ik = InstanceKlass::cast(element_klass);
 128       ik->set_array_name(name); // CMH: only cache and deref array_name for L-type...missing for Q-type
 129     }
 130   }
 131 
 132   return name;
 133 }
 134 
 135 // Initialization of vtables and mirror object is done separatly from base_create_array_klass,
 136 // since a GC can happen. At this point all instance variables of the ArrayKlass must be setup.
 137 void ArrayKlass::complete_create_array_klass(ArrayKlass* k, Klass* super_klass, ModuleEntry* module_entry, TRAPS) {
 138   k->initialize_supers(super_klass, NULL, CHECK);
 139   k->vtable().initialize_vtable(false, CHECK);
 140 
 141   // During bootstrapping, before java.base is defined, the module_entry may not be present yet.
 142   // These classes will be put on a fixup list and their module fields will be patched once
 143   // java.base is defined.
 144   assert((module_entry != NULL) || ((module_entry == NULL) && !ModuleEntryTable::javabase_defined()),
 145          "module entry not available post " JAVA_BASE_NAME " definition");
 146   oop module = (module_entry != NULL) ? module_entry->module() : (oop)NULL;
 147   java_lang_Class::create_mirror(k, Handle(THREAD, k->class_loader()), Handle(THREAD, module), Handle(), CHECK);
 148 }
 149 
 150 GrowableArray<Klass*>* ArrayKlass::compute_secondary_supers(int num_extra_slots,
 151                                                             Array<InstanceKlass*>* transitive_interfaces) {
 152   // interfaces = { cloneable_klass, serializable_klass };
 153   assert(num_extra_slots == 0, "sanity of primitive array type");
 154   assert(transitive_interfaces == NULL, "sanity");
 155   // Must share this for correct bootstrapping!
 156   set_secondary_supers(Universe::the_array_interfaces_array());
 157   return NULL;
 158 }
 159 
 160 objArrayOop ArrayKlass::allocate_arrayArray(int n, int length, TRAPS) {
 161   check_array_allocation_length(length, arrayOopDesc::max_array_length(T_ARRAY), CHECK_0);
 162   int size = objArrayOopDesc::object_size(length);
 163   Klass* k = array_klass(FieldType::get_array_storage_properties(name()), n+dimension(), CHECK_0);
 164   ArrayKlass* ak = ArrayKlass::cast(k);
 165   objArrayOop o = (objArrayOop)Universe::heap()->array_allocate(ak, size, length,
 166                                                                 /* do_zero */ true, CHECK_0);
 167   // initialization to NULL not necessary, area already cleared
 168   return o;









 169 }
 170 
 171 void ArrayKlass::array_klasses_do(void f(Klass* k)) {
 172   Klass* k = this;
 173   // Iterate over this array klass and all higher dimensions
 174   while (k != NULL) {
 175     f(k);
 176     k = ArrayKlass::cast(k)->higher_dimension();
 177   }
 178 }
 179 
 180 // JVM support
 181 
 182 jint ArrayKlass::compute_modifier_flags(TRAPS) const {
 183   return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
 184 }
 185 
 186 // JVMTI support
 187 
 188 jint ArrayKlass::jvmti_class_status() const {


< prev index next >