< prev index next >

src/hotspot/share/oops/fieldInfo.hpp

Print this page

        

@@ -43,24 +43,29 @@
  public:
   // fields
   // Field info extracted from the class file and stored
   // as an array of 6 shorts.
 
-#define FIELDINFO_TAG_SIZE             2
+#define FIELDINFO_TAG_SIZE             3
 #define FIELDINFO_TAG_BLANK            0
 #define FIELDINFO_TAG_OFFSET           1
 #define FIELDINFO_TAG_TYPE_PLAIN       2
 #define FIELDINFO_TAG_TYPE_CONTENDED   3
-#define FIELDINFO_TAG_MASK             3
+#define FIELDINFO_TAG_TYPE_MASK        3
+#define FIELDINFO_TAG_MASK             7
+#define FIELDINFO_TAG_FLATTENED        4
 
   // Packed field has the tag, and can be either of:
   //    hi bits <--------------------------- lo bits
   //   |---------high---------|---------low---------|
   //    ..........................................00  - blank
-  //    [------------------offset----------------]01  - real field offset
-  //    ......................[-------type-------]10  - plain field with type
-  //    [--contention_group--][-------type-------]11  - contended field with type and contention group
+  //    [------------------offset---------------]F01  - real field offset
+  //    ......................[-------type------]F10  - plain field with type
+  //    [--contention_group--][-------type------]F11  - contended field with type and contention group
+  //
+  // Bit F indicates if the field has been flattened (F=1) or nor (F=0)
+
   enum FieldOffset {
     access_flags_offset      = 0,
     name_index_offset        = 1,
     signature_index_offset   = 2,
     initval_index_offset     = 3,

@@ -101,11 +106,11 @@
   }
 
   u2 access_flags() const                        { return _shorts[access_flags_offset];            }
   u4 offset() const {
     u2 lo = _shorts[low_packed_offset];
-    switch(lo & FIELDINFO_TAG_MASK) {
+    switch(lo & FIELDINFO_TAG_TYPE_MASK) {
       case FIELDINFO_TAG_OFFSET:
         return build_int_from_shorts(_shorts[low_packed_offset], _shorts[high_packed_offset]) >> FIELDINFO_TAG_SIZE;
 #ifndef PRODUCT
       case FIELDINFO_TAG_TYPE_PLAIN:
         fatal("Asking offset for the plain type field");

@@ -119,11 +124,11 @@
     return 0;
   }
 
   bool is_contended() const {
     u2 lo = _shorts[low_packed_offset];
-    switch(lo & FIELDINFO_TAG_MASK) {
+    switch(lo & FIELDINFO_TAG_TYPE_MASK) {
       case FIELDINFO_TAG_TYPE_PLAIN:
         return false;
       case FIELDINFO_TAG_TYPE_CONTENDED:
         return true;
 #ifndef PRODUCT

@@ -137,11 +142,11 @@
     return false;
   }
 
   u2 contended_group() const {
     u2 lo = _shorts[low_packed_offset];
-    switch(lo & FIELDINFO_TAG_MASK) {
+    switch(lo & FIELDINFO_TAG_TYPE_MASK) {
       case FIELDINFO_TAG_TYPE_PLAIN:
         return 0;
       case FIELDINFO_TAG_TYPE_CONTENDED:
         return _shorts[high_packed_offset];
 #ifndef PRODUCT

@@ -155,11 +160,11 @@
     return 0;
  }
 
   u2 allocation_type() const {
     u2 lo = _shorts[low_packed_offset];
-    switch(lo & FIELDINFO_TAG_MASK) {
+    switch(lo & FIELDINFO_TAG_TYPE_MASK) {
       case FIELDINFO_TAG_TYPE_PLAIN:
       case FIELDINFO_TAG_TYPE_CONTENDED:
         return (lo >> FIELDINFO_TAG_SIZE);
 #ifndef PRODUCT
       case FIELDINFO_TAG_OFFSET:

@@ -171,11 +176,11 @@
     ShouldNotReachHere();
     return 0;
   }
 
   bool is_offset_set() const {
-    return (_shorts[low_packed_offset] & FIELDINFO_TAG_MASK) == FIELDINFO_TAG_OFFSET;
+    return (_shorts[low_packed_offset] & FIELDINFO_TAG_TYPE_MASK) == FIELDINFO_TAG_OFFSET;
   }
 
   Symbol* name(const constantPoolHandle& cp) const {
     int index = name_index();
     if (is_internal()) {

@@ -193,21 +198,26 @@
   }
 
   void set_access_flags(u2 val)                  { _shorts[access_flags_offset] = val;             }
   void set_offset(u4 val)                        {
     val = val << FIELDINFO_TAG_SIZE; // make room for tag
+    bool flattened = is_flattened();
     _shorts[low_packed_offset] = extract_low_short_from_int(val) | FIELDINFO_TAG_OFFSET;
+    if (flattened) set_flattened(true);
     _shorts[high_packed_offset] = extract_high_short_from_int(val);
+    assert(is_flattened() || !flattened, "just checking");
   }
 
   void set_allocation_type(int type) {
+    bool b = is_flattened();
     u2 lo = _shorts[low_packed_offset];
-    switch(lo & FIELDINFO_TAG_MASK) {
+    switch(lo & FIELDINFO_TAG_TYPE_MASK) {
       case FIELDINFO_TAG_BLANK:
-        _shorts[low_packed_offset] = ((type << FIELDINFO_TAG_SIZE)) & 0xFFFF;
-        _shorts[low_packed_offset] &= ~FIELDINFO_TAG_MASK;
+        _shorts[low_packed_offset] |= ((type << FIELDINFO_TAG_SIZE)) & 0xFFFF;
+        _shorts[low_packed_offset] &= ~FIELDINFO_TAG_TYPE_MASK;
         _shorts[low_packed_offset] |= FIELDINFO_TAG_TYPE_PLAIN;
+        assert(is_flattened() || !b, "Just checking");
         return;
 #ifndef PRODUCT
       case FIELDINFO_TAG_TYPE_PLAIN:
       case FIELDINFO_TAG_TYPE_CONTENDED:
       case FIELDINFO_TAG_OFFSET:

@@ -215,13 +225,25 @@
 #endif
     }
     ShouldNotReachHere();
   }
 
+  void set_flattened(bool b) {
+    if (b) {
+      _shorts[low_packed_offset] |= FIELDINFO_TAG_FLATTENED;
+    } else {
+      _shorts[low_packed_offset] &= ~FIELDINFO_TAG_FLATTENED;
+    }
+  }
+
+  bool is_flattened() {
+    return (_shorts[low_packed_offset] & FIELDINFO_TAG_FLATTENED) != 0;
+  }
+
   void set_contended_group(u2 val) {
     u2 lo = _shorts[low_packed_offset];
-    switch(lo & FIELDINFO_TAG_MASK) {
+    switch(lo & FIELDINFO_TAG_TYPE_MASK) {
       case FIELDINFO_TAG_TYPE_PLAIN:
         _shorts[low_packed_offset] |= FIELDINFO_TAG_TYPE_CONTENDED;
         _shorts[high_packed_offset] = val;
         return;
 #ifndef PRODUCT

@@ -246,10 +268,14 @@
   void set_stable(bool z) {
     if (z) _shorts[access_flags_offset] |=  JVM_ACC_FIELD_STABLE;
     else   _shorts[access_flags_offset] &= ~JVM_ACC_FIELD_STABLE;
   }
 
+  bool is_flattenable() const {
+    return (access_flags() & JVM_ACC_FLATTENABLE) != 0;
+  }
+
   Symbol* lookup_symbol(int symbol_index) const {
     assert(is_internal(), "only internal fields");
     return vmSymbols::symbol_at((vmSymbols::SID)symbol_index);
   }
 };
< prev index next >