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. |