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