src/share/vm/oops/oop.inline2.hpp
Print this page
rev 6796 : [mq]: templateOopIterate
*** 34,39 ****
--- 34,91 ----
// We need a separate file to avoid circular references
inline bool oopDesc::is_scavengable() const {
return Universe::heap()->is_scavengable(this);
}
+
+ #ifdef ASSERT
+ template <class T> void assert_is_in(T *p) {
+ T heap_oop = oopDesc::load_heap_oop(p);
+ if (!oopDesc::is_null(heap_oop)) {
+ oop o = oopDesc::decode_heap_oop_not_null(heap_oop);
+ assert(Universe::heap()->is_in(o), "should be in heap");
+ }
+ }
+ template <class T> void assert_is_in_closed_subset(T *p) {
+ T heap_oop = oopDesc::load_heap_oop(p);
+ if (!oopDesc::is_null(heap_oop)) {
+ oop o = oopDesc::decode_heap_oop_not_null(heap_oop);
+ assert(Universe::heap()->is_in_closed_subset(o), "should be in closed");
+ }
+ }
+ template <class T> void assert_is_in_reserved(T *p) {
+ T heap_oop = oopDesc::load_heap_oop(p);
+ if (!oopDesc::is_null(heap_oop)) {
+ oop o = oopDesc::decode_heap_oop_not_null(heap_oop);
+ assert(Universe::heap()->is_in_reserved(o), "should be in reserved");
+ }
+ }
+ #endif // ASSERT
+
+ template <bool nv, typename OopClosureType>
+ class Devirtualizer {
+ public:
+ static bool do_metadata(OopClosureType* closure) { ShouldNotReachHere(); return false; }
+ static void do_klass(OopClosureType* closure, Klass* k) { ShouldNotReachHere(); }
+ template <typename T>
+ static void do_oop(OopClosureType* closure, T* p) { ShouldNotReachHere(); }
+ };
+
+ template <typename OopClosureType>
+ class Devirtualizer<true, OopClosureType> {
+ public:
+ static bool do_metadata(OopClosureType* closure) { return closure->do_metadata_nv(); }
+ static void do_klass(OopClosureType* closure, Klass* k) { closure->do_klass_nv(k); }
+ template <typename T>
+ static void do_oop(OopClosureType* closure, T* p) { closure->do_oop_nv(p); }
+ };
+
+ template <typename OopClosureType>
+ class Devirtualizer<false, OopClosureType> {
+ public:
+ static bool do_metadata(OopClosureType* closure) { return closure->do_metadata(); }
+ static void do_klass(OopClosureType* closure, Klass* k) { closure->do_klass(k); }
+ template <typename T>
+ static void do_oop(OopClosureType* closure, T* p) { closure->do_oop(p); }
+ };
+
#endif // SHARE_VM_OOPS_OOP_INLINE2_HPP