< prev index next >

src/hotspot/share/oops/arrayOop.hpp

Print this page

        

*** 42,52 **** class arrayOopDesc : public oopDesc { friend class VMStructs; friend class arrayOopDescTest; // Interpreter/Compiler offsets ! // Header size computation. // The header is considered the oop part of this type plus the length. // Returns the aligned header_size_in_bytes. This is not equivalent to // sizeof(arrayOopDesc) which should not appear in the code. static int header_size_in_bytes() { --- 42,52 ---- class arrayOopDesc : public oopDesc { friend class VMStructs; friend class arrayOopDescTest; // Interpreter/Compiler offsets ! protected: // Header size computation. // The header is considered the oop part of this type plus the length. // Returns the aligned header_size_in_bytes. This is not equivalent to // sizeof(arrayOopDesc) which should not appear in the code. static int header_size_in_bytes() {
*** 63,73 **** // Check whether an element of a typeArrayOop with the given type must be // aligned 0 mod 8. The typeArrayOop itself must be aligned at least this // strongly. static bool element_type_should_be_aligned(BasicType type) { ! return type == T_DOUBLE || type == T_LONG; } public: // The _length field is not declared in C++. It is allocated after the // declared nonstatic fields in arrayOopDesc if not compressed, otherwise --- 63,73 ---- // Check whether an element of a typeArrayOop with the given type must be // aligned 0 mod 8. The typeArrayOop itself must be aligned at least this // strongly. static bool element_type_should_be_aligned(BasicType type) { ! return type == T_DOUBLE || type == T_LONG || type == T_VALUETYPE; } public: // The _length field is not declared in C++. It is allocated after the // declared nonstatic fields in arrayOopDesc if not compressed, otherwise
*** 123,132 **** --- 123,147 ---- return (int)(element_type_should_be_aligned(type) ? align_object_offset(typesize_in_bytes/HeapWordSize) : typesize_in_bytes/HeapWordSize); } + static int32_t max_array_length(int header_size, int elembytes) { + const size_t max_element_words_per_size_t = + align_down((SIZE_MAX/HeapWordSize - header_size), MinObjAlignment); + const size_t max_elements_per_size_t = + HeapWordSize * max_element_words_per_size_t / elembytes; + if ((size_t)max_jint < max_elements_per_size_t) { + // It should be ok to return max_jint here, but parts of the code + // (CollectedHeap, Klass::oop_oop_iterate(), and more) uses an int for + // passing around the size (in words) of an object. So, we need to avoid + // overflowing an int when we add the header. See CRs 4718400 and 7110613. + return align_down(max_jint - header_size, MinObjAlignment); + } + return (int32_t)max_elements_per_size_t; + } + // Return the maximum length of an array of BasicType. The length can passed // to typeArrayOop::object_size(scale, length, header_size) without causing an // overflow. We also need to make sure that this will not overflow a size_t on // 32 bit platforms when we convert it to a byte size. static int32_t max_array_length(BasicType type) {
< prev index next >