Mercurial > hg > truffle
comparison src/share/vm/oops/arrayOop.hpp @ 4137:04b9a2566eec
Merge with hsx23/hotspot.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Sat, 17 Dec 2011 21:40:27 +0100 |
parents | aa4c21b00f7f |
children | 3c648b9ad052 |
comparison
equal
deleted
inserted
replaced
3737:9dc19b7d89a3 | 4137:04b9a2566eec |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 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 | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
102 : typesize_in_bytes/HeapWordSize); | 102 : typesize_in_bytes/HeapWordSize); |
103 } | 103 } |
104 | 104 |
105 // Return the maximum length of an array of BasicType. The length can passed | 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 | 106 // to typeArrayOop::object_size(scale, length, header_size) without causing an |
107 // overflow. | 107 // overflow. We also need to make sure that this will not overflow a size_t on |
108 // 32 bit platforms when we convert it to a byte size. | |
108 static int32_t max_array_length(BasicType type) { | 109 static int32_t max_array_length(BasicType type) { |
109 assert(type >= 0 && type < T_CONFLICT, "wrong type"); | 110 assert(type >= 0 && type < T_CONFLICT, "wrong type"); |
110 assert(type2aelembytes(type) != 0, "wrong type"); | 111 assert(type2aelembytes(type) != 0, "wrong type"); |
111 const int bytes_per_element = type2aelembytes(type); | 112 |
112 if (bytes_per_element < HeapWordSize) { | 113 const size_t max_element_words_per_size_t = |
113 return max_jint; | 114 align_size_down((SIZE_MAX/HeapWordSize - header_size(type)), MinObjAlignment); |
115 const size_t max_elements_per_size_t = | |
116 HeapWordSize * max_element_words_per_size_t / type2aelembytes(type); | |
117 if ((size_t)max_jint < max_elements_per_size_t) { | |
118 // It should be ok to return max_jint here, but parts of the code | |
119 // (CollectedHeap, Klass::oop_oop_iterate(), and more) uses an int for | |
120 // passing around the size (in words) of an object. So, we need to avoid | |
121 // overflowing an int when we add the header. See CRs 4718400 and 7110613. | |
122 return align_size_down(max_jint - header_size(type), MinObjAlignment); | |
114 } | 123 } |
124 return (int32_t)max_elements_per_size_t; | |
125 } | |
115 | 126 |
116 const int32_t max_words = align_size_down(max_jint, MinObjAlignment); | 127 // for unit testing |
117 const int32_t max_element_words = max_words - header_size(type); | 128 #ifndef PRODUCT |
118 const int32_t words_per_element = bytes_per_element >> LogHeapWordSize; | 129 static bool check_max_length_overflow(BasicType type); |
119 return max_element_words / words_per_element; | 130 static int32_t old_max_array_length(BasicType type); |
120 } | 131 static bool test_max_array_length(); |
132 #endif | |
121 }; | 133 }; |
122 | 134 |
123 #endif // SHARE_VM_OOPS_ARRAYOOP_HPP | 135 #endif // SHARE_VM_OOPS_ARRAYOOP_HPP |