1 /*
2 * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 // arrayOopDesc is the abstract baseclass for all arrays. It doesn't
26 // declare pure virtual to enforce this because that would allocate a vtbl
27 // in each instance, which we don't want.
28
29 // The layout of array Oops is:
30 //
31 // markOop
32 // klassOop // 32 bits if compressed but declared 64 in LP64.
33 // length // shares klass memory or allocated after declared fields.
34
35
36 class arrayOopDesc : public oopDesc {
37 friend class VMStructs;
38
39 // Interpreter/Compiler offsets
40
41 // Header size computation.
42 // The header is considered the oop part of this type plus the length.
43 // Returns the aligned header_size_in_bytes. This is not equivalent to
44 // sizeof(arrayOopDesc) which should not appear in the code.
96 : typesize_in_bytes/HeapWordSize);
97 }
98
99 // Return the maximum length of an array of BasicType. The length can passed
100 // to typeArrayOop::object_size(scale, length, header_size) without causing an
101 // overflow.
102 static int32_t max_array_length(BasicType type) {
103 assert(type >= 0 && type < T_CONFLICT, "wrong type");
104 assert(type2aelembytes(type) != 0, "wrong type");
105 const int bytes_per_element = type2aelembytes(type);
106 if (bytes_per_element < HeapWordSize) {
107 return max_jint;
108 }
109
110 const int32_t max_words = align_size_down(max_jint, MinObjAlignment);
111 const int32_t max_element_words = max_words - header_size(type);
112 const int32_t words_per_element = bytes_per_element >> LogHeapWordSize;
113 return max_element_words / words_per_element;
114 }
115 };
|
1 /*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_VM_OOPS_ARRAYOOP_HPP
26 #define SHARE_VM_OOPS_ARRAYOOP_HPP
27
28 #include "memory/universe.inline.hpp"
29 #include "oops/oop.hpp"
30
31 // arrayOopDesc is the abstract baseclass for all arrays. It doesn't
32 // declare pure virtual to enforce this because that would allocate a vtbl
33 // in each instance, which we don't want.
34
35 // The layout of array Oops is:
36 //
37 // markOop
38 // klassOop // 32 bits if compressed but declared 64 in LP64.
39 // length // shares klass memory or allocated after declared fields.
40
41
42 class arrayOopDesc : public oopDesc {
43 friend class VMStructs;
44
45 // Interpreter/Compiler offsets
46
47 // Header size computation.
48 // The header is considered the oop part of this type plus the length.
49 // Returns the aligned header_size_in_bytes. This is not equivalent to
50 // sizeof(arrayOopDesc) which should not appear in the code.
102 : typesize_in_bytes/HeapWordSize);
103 }
104
105 // Return the maximum length of an array of BasicType. The length can passed
106 // to typeArrayOop::object_size(scale, length, header_size) without causing an
107 // overflow.
108 static int32_t max_array_length(BasicType type) {
109 assert(type >= 0 && type < T_CONFLICT, "wrong type");
110 assert(type2aelembytes(type) != 0, "wrong type");
111 const int bytes_per_element = type2aelembytes(type);
112 if (bytes_per_element < HeapWordSize) {
113 return max_jint;
114 }
115
116 const int32_t max_words = align_size_down(max_jint, MinObjAlignment);
117 const int32_t max_element_words = max_words - header_size(type);
118 const int32_t words_per_element = bytes_per_element >> LogHeapWordSize;
119 return max_element_words / words_per_element;
120 }
121 };
122
123 #endif // SHARE_VM_OOPS_ARRAYOOP_HPP
|