hotspot/src/share/vm/prims/unsafe.cpp
changeset 38060 954c9575f653
parent 38014 8731fa11f766
parent 37480 291ee208fb72
child 38211 fe30fdab0f62
equal deleted inserted replaced
38059:86ab3f0a9f87 38060:954c9575f653
   131 }
   131 }
   132 
   132 
   133 
   133 
   134 ///// Data in the Java heap.
   134 ///// Data in the Java heap.
   135 
   135 
       
   136 #define truncate_jboolean(x) ((x) & 1)
       
   137 #define truncate_jbyte(x) (x)
       
   138 #define truncate_jshort(x) (x)
       
   139 #define truncate_jchar(x) (x)
       
   140 #define truncate_jint(x) (x)
       
   141 #define truncate_jlong(x) (x)
       
   142 #define truncate_jfloat(x) (x)
       
   143 #define truncate_jdouble(x) (x)
       
   144 
   136 #define GET_FIELD(obj, offset, type_name, v) \
   145 #define GET_FIELD(obj, offset, type_name, v) \
   137   oop p = JNIHandles::resolve(obj); \
   146   oop p = JNIHandles::resolve(obj); \
   138   type_name v = *(type_name*)index_oop_from_field_offset_long(p, offset)
   147   type_name v = *(type_name*)index_oop_from_field_offset_long(p, offset)
   139 
   148 
   140 #define SET_FIELD(obj, offset, type_name, x) \
   149 #define SET_FIELD(obj, offset, type_name, x) \
   141   oop p = JNIHandles::resolve(obj); \
   150   oop p = JNIHandles::resolve(obj); \
   142   *(type_name*)index_oop_from_field_offset_long(p, offset) = x
   151   *(type_name*)index_oop_from_field_offset_long(p, offset) = truncate_##type_name(x)
   143 
   152 
   144 #define GET_FIELD_VOLATILE(obj, offset, type_name, v) \
   153 #define GET_FIELD_VOLATILE(obj, offset, type_name, v) \
   145   oop p = JNIHandles::resolve(obj); \
   154   oop p = JNIHandles::resolve(obj); \
   146   if (support_IRIW_for_not_multiple_copy_atomic_cpu) { \
   155   if (support_IRIW_for_not_multiple_copy_atomic_cpu) { \
   147     OrderAccess::fence(); \
   156     OrderAccess::fence(); \
   148   } \
   157   } \
   149   volatile type_name v = OrderAccess::load_acquire((volatile type_name*)index_oop_from_field_offset_long(p, offset));
   158   volatile type_name v = OrderAccess::load_acquire((volatile type_name*)index_oop_from_field_offset_long(p, offset));
   150 
   159 
   151 #define SET_FIELD_VOLATILE(obj, offset, type_name, x) \
   160 #define SET_FIELD_VOLATILE(obj, offset, type_name, x) \
   152   oop p = JNIHandles::resolve(obj); \
   161   oop p = JNIHandles::resolve(obj); \
   153   OrderAccess::release_store_fence((volatile type_name*)index_oop_from_field_offset_long(p, offset), x);
   162   OrderAccess::release_store_fence((volatile type_name*)index_oop_from_field_offset_long(p, offset), truncate_##type_name(x));
   154 
   163 
   155 
   164 
   156 // Get/SetObject must be special-cased, since it works with handles.
   165 // Get/SetObject must be special-cased, since it works with handles.
   157 
   166 
   158 // These functions allow a null base pointer with an arbitrary address.
   167 // These functions allow a null base pointer with an arbitrary address.