< prev index next >

src/share/vm/oops/klass.hpp

Print this page

        

@@ -77,11 +77,11 @@
   //
   // For arrays, layout helper is a negative number, containing four
   // distinct bytes, as follows:
   //    MSB:[tag, hsz, ebt, log2(esz)]:LSB
   // where:
-  //    tag is 0x80 if the elements are oops, 0xC0 if non-oops
+  //    tag is 0x80 if the elements are oops, 0xC0 if non-oops, 0xA0 if value types
   //    hsz is array header size in bytes (i.e., offset of first element)
   //    ebt is the BasicType of the elements
   //    esz is the element size in bytes
   // This packed word is arranged so as to be quickly unpacked by the
   // various fast paths that use the various subfields.

@@ -314,17 +314,15 @@
     _lh_element_type_shift      = BitsPerByte*1,
     _lh_element_type_mask       = right_n_bits(BitsPerByte),  // shifted mask
     _lh_header_size_shift       = BitsPerByte*2,
     _lh_header_size_mask        = right_n_bits(BitsPerByte),  // shifted mask
 
-    // Additional array type bits
-    _lh_valuetype_bit         = 29, // maybe objArray or valueArrayOop
-
-    _lh_array_tag_bits            = 2,
+    _lh_array_tag_bits            = 3,
     _lh_array_tag_shift           = BitsPerInt - _lh_array_tag_bits,
-    _lh_array_tag_type_value      = ~0x00,  // 0xC0000000 >> 30
-    _lh_array_tag_obj_value       = ~0x01   // 0x80000000 >> 30
+    _lh_array_tag_type_value      = ~0x3,  // bits ~100 compare as int, ie. sign extended
+    _lh_array_tag_vt_value        = ~0x2,  // bits ~101
+    _lh_array_tag_obj_value       = ~0x1,  // bits ~110
   };
 
   static int layout_helper_size_in_bytes(jint lh) {
     assert(lh > (jint)_lh_neutral_value, "must be instance");
     return (int) lh & ~_lh_instance_slow_path_bit;

@@ -344,11 +342,11 @@
   }
   static bool layout_helper_is_objArray(jint lh) {
     return _lh_array_tag_obj_value == (lh >> _lh_array_tag_shift);
   }
   static bool layout_helper_is_valueArray(jint lh) {
-    return (lh >> _lh_valuetype_bit) & 1;
+    return _lh_array_tag_vt_value == (lh >> _lh_array_tag_shift);
   }
   static int layout_helper_header_size(jint lh) {
     assert(lh < (jint)_lh_neutral_value, "must be array");
     int hsize = (lh >> _lh_header_size_shift) & _lh_header_size_mask;
     assert(hsize > 0 && hsize < (int)sizeof(oopDesc)*3, "sanity");
< prev index next >