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_OBJARRAYKLASS_INLINE_HPP
26 #define SHARE_VM_OOPS_OBJARRAYKLASS_INLINE_HPP
27
28 #include "memory/memRegion.hpp"
29 #include "memory/iterator.inline.hpp"
30 #include "oops/objArrayKlass.hpp"
31 #include "oops/objArrayOop.inline.hpp"
32 #include "oops/oop.inline.hpp"
33 #include "utilities/macros.hpp"
34
35 template <bool nv, typename T, class OopClosureType>
36 void ObjArrayKlass::oop_oop_iterate_elements_specialized(objArrayOop a, OopClosureType* closure) {
37 T* p = (T*)a->base();
38 T* const end = p + a->length();
39
40 for (;p < end; p++) {
41 Devirtualizer<nv>::do_oop(closure, p);
42 }
43 }
44
45 template <bool nv, typename T, class OopClosureType>
46 void ObjArrayKlass::oop_oop_iterate_elements_specialized_bounded(
47 objArrayOop a, OopClosureType* closure, void* low, void* high) {
48
49 T* const l = (T*)low;
132 // Like oop_oop_iterate but only iterates over a specified range and only used
133 // for objArrayOops.
134 template <bool nv, class OopClosureType>
135 int ObjArrayKlass::oop_oop_iterate_range(oop obj, OopClosureType* closure, int start, int end) {
136 assert(obj->is_array(), "obj must be array");
137 objArrayOop a = objArrayOop(obj);
138
139 // Get size before changing pointers.
140 // Don't call size() or oop_size() since that is a virtual call
141 int size = a->object_size();
142
143 if (UseCompressedOops) {
144 oop_oop_iterate_range_specialized<nv, narrowOop>(a, closure, start, end);
145 } else {
146 oop_oop_iterate_range_specialized<nv, oop>(a, closure, start, end);
147 }
148
149 return size;
150 }
151
152
153 #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \
154 \
155 int ObjArrayKlass::oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure) { \
156 return oop_oop_iterate<nvs_to_bool(nv_suffix)>(obj, closure); \
157 }
158
159 #if INCLUDE_ALL_GCS
160 #define ObjArrayKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) \
161 int ObjArrayKlass::oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* closure) { \
162 /* No reverse implementation ATM. */ \
163 return oop_oop_iterate<nvs_to_bool(nv_suffix)>(obj, closure); \
164 }
165 #else
166 #define ObjArrayKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix)
167 #endif
168
169 #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix) \
170 \
171 int ObjArrayKlass::oop_oop_iterate##nv_suffix##_m(oop obj, OopClosureType* closure, MemRegion mr) { \
172 return oop_oop_iterate_bounded<nvs_to_bool(nv_suffix)>(obj, closure, mr); \
173 }
174
175 #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN_r(OopClosureType, nv_suffix) \
176 \
177 int ObjArrayKlass::oop_oop_iterate_range##nv_suffix(oop obj, OopClosureType* closure, int start, int end) { \
178 return oop_oop_iterate_range<nvs_to_bool(nv_suffix)>(obj, closure, start, end); \
179 }
180
181
182 #define ALL_OBJ_ARRAY_KLASS_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \
183 ObjArrayKlass_OOP_OOP_ITERATE_DEFN( OopClosureType, nv_suffix) \
184 ObjArrayKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) \
185 ObjArrayKlass_OOP_OOP_ITERATE_DEFN_m( OopClosureType, nv_suffix) \
186 ObjArrayKlass_OOP_OOP_ITERATE_DEFN_r( OopClosureType, nv_suffix)
187
188
189 #endif // SHARE_VM_OOPS_OBJARRAYKLASS_INLINE_HPP
|
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_OBJARRAYKLASS_INLINE_HPP
26 #define SHARE_VM_OOPS_OBJARRAYKLASS_INLINE_HPP
27
28 #include "memory/memRegion.hpp"
29 #include "memory/iterator.inline.hpp"
30 #include "oops/arrayKlass.hpp"
31 #include "oops/klass.hpp"
32 #include "oops/objArrayKlass.hpp"
33 #include "oops/objArrayOop.inline.hpp"
34 #include "oops/oop.inline.hpp"
35 #include "utilities/macros.hpp"
36
37 template <bool nv, typename T, class OopClosureType>
38 void ObjArrayKlass::oop_oop_iterate_elements_specialized(objArrayOop a, OopClosureType* closure) {
39 T* p = (T*)a->base();
40 T* const end = p + a->length();
41
42 for (;p < end; p++) {
43 Devirtualizer<nv>::do_oop(closure, p);
44 }
45 }
46
47 template <bool nv, typename T, class OopClosureType>
48 void ObjArrayKlass::oop_oop_iterate_elements_specialized_bounded(
49 objArrayOop a, OopClosureType* closure, void* low, void* high) {
50
51 T* const l = (T*)low;
134 // Like oop_oop_iterate but only iterates over a specified range and only used
135 // for objArrayOops.
136 template <bool nv, class OopClosureType>
137 int ObjArrayKlass::oop_oop_iterate_range(oop obj, OopClosureType* closure, int start, int end) {
138 assert(obj->is_array(), "obj must be array");
139 objArrayOop a = objArrayOop(obj);
140
141 // Get size before changing pointers.
142 // Don't call size() or oop_size() since that is a virtual call
143 int size = a->object_size();
144
145 if (UseCompressedOops) {
146 oop_oop_iterate_range_specialized<nv, narrowOop>(a, closure, start, end);
147 } else {
148 oop_oop_iterate_range_specialized<nv, oop>(a, closure, start, end);
149 }
150
151 return size;
152 }
153
154 #define ALL_OBJ_ARRAY_KLASS_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \
155 OOP_OOP_ITERATE_DEFN( ObjArrayKlass, OopClosureType, nv_suffix) \
156 OOP_OOP_ITERATE_DEFN_BOUNDED( ObjArrayKlass, OopClosureType, nv_suffix) \
157 OOP_OOP_ITERATE_DEFN_RANGE( ObjArrayKlass, OopClosureType, nv_suffix) \
158 OOP_OOP_ITERATE_DEFN_NO_BACKWARDS(ObjArrayKlass, OopClosureType, nv_suffix)
159
160 #endif // SHARE_VM_OOPS_OBJARRAYKLASS_INLINE_HPP
|