< prev index next >

src/hotspot/share/oops/typeArrayKlass.cpp

Print this page

 58   // Add all classes to our internal class loader list here,
 59   // including classes in the bootstrap (null) class loader.
 60   // Do this step after creating the mirror so that if the
 61   // mirror creation fails, loaded_classes_do() doesn't find
 62   // an array class without a mirror.
 63   null_loader_data->add_class(ak);
 64   JFR_ONLY(ASSIGN_PRIMITIVE_CLASS_ID(ak);)
 65   return ak;
 66 }
 67 
 68 TypeArrayKlass* TypeArrayKlass::allocate(ClassLoaderData* loader_data, BasicType type, Symbol* name, TRAPS) {
 69   assert(TypeArrayKlass::header_size() <= InstanceKlass::header_size(),
 70       "array klasses must be same size as InstanceKlass");
 71 
 72   int size = ArrayKlass::static_size(TypeArrayKlass::header_size());
 73 
 74   return new (loader_data, size, THREAD) TypeArrayKlass(type, name);
 75 }
 76 
 77 u2 TypeArrayKlass::compute_modifier_flags() const {
 78   return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;



 79 }
 80 
 81 TypeArrayKlass::TypeArrayKlass(BasicType type, Symbol* name) : ArrayKlass(name, Kind) {
 82   set_layout_helper(array_layout_helper(type));
 83   assert(is_array_klass(), "sanity");
 84   assert(is_typeArray_klass(), "sanity");
 85 
 86   set_max_length(arrayOopDesc::max_array_length(type));
 87   assert(size() >= TypeArrayKlass::header_size(), "bad size");
 88 
 89   set_class_loader_data(ClassLoaderData::the_null_class_loader_data());
 90 }
 91 
 92 typeArrayOop TypeArrayKlass::allocate_common(int length, bool do_zero, TRAPS) {
 93   assert(log2_element_size() >= 0, "bad scale");
 94   check_array_allocation_length(length, max_length(), CHECK_NULL);
 95   size_t size = typeArrayOopDesc::object_size(layout_helper(), length);
 96   return (typeArrayOop)Universe::heap()->array_allocate(this, size, length,
 97                                                         do_zero, CHECK_NULL);
 98 }
 99 
100 oop TypeArrayKlass::multi_allocate(int rank, jint* last_size, TRAPS) {
101   // For typeArrays this is only called for the last dimension
102   assert(rank == 1, "just checking");
103   int length = *last_size;
104   return allocate(length, THREAD);
105 }
106 
107 
108 void TypeArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS) {
109   assert(s->is_typeArray(), "must be type array");
110 
111   // Check destination type.
112   if (!d->is_typeArray()) {
113     ResourceMark rm(THREAD);
114     stringStream ss;
115     if (d->is_objArray()) {
116       ss.print("arraycopy: type mismatch: can not copy %s[] into object array[]",
117                type2name_tab[ArrayKlass::cast(s->klass())->element_type()]);
118     } else {
119       ss.print("arraycopy: destination type %s is not an array", d->klass()->external_name());
120     }
121     THROW_MSG(vmSymbols::java_lang_ArrayStoreException(), ss.as_string());

 58   // Add all classes to our internal class loader list here,
 59   // including classes in the bootstrap (null) class loader.
 60   // Do this step after creating the mirror so that if the
 61   // mirror creation fails, loaded_classes_do() doesn't find
 62   // an array class without a mirror.
 63   null_loader_data->add_class(ak);
 64   JFR_ONLY(ASSIGN_PRIMITIVE_CLASS_ID(ak);)
 65   return ak;
 66 }
 67 
 68 TypeArrayKlass* TypeArrayKlass::allocate(ClassLoaderData* loader_data, BasicType type, Symbol* name, TRAPS) {
 69   assert(TypeArrayKlass::header_size() <= InstanceKlass::header_size(),
 70       "array klasses must be same size as InstanceKlass");
 71 
 72   int size = ArrayKlass::static_size(TypeArrayKlass::header_size());
 73 
 74   return new (loader_data, size, THREAD) TypeArrayKlass(type, name);
 75 }
 76 
 77 u2 TypeArrayKlass::compute_modifier_flags() const {
 78   u2 identity_flag = (Arguments::enable_preview()) ? JVM_ACC_IDENTITY : 0;
 79 
 80   return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC
 81                     | identity_flag;
 82 }
 83 
 84 TypeArrayKlass::TypeArrayKlass(BasicType type, Symbol* name) : ArrayKlass(name, Kind) {
 85   set_layout_helper(array_layout_helper(type));
 86   assert(is_array_klass(), "sanity");
 87   assert(is_typeArray_klass(), "sanity");
 88 
 89   set_max_length(arrayOopDesc::max_array_length(type));
 90   assert(size() >= TypeArrayKlass::header_size(), "bad size");
 91 
 92   set_class_loader_data(ClassLoaderData::the_null_class_loader_data());
 93 }
 94 
 95 typeArrayOop TypeArrayKlass::allocate_common(int length, bool do_zero, TRAPS) {
 96   assert(log2_element_size() >= 0, "bad scale");
 97   check_array_allocation_length(length, max_length(), CHECK_NULL);
 98   size_t size = typeArrayOopDesc::object_size(layout_helper(), length);
 99   return (typeArrayOop)Universe::heap()->array_allocate(this, size, length,
100                                                         do_zero, CHECK_NULL);
101 }
102 
103 oop TypeArrayKlass::multi_allocate(int rank, jint* last_size, TRAPS) {

104   assert(rank == 1, "just checking");
105   int length = *last_size;
106   return allocate(length, THREAD);
107 }
108 
109 
110 void TypeArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS) {
111   assert(s->is_typeArray(), "must be type array");
112 
113   // Check destination type.
114   if (!d->is_typeArray()) {
115     ResourceMark rm(THREAD);
116     stringStream ss;
117     if (d->is_objArray()) {
118       ss.print("arraycopy: type mismatch: can not copy %s[] into object array[]",
119                type2name_tab[ArrayKlass::cast(s->klass())->element_type()]);
120     } else {
121       ss.print("arraycopy: destination type %s is not an array", d->klass()->external_name());
122     }
123     THROW_MSG(vmSymbols::java_lang_ArrayStoreException(), ss.as_string());
< prev index next >