< prev index next >
src/share/vm/oops/oop.hpp
Print this page
rev 7183 : autospecialized oop_iterate using SFINAE and templates
@@ -25,14 +25,15 @@
#ifndef SHARE_VM_OOPS_OOP_HPP
#define SHARE_VM_OOPS_OOP_HPP
#include "memory/iterator.hpp"
#include "memory/memRegion.hpp"
-#include "memory/specialized_oop_closures.hpp"
+#include "memory/specialized_oop_closures.inline.hpp"
#include "oops/metadata.hpp"
#include "utilities/macros.hpp"
#include "utilities/top.hpp"
+#include "utilities/templateIdioms.hpp"
// oopDesc is the top baseclass for objects classes. The {name}Desc classes describe
// the format of Java objects so the fields can be accessed from C++.
// oopDesc is abstract.
// (see oopHierarchy for complete oop class hierarchy)
@@ -334,11 +335,34 @@
// Fast access to barrier set
static BarrierSet* bs() { return _bs; }
static void set_bs(BarrierSet* bs) { _bs = bs; }
+private:
+ // Dispatch member functions to oop closures
+
+ template <class OopClosureType>
+ typename enable_if<is_kind_of<ExtendedOopClosure, OopClosureType>::value, void>::type
+ do_metadata_if_applicable(OopClosureType *cl);
+
+ template <class OopClosureType>
+ typename enable_if<!is_kind_of<ExtendedOopClosure, OopClosureType>::value, void>::type
+ do_metadata_if_applicable(OopClosureType *cl);
+
+ template <class OopClosureType>
+ int oop_iterate_dispatch_tag(OopClosureType *blk, DispatchTag tag);
+
+ template <class OopClosureType>
+ int oop_iterate_internal(OopClosureType *blk);
+
+public:
+ template <class OopClosureType>
+ typename enable_if<is_kind_of<ExtendedOopClosure, OopClosureType>::value, int>::type
+ oop_iterate(OopClosureType *blk);
+
// iterators, returns size of object
+
#define OOP_ITERATE_DECL(OopClosureType, nv_suffix) \
int oop_iterate(OopClosureType* blk); \
int oop_iterate(OopClosureType* blk, MemRegion mr); // Only in mr.
ALL_OOP_OOP_ITERATE_CLOSURES_1(OOP_ITERATE_DECL)
@@ -351,11 +375,14 @@
ALL_OOP_OOP_ITERATE_CLOSURES_1(OOP_ITERATE_BACKWARDS_DECL)
ALL_OOP_OOP_ITERATE_CLOSURES_2(OOP_ITERATE_BACKWARDS_DECL)
#endif
- int oop_iterate_no_header(OopClosure* bk);
+ template <class OopClosureType>
+ typename enable_if<is_kind_of<OopClosure, OopClosureType>::value, int>::type
+ oop_iterate_no_header(OopClosureType* bk);
+
int oop_iterate_no_header(OopClosure* bk, MemRegion mr);
// identity hash; returns the identity hash key (computes it if necessary)
// NOTE with the introduction of UseBiasedLocking that identity_hash() might reach a
// safepoint if called on a biased object. Calling code must be aware of that.
< prev index next >