< prev index next >

src/hotspot/share/oops/markOop.hpp

Print this page

        

@@ -102,10 +102,15 @@
 
 class markWord {
  private:
   uintptr_t _value;
 
+  // Poison - prevent casts and pointer conversions.
+  // Use to_pointer and from_pointer instead.
+  template<typename T> operator T();
+  markWord(const volatile void*);
+
  public:
   explicit markWord(uintptr_t value) : _value(value) {}
 
   markWord() { /* uninitialized */}
 

@@ -113,10 +118,13 @@
   // destructable, copyable, and assignable.
 
   static markWord from_pointer(void* ptr) {
     return markWord((uintptr_t)ptr);
   }
+  void* to_pointer() const {
+    return (void*)_value;
+  }
 
   bool operator==(const markWord& other) const {
     return _value == other._value;
   }
   bool operator!=(const markWord& other) const {

@@ -125,10 +133,12 @@
 
   // Conversion
   uintptr_t value() const { return _value; }
 
   // Constants
+  static const uintptr_t zero     = 0;
+
   enum { age_bits                 = 4,
          lock_bits                = 2,
          biased_lock_bits         = 1,
          max_hash_bits            = BitsPerWord - age_bits - lock_bits - biased_lock_bits,
          hash_bits                = max_hash_bits > 31 ? 31 : max_hash_bits,

@@ -241,11 +251,11 @@
   // an existing stacklock.  0 indicates the markword is "BUSY".
   // Lockword mutators that use a LD...CAS idiom should always
   // check for and avoid overwriting a 0 value installed by some
   // other thread.  (They should spin or block instead.  The 0 value
   // is transient and *should* be short-lived).
-  static markWord INFLATING() { return markWord(0); }    // inflate-in-progress
+  static markWord INFLATING() { return markWord(zero); }    // inflate-in-progress
 
   // Should this header be preserved during GC?
   inline bool must_be_preserved(oop obj_containing_mark) const;
   inline bool must_be_preserved_with_bias(oop obj_containing_mark) const;
 
< prev index next >