< prev index next >

src/share/vm/oops/valueArrayKlass.cpp

Print this page




  72   assert(ValueArrayFlatten, "Flatten array not allowed");
  73   assert(ValueKlass::cast(element_klass())->is_atomic() || (!ValueArrayAtomicAccess), "Atomic by-default");
  74 
  75   ClassLoaderData* loader_data = element_klass->class_loader_data();
  76   int size = ArrayKlass::static_size(ValueArrayKlass::header_size());
  77   ValueArrayKlass* vak = new (loader_data, size, THREAD) ValueArrayKlass(element_klass, name);
  78   if (vak == NULL) {
  79     return NULL;
  80   }
  81   loader_data->add_class(vak);
  82   complete_create_array_klass(vak, vak->super(), CHECK_NULL);
  83   return vak;
  84 }
  85 
  86 ValueArrayKlass* ValueArrayKlass::allocate_klass(KlassHandle element_klass, TRAPS) {
  87   Symbol* name = ArrayKlass::create_element_klass_array_name(element_klass, CHECK_NULL);
  88   return allocate_klass(element_klass, name, THREAD);
  89 }
  90 
  91 // Oops allocation...
  92 valueArrayOop ValueArrayKlass::allocate_array(int length,
  93                                               bool do_zero,
  94                                               TRAPS) {
  95   CMH("this is virtually identical in all arrayKlasses, refactor")
  96   if (length < 0) {
  97     THROW_0(vmSymbols::java_lang_NegativeArraySizeException());
  98   }
  99   if (length > max_elements()) {
 100     report_java_out_of_memory("Requested array size exceeds VM limit");
 101     JvmtiExport::post_array_size_exhausted();
 102     THROW_OOP_0(Universe::out_of_memory_error_array_size());
 103   }
 104 
 105   size_t size = valueArrayOopDesc::object_size(layout_helper(), length);
 106   KlassHandle h_k(THREAD, this);
 107   valueArrayOop array;
 108   CollectedHeap* ch = Universe::heap();
 109   if (do_zero) {
 110     array = (valueArrayOop)CollectedHeap::array_allocate(h_k, (int)size, length, CHECK_NULL);
 111   } else {
 112     array = (valueArrayOop)CollectedHeap::array_allocate_nozero(h_k, (int)size, length, CHECK_NULL);
 113   }
 114   return array;
 115 }
 116 
 117 
 118 oop ValueArrayKlass::multi_allocate(int rank, jint* last_size, TRAPS) {
 119   // For valueArrays this is only called for the last dimension
 120   assert(rank == 1, "just checking");
 121   int length = *last_size;
 122   return allocate_array(length, true, THREAD);
 123 }
 124 
 125 jint ValueArrayKlass::array_layout_helper(ValueKlass* vk) {
 126   BasicType etype = T_VALUETYPE;
 127   int atag  = _lh_array_tag_type_value;
 128   int esize = upper_log2(vk->raw_value_byte_size());
 129   int hsize = arrayOopDesc::base_offset_in_bytes(etype);
 130 
 131   int lh = (atag        << _lh_array_tag_shift)
 132     |      (1          << _lh_valuetype_bit)
 133     |      (hsize      << _lh_header_size_shift)
 134     |      ((int)etype << _lh_element_type_shift)
 135     |      (esize);
 136 
 137 #ifdef DEBUG
 138   assert(lh < (int)_lh_neutral_value, "must look like an array layout");
 139   assert(layout_helper_is_array(lh), "correct kind");
 140   assert(layout_helper_is_valueArray(lh), "correct kind");
 141   assert(layout_helper_header_size(lh) == hsize, "correct decode");
 142   assert(layout_helper_element_type(lh) == etype, "correct decode");
 143   assert(layout_helper_is_typeArray(lh), "correct kind");
 144   assert(1 << layout_helper_log2_element_size(lh) == esize, "correct decode");
 145 #endif
 146   return lh;
 147 }
 148 
 149 int ValueArrayKlass::oop_size(oop obj) const {
 150   assert(obj->is_valueArray(),"must be a value array");
 151   valueArrayOop array = valueArrayOop(obj);
 152   return array->object_size();
 153 }
 154 
 155 jint ValueArrayKlass::max_elements() const {


 243   assert(!is_objArray_klass(), "Unimplemented");
 244 
 245   st->print("Value Type Array: ");
 246   Klass::print_on(st);
 247 
 248   st->print(" - element klass: ");
 249   element_klass()->print_value_on(st);
 250   st->cr();
 251 
 252   int elem_size = element_byte_size();
 253   st->print(" - element size %i ", elem_size);
 254   st->print("aligned layout size %i", 1 << layout_helper_log2_element_size(layout_helper()));
 255   st->cr();
 256 #endif //PRODUCT
 257 }
 258 
 259 #ifndef PRODUCT
 260 void ValueArrayKlass::oop_print_on(oop obj, outputStream* st) {
 261   ArrayKlass::oop_print_on(obj, st);
 262   valueArrayOop va = valueArrayOop(obj);

 263   int print_len = MIN2((intx) va->length(), MaxElementPrintSize);
 264   for(int index = 0; index < print_len; index++) {
 265     st->print(" - %3d : ", index);
 266     CMH("CMH: helper method for valueOop/valorind printing")
 267     st->print(" CMH: helper method for valueOop/valorind printing");

 268     st->cr();
 269   }
 270   int remaining = va->length() - print_len;
 271   if (remaining > 0) {
 272     st->print_cr(" - <%d more elements, increase MaxElementPrintSize to print>", remaining);
 273   }
 274 }
 275 #endif //PRODUCT
 276 


  72   assert(ValueArrayFlatten, "Flatten array not allowed");
  73   assert(ValueKlass::cast(element_klass())->is_atomic() || (!ValueArrayAtomicAccess), "Atomic by-default");
  74 
  75   ClassLoaderData* loader_data = element_klass->class_loader_data();
  76   int size = ArrayKlass::static_size(ValueArrayKlass::header_size());
  77   ValueArrayKlass* vak = new (loader_data, size, THREAD) ValueArrayKlass(element_klass, name);
  78   if (vak == NULL) {
  79     return NULL;
  80   }
  81   loader_data->add_class(vak);
  82   complete_create_array_klass(vak, vak->super(), CHECK_NULL);
  83   return vak;
  84 }
  85 
  86 ValueArrayKlass* ValueArrayKlass::allocate_klass(KlassHandle element_klass, TRAPS) {
  87   Symbol* name = ArrayKlass::create_element_klass_array_name(element_klass, CHECK_NULL);
  88   return allocate_klass(element_klass, name, THREAD);
  89 }
  90 
  91 // Oops allocation...
  92 oop ValueArrayKlass::allocate(int length, bool do_zero, TRAPS) {


  93   CMH("this is virtually identical in all arrayKlasses, refactor")
  94   if (length < 0) {
  95     THROW_0(vmSymbols::java_lang_NegativeArraySizeException());
  96   }
  97   if (length > max_elements()) {
  98     report_java_out_of_memory("Requested array size exceeds VM limit");
  99     JvmtiExport::post_array_size_exhausted();
 100     THROW_OOP_0(Universe::out_of_memory_error_array_size());
 101   }
 102 
 103   size_t size = valueArrayOopDesc::object_size(layout_helper(), length);
 104   KlassHandle h_k(THREAD, this);


 105   if (do_zero) {
 106     return CollectedHeap::array_allocate(h_k, (int)size, length, CHECK_NULL);
 107   } else {
 108     return CollectedHeap::array_allocate_nozero(h_k, (int)size, length, CHECK_NULL);
 109   }

 110 }
 111 
 112 
 113 oop ValueArrayKlass::multi_allocate(int rank, jint* last_size, TRAPS) {
 114   // For valueArrays this is only called for the last dimension
 115   assert(rank == 1, "just checking");
 116   int length = *last_size;
 117   return allocate(length, true, THREAD);
 118 }
 119 
 120 jint ValueArrayKlass::array_layout_helper(ValueKlass* vk) {
 121   BasicType etype = T_VALUETYPE;
 122   int atag  = _lh_array_tag_type_value;
 123   int esize = upper_log2(vk->raw_value_byte_size());
 124   int hsize = arrayOopDesc::base_offset_in_bytes(etype);
 125 
 126   int lh = (atag       << _lh_array_tag_shift)
 127     |      (1          << _lh_valuetype_bit)
 128     |      (hsize      << _lh_header_size_shift)
 129     |      ((int)etype << _lh_element_type_shift)
 130     |      ((esize)    << _lh_log2_element_size_shift);
 131 
 132 #ifdef DEBUG
 133   assert(lh < (int)_lh_neutral_value, "must look like an array layout");
 134   assert(layout_helper_is_array(lh), "correct kind");
 135   assert(layout_helper_is_valueArray(lh), "correct kind");
 136   assert(layout_helper_header_size(lh) == hsize, "correct decode");
 137   assert(layout_helper_element_type(lh) == etype, "correct decode");
 138   assert(layout_helper_is_typeArray(lh), "correct kind");
 139   assert(1 << layout_helper_log2_element_size(lh) == esize, "correct decode");
 140 #endif
 141   return lh;
 142 }
 143 
 144 int ValueArrayKlass::oop_size(oop obj) const {
 145   assert(obj->is_valueArray(),"must be a value array");
 146   valueArrayOop array = valueArrayOop(obj);
 147   return array->object_size();
 148 }
 149 
 150 jint ValueArrayKlass::max_elements() const {


 238   assert(!is_objArray_klass(), "Unimplemented");
 239 
 240   st->print("Value Type Array: ");
 241   Klass::print_on(st);
 242 
 243   st->print(" - element klass: ");
 244   element_klass()->print_value_on(st);
 245   st->cr();
 246 
 247   int elem_size = element_byte_size();
 248   st->print(" - element size %i ", elem_size);
 249   st->print("aligned layout size %i", 1 << layout_helper_log2_element_size(layout_helper()));
 250   st->cr();
 251 #endif //PRODUCT
 252 }
 253 
 254 #ifndef PRODUCT
 255 void ValueArrayKlass::oop_print_on(oop obj, outputStream* st) {
 256   ArrayKlass::oop_print_on(obj, st);
 257   valueArrayOop va = valueArrayOop(obj);
 258   ValueKlass* vk = element_klass();
 259   int print_len = MIN2((intx) va->length(), MaxElementPrintSize);
 260   for(int index = 0; index < print_len; index++) {
 261     st->print_cr(" - %d : ", index);
 262     oop obj = (oop) ((uintptr_t)va->value_at_addr(index, layout_helper()) - vk->first_field_offset());
 263     FieldPrinter print_field(st, obj);
 264     vk->do_nonstatic_fields(&print_field);
 265     st->cr();
 266   }
 267   int remaining = va->length() - print_len;
 268   if (remaining > 0) {
 269     st->print_cr(" - <%d more elements, increase MaxElementPrintSize to print>", remaining);
 270   }
 271 }
 272 #endif //PRODUCT
 273 
< prev index next >