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