src/share/vm/oops/arrayKlass.cpp

Print this page




  54 Klass* ArrayKlass::java_super() const {
  55   if (super() == NULL)  return NULL;  // bootstrap case
  56   // Array klasses have primary supertypes which are not reported to Java.
  57   // Example super chain:  String[][] -> Object[][] -> Object[] -> Object
  58   return SystemDictionary::Object_klass();
  59 }
  60 
  61 
  62 oop ArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
  63   ShouldNotReachHere();
  64   return NULL;
  65 }
  66 
  67 Method* ArrayKlass::uncached_lookup_method(Symbol* name, Symbol* signature) const {
  68   // There are no methods in an array klass but the super class (Object) has some
  69   assert(super(), "super klass must be present");
  70   return super()->uncached_lookup_method(name, signature);
  71 }
  72 
  73 ArrayKlass::ArrayKlass(Symbol* name) {
  74   set_alloc_size(0);
  75   set_name(name);
  76 
  77   set_super(Universe::is_bootstrapping() ? (Klass*)NULL : SystemDictionary::Object_klass());
  78   set_layout_helper(Klass::_lh_neutral_value);
  79   set_dimension(1);
  80   set_higher_dimension(NULL);
  81   set_lower_dimension(NULL);
  82   set_component_mirror(NULL);
  83   // Arrays don't add any new methods, so their vtable is the same size as
  84   // the vtable of klass Object.
  85   int vtable_size = Universe::base_vtable_size();
  86   set_vtable_length(vtable_size);
  87   set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5)
  88 }
  89 
  90 
  91 // Initialization of vtables and mirror object is done separatly from base_create_array_klass,
  92 // since a GC can happen. At this point all instance variables of the ArrayKlass must be setup.
  93 void ArrayKlass::complete_create_array_klass(ArrayKlass* k, KlassHandle super_klass, TRAPS) {
  94   ResourceMark rm(THREAD);


 143   return o;
 144 }
 145 
 146 void ArrayKlass::array_klasses_do(void f(Klass* k, TRAPS), TRAPS) {
 147   Klass* k = this;
 148   // Iterate over this array klass and all higher dimensions
 149   while (k != NULL) {
 150     f(k, CHECK);
 151     k = ArrayKlass::cast(k)->higher_dimension();
 152   }
 153 }
 154 
 155 void ArrayKlass::array_klasses_do(void f(Klass* k)) {
 156   Klass* k = this;
 157   // Iterate over this array klass and all higher dimensions
 158   while (k != NULL) {
 159     f(k);
 160     k = ArrayKlass::cast(k)->higher_dimension();
 161   }
 162 }
 163 
 164 
 165 void ArrayKlass::with_array_klasses_do(void f(Klass* k)) {
 166   array_klasses_do(f);
 167 }
 168 
 169 
 170 // GC support
 171 
 172 void ArrayKlass::oops_do(OopClosure* cl) {
 173   Klass::oops_do(cl);
 174 
 175   cl->do_oop(adr_component_mirror());
 176 }
 177 
 178 // JVM support
 179 
 180 jint ArrayKlass::compute_modifier_flags(TRAPS) const {
 181   return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
 182 }
 183 
 184 // JVMTI support
 185 
 186 jint ArrayKlass::jvmti_class_status() const {
 187   return JVMTI_CLASS_STATUS_ARRAY;
 188 }




  54 Klass* ArrayKlass::java_super() const {
  55   if (super() == NULL)  return NULL;  // bootstrap case
  56   // Array klasses have primary supertypes which are not reported to Java.
  57   // Example super chain:  String[][] -> Object[][] -> Object[] -> Object
  58   return SystemDictionary::Object_klass();
  59 }
  60 
  61 
  62 oop ArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
  63   ShouldNotReachHere();
  64   return NULL;
  65 }
  66 
  67 Method* ArrayKlass::uncached_lookup_method(Symbol* name, Symbol* signature) const {
  68   // There are no methods in an array klass but the super class (Object) has some
  69   assert(super(), "super klass must be present");
  70   return super()->uncached_lookup_method(name, signature);
  71 }
  72 
  73 ArrayKlass::ArrayKlass(Symbol* name) {

  74   set_name(name);
  75 
  76   set_super(Universe::is_bootstrapping() ? (Klass*)NULL : SystemDictionary::Object_klass());
  77   set_layout_helper(Klass::_lh_neutral_value);
  78   set_dimension(1);
  79   set_higher_dimension(NULL);
  80   set_lower_dimension(NULL);
  81   set_component_mirror(NULL);
  82   // Arrays don't add any new methods, so their vtable is the same size as
  83   // the vtable of klass Object.
  84   int vtable_size = Universe::base_vtable_size();
  85   set_vtable_length(vtable_size);
  86   set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5)
  87 }
  88 
  89 
  90 // Initialization of vtables and mirror object is done separatly from base_create_array_klass,
  91 // since a GC can happen. At this point all instance variables of the ArrayKlass must be setup.
  92 void ArrayKlass::complete_create_array_klass(ArrayKlass* k, KlassHandle super_klass, TRAPS) {
  93   ResourceMark rm(THREAD);


 142   return o;
 143 }
 144 
 145 void ArrayKlass::array_klasses_do(void f(Klass* k, TRAPS), TRAPS) {
 146   Klass* k = this;
 147   // Iterate over this array klass and all higher dimensions
 148   while (k != NULL) {
 149     f(k, CHECK);
 150     k = ArrayKlass::cast(k)->higher_dimension();
 151   }
 152 }
 153 
 154 void ArrayKlass::array_klasses_do(void f(Klass* k)) {
 155   Klass* k = this;
 156   // Iterate over this array klass and all higher dimensions
 157   while (k != NULL) {
 158     f(k);
 159     k = ArrayKlass::cast(k)->higher_dimension();
 160   }
 161 }






 162 
 163 // GC support
 164 
 165 void ArrayKlass::oops_do(OopClosure* cl) {
 166   Klass::oops_do(cl);
 167 
 168   cl->do_oop(adr_component_mirror());
 169 }
 170 
 171 // JVM support
 172 
 173 jint ArrayKlass::compute_modifier_flags(TRAPS) const {
 174   return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
 175 }
 176 
 177 // JVMTI support
 178 
 179 jint ArrayKlass::jvmti_class_status() const {
 180   return JVMTI_CLASS_STATUS_ARRAY;
 181 }