src/share/vm/oops/oop.inline2.hpp

Print this page
rev 6796 : [mq]: templateOopIterate

@@ -34,6 +34,58 @@
 // 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