< prev index next >
src/hotspot/share/oops/arrayOop.hpp
Print this page
@@ -43,11 +43,11 @@
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() {
@@ -64,11 +64,11 @@
// 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;
+ 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
@@ -124,10 +124,25 @@
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 >