< prev index next >

src/share/vm/runtime/jfieldIDWorkaround.hpp

Print this page

        

@@ -36,37 +36,40 @@
   //
   // Another low-order bit is used to mark if an instance field
   // is accompanied by an indication of which class it applies to.
   //
   // Bit-format of a jfieldID (most significant first):
-  //  address:30        instance=0:1 checked=0:1
-  //  offset:30         instance=1:1 checked=0:1
-  //  klass:23 offset:7 instance=1:1 checked=1:1
+  //  address:29        final=0:1 instance=0:1 checked=0:1
+  //  offset:29         final=0:1 instance=1:1 checked=0:1
+  //  klass:22 offset:7 final=1:1 instance=1:1 checked=1:1
   //
   // If the offset does not fit in 7 bits, or if the fieldID is
   // not checked, then the checked bit is zero and the rest of
   // the word (30 bits) contains only the offset.
   //
- private:
+public:
   enum {
     checked_bits           = 1,
     instance_bits          = 1,
-    address_bits           = BitsPerWord - checked_bits - instance_bits,
+    final_bits             = 1,
+    address_bits           = BitsPerWord - checked_bits - instance_bits - final_bits,
 
     large_offset_bits      = address_bits,  // unioned with address
     small_offset_bits      = 7,
     klass_bits             = address_bits - small_offset_bits,
 
     checked_shift          = 0,
     instance_shift         = checked_shift  + checked_bits,
-    address_shift          = instance_shift + instance_bits,
+    final_shift            = instance_shift + instance_bits,
+    address_shift          = final_shift    + final_bits,
 
     offset_shift           = address_shift,  // unioned with address
     klass_shift            = offset_shift + small_offset_bits,
 
     checked_mask_in_place  = right_n_bits(checked_bits)  << checked_shift,
     instance_mask_in_place = right_n_bits(instance_bits) << instance_shift,
+    final_mask_in_place    = right_n_bits(final_bits)    << final_shift,
 #ifndef _WIN64
     large_offset_mask      = right_n_bits(large_offset_bits),
     small_offset_mask      = right_n_bits(small_offset_bits),
     klass_mask             = right_n_bits(klass_bits)
 #endif

@@ -76,11 +79,11 @@
     // These values are too big for Win64
     const static uintptr_t large_offset_mask = right_n_bits(large_offset_bits);
     const static uintptr_t small_offset_mask = right_n_bits(small_offset_bits);
     const static uintptr_t klass_mask        = right_n_bits(klass_bits);
 #endif
-
+ private:
   // helper routines:
   static bool is_checked_jfieldID(jfieldID id) {
     uintptr_t as_uint = (uintptr_t) id;
     return ((as_uint & checked_mask_in_place) != 0);
   }

@@ -96,21 +99,26 @@
   static void  verify_instance_jfieldID(Klass* k, jfieldID id);
 
  public:
   static bool is_valid_jfieldID(Klass* k, jfieldID id);
 
-  static bool is_instance_jfieldID(Klass* k, jfieldID id) {
+  static bool is_instance_jfieldID(jfieldID id) {
     uintptr_t as_uint = (uintptr_t) id;
     return ((as_uint & instance_mask_in_place) != 0);
   }
   static bool is_static_jfieldID(jfieldID id) {
     uintptr_t as_uint = (uintptr_t) id;
     return ((as_uint & instance_mask_in_place) == 0);
   }
+  static bool is_final_jfieldID(jfieldID id) {
+    uintptr_t as_uint = (uintptr_t) id;
+    return ((as_uint & final_mask_in_place) != 0);
+  }
 
-  static jfieldID to_instance_jfieldID(Klass* k, int offset) {
+  static jfieldID to_instance_jfieldID(Klass* k, int offset, bool is_final) {
     intptr_t as_uint = ((offset & large_offset_mask) << offset_shift) | instance_mask_in_place;
+    if (is_final) as_uint |= final_mask_in_place;
     if (VerifyJNIFields) {
       as_uint |= encode_klass_hash(k, offset);
     }
     jfieldID result = (jfieldID) as_uint;
 #ifndef ASSERT

@@ -148,17 +156,17 @@
     JNIid* result = (JNIid*) id;
     assert(result->is_static_field_id(), "to_JNIid, but not static field id");
     return result;
   }
 
-  static jfieldID to_jfieldID(instanceKlassHandle k, int offset, bool is_static) {
+  static jfieldID to_jfieldID(instanceKlassHandle k, int offset, bool is_static, bool is_final) {
     if (is_static) {
       JNIid *id = k->jni_id_for(offset);
       debug_only(id->set_is_static_field_id());
       return jfieldIDWorkaround::to_static_jfieldID(id);
     } else {
-      return jfieldIDWorkaround::to_instance_jfieldID(k(), offset);
+      return jfieldIDWorkaround::to_instance_jfieldID(k(), offset, is_final);
     }
   }
 };
 
 #endif // SHARE_VM_RUNTIME_JFIELDIDWORKAROUND_HPP
< prev index next >