< prev index next >
src/share/vm/memory/iterator.hpp
Print this page
*** 59,69 ****
// If the do_metadata functions return "true",
// we invoke the following when running oop_iterate():
//
// 1) do_klass on the header klass pointer.
// 2) do_klass on the klass pointer in the mirrors.
! // 3) do_class_loader_data on the class loader data in class loaders.
//
// The virtual (without suffix) and the non-virtual (with _nv suffix) need
// to be updated together, or else the devirtualization will break.
//
// Providing default implementations of the _nv functions unfortunately
--- 59,69 ----
// If the do_metadata functions return "true",
// we invoke the following when running oop_iterate():
//
// 1) do_klass on the header klass pointer.
// 2) do_klass on the klass pointer in the mirrors.
! // 3) do_cld on the class loader data in class loaders.
//
// The virtual (without suffix) and the non-virtual (with _nv suffix) need
// to be updated together, or else the devirtualization will break.
//
// Providing default implementations of the _nv functions unfortunately
*** 75,85 ****
bool do_metadata_nv() { return false; }
virtual void do_klass(Klass* k) { do_klass_nv(k); }
void do_klass_nv(Klass* k) { ShouldNotReachHere(); }
! virtual void do_class_loader_data(ClassLoaderData* cld) { ShouldNotReachHere(); }
// True iff this closure may be safely applied more than once to an oop
// location without an intervening "major reset" (like the end of a GC).
virtual bool idempotent() { return false; }
virtual bool apply_to_weak_ref_discovered_field() { return false; }
--- 75,86 ----
bool do_metadata_nv() { return false; }
virtual void do_klass(Klass* k) { do_klass_nv(k); }
void do_klass_nv(Klass* k) { ShouldNotReachHere(); }
! virtual void do_cld(ClassLoaderData* cld) { do_cld_nv(cld); }
! void do_cld_nv(ClassLoaderData* cld) { ShouldNotReachHere(); }
// True iff this closure may be safely applied more than once to an oop
// location without an intervening "major reset" (like the end of a GC).
virtual bool idempotent() { return false; }
virtual bool apply_to_weak_ref_discovered_field() { return false; }
*** 184,194 ****
inline bool do_metadata_nv() { return true; }
virtual void do_klass(Klass* k);
void do_klass_nv(Klass* k);
! virtual void do_class_loader_data(ClassLoaderData* cld);
};
// ObjectClosure is used for iterating through an object space
class ObjectClosure : public Closure {
--- 185,196 ----
inline bool do_metadata_nv() { return true; }
virtual void do_klass(Klass* k);
void do_klass_nv(Klass* k);
! virtual void do_cld(ClassLoaderData* cld) { do_cld_nv(cld); }
! void do_cld_nv(ClassLoaderData* cld);
};
// ObjectClosure is used for iterating through an object space
class ObjectClosure : public Closure {
*** 368,384 ****
--- 370,388 ----
// Dispatches to the non-virtual functions.
template <> class Devirtualizer<true> {
public:
template <class OopClosureType, typename T> static void do_oop(OopClosureType* closure, T* p);
template <class OopClosureType> static void do_klass(OopClosureType* closure, Klass* k);
+ template <class OopClosureType> static void do_cld(OopClosureType* closure, ClassLoaderData* cld);
template <class OopClosureType> static bool do_metadata(OopClosureType* closure);
};
// Dispatches to the virtual functions.
template <> class Devirtualizer<false> {
public:
template <class OopClosureType, typename T> static void do_oop(OopClosureType* closure, T* p);
template <class OopClosureType> static void do_klass(OopClosureType* closure, Klass* k);
+ template <class OopClosureType> static void do_cld(OopClosureType* closure, ClassLoaderData* cld);
template <class OopClosureType> static bool do_metadata(OopClosureType* closure);
};
#endif // SHARE_VM_MEMORY_ITERATOR_HPP
< prev index next >