< prev index next >

src/hotspot/share/oops/oop.hpp

Print this page

        

@@ -26,20 +26,57 @@
 #define SHARE_OOPS_OOP_HPP
 
 #include "memory/iterator.hpp"
 #include "memory/memRegion.hpp"
 #include "oops/access.hpp"
+#include "oops/arrayStorageProperties.hpp"
 #include "oops/metadata.hpp"
 #include "runtime/atomic.hpp"
 #include "utilities/macros.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)
 //
 // no virtual functions allowed
+//
+// oopDesc::_mark - the "oop mark word" encoding to be found separately in markOop.hpp
+//
+// oopDesc::_metadata - encodes both the object's klass pointer and potentially
+//                      "storage properties" (currently confined to arrays in the form of
+//                      ArrayStorageProperties). Storage properties are peculiar to the
+//                      *instance*, and not necessarily the "type".
+//
+// The overall size of the _metadata field is dependent on "UseCompressedClassPointers",
+// hence the terms "narrow" (32 bits) vs "wide" (64 bits).
+//
+// "Wide" encoding of _metadata:
+// bit number          |63             0|
+// bit length          |--3|-----61-----|
+// --------------------------------------
+// _klass              [xxx| Klass*     ]
+// _wide_storage_props [ sp|            ]
+// --------------------------------------
+// with:
+//    xxx = klass_mask(), Klass* = Klass pointer to be masked
+//    sp = storage properties, bit number: wide_storage_props_shift
+//
+// "Narrow" encoding of _metadata:
+// bit number            |31             0|
+// bit length            |--3|-----29-----|
+// ----------------------------------------
+// _compressed_klass     [xxx| narrowKlass]
+// _narrow_storage_props [ sp|            ]
+// ----------------------------------------
+// with:
+//   xxx = compressed_klass_mask(), narrowKlass = compressed Klass pointer to be masked
+//         narrowKlass may be further decoded (Klass::decode_klass()) to produce Klass*
+//   sp = storage properties, bit number: narrow_storage_props_shift
+//
+// Storage properties encodings are current confined to arrayStorageProperties.hpp
+
 
 extern bool always_do_update_barrier;
 
 // Forward declarations.
 class OopClosure;

@@ -57,10 +94,12 @@
  private:
   volatile markOop _mark;
   union _metadata {
     Klass*      _klass;
     narrowKlass _compressed_klass;
+    uintptr_t   _wide_storage_props;
+    uint32_t   _narrow_storage_props;
   } _metadata;
 
  public:
   inline markOop  mark()          const;
   inline markOop  mark_raw()      const;

@@ -77,10 +116,21 @@
   // Used only to re-initialize the mark word (e.g., of promoted
   // objects during a GC) -- requires a valid klass pointer
   inline void init_mark();
   inline void init_mark_raw();
 
+  enum {
+    storage_props_nof_bits     = LogKlassAlignmentInBytes, // This alignment gives us some "free bits"
+    narrow_storage_props_shift = (sizeof(narrowKlass) << 3) - storage_props_nof_bits,
+    wide_storage_props_shift   = (sizeof(Klass*) << 3) - storage_props_nof_bits,
+  };
+
+  static inline narrowKlass compressed_klass_mask();
+  static inline narrowKlass compressed_klass_masked(narrowKlass raw);
+  static inline uintptr_t   klass_mask();
+  static inline Klass*      klass_masked(uintptr_t raw);
+
   inline Klass* klass() const;
   inline Klass* klass_or_null() const volatile;
   inline Klass* klass_or_null_acquire() const volatile;
   static inline Klass** klass_addr(HeapWord* mem);
   static inline narrowKlass* compressed_klass_addr(HeapWord* mem);

@@ -88,10 +138,17 @@
   inline narrowKlass* compressed_klass_addr();
 
   inline void set_klass(Klass* k);
   static inline void release_set_klass(HeapWord* mem, Klass* klass);
 
+  // Extra container metadata specific to arrays (encoded into high bits of _metadata)
+  static inline uintptr_t* wide_metadata_addr(HeapWord* mem);
+  inline ArrayStorageProperties array_storage_properties() const;
+  inline void set_metadata(ArrayStorageProperties storage_props, Klass* k);
+  static inline void release_set_metadata(HeapWord* mem, ArrayStorageProperties storage_props, Klass* klass);
+
+
   // For klass field compression
   inline int klass_gap() const;
   inline void set_klass_gap(int z);
   static inline void set_klass_gap(HeapWord* mem, int z);
   // For when the klass pointer is being used as a linked list "next" field.
< prev index next >