109
110 inline jint invocation_key_from_method_slot(jint slot) {
111 return slot;
112 }
113
114 inline jint invocation_key_to_method_slot(jint key) {
115 return key;
116 }
117
118 inline void* index_oop_from_field_offset_long(oop p, jlong field_offset) {
119 jlong byte_offset = field_offset_to_byte_offset(field_offset);
120 #ifdef ASSERT
121 if (p != NULL) {
122 assert(byte_offset >= 0 && byte_offset <= (jlong)MAX_OBJECT_SIZE, "sane offset");
123 if (byte_offset == (jint)byte_offset) {
124 void* ptr_plus_disp = (address)p + byte_offset;
125 assert((void*)p->obj_field_addr<oop>((jint)byte_offset) == ptr_plus_disp,
126 "raw [ptr+disp] must be consistent with oop::field_base");
127 }
128 jlong p_size = HeapWordSize * (jlong)(p->size());
129 assert(byte_offset < p_size, err_msg("Unsafe access: offset " INT64_FORMAT " > object's size " INT64_FORMAT, byte_offset, p_size));
130 }
131 #endif
132 if (sizeof(char*) == sizeof(jint)) // (this constant folds!)
133 return (address)p + (jint) byte_offset;
134 else
135 return (address)p + byte_offset;
136 }
137
138 // Externally callable versions:
139 // (Use these in compiler intrinsics which emulate unsafe primitives.)
140 jlong Unsafe_field_offset_to_byte_offset(jlong field_offset) {
141 return field_offset;
142 }
143 jlong Unsafe_field_offset_from_byte_offset(jlong byte_offset) {
144 return byte_offset;
145 }
146 jint Unsafe_invocation_key_from_method_slot(jint slot) {
147 return invocation_key_from_method_slot(slot);
148 }
149 jint Unsafe_invocation_key_to_method_slot(jint key) {
|
109
110 inline jint invocation_key_from_method_slot(jint slot) {
111 return slot;
112 }
113
114 inline jint invocation_key_to_method_slot(jint key) {
115 return key;
116 }
117
118 inline void* index_oop_from_field_offset_long(oop p, jlong field_offset) {
119 jlong byte_offset = field_offset_to_byte_offset(field_offset);
120 #ifdef ASSERT
121 if (p != NULL) {
122 assert(byte_offset >= 0 && byte_offset <= (jlong)MAX_OBJECT_SIZE, "sane offset");
123 if (byte_offset == (jint)byte_offset) {
124 void* ptr_plus_disp = (address)p + byte_offset;
125 assert((void*)p->obj_field_addr<oop>((jint)byte_offset) == ptr_plus_disp,
126 "raw [ptr+disp] must be consistent with oop::field_base");
127 }
128 jlong p_size = HeapWordSize * (jlong)(p->size());
129 assert(byte_offset < p_size, "Unsafe access: offset " INT64_FORMAT " > object's size " INT64_FORMAT, byte_offset, p_size);
130 }
131 #endif
132 if (sizeof(char*) == sizeof(jint)) // (this constant folds!)
133 return (address)p + (jint) byte_offset;
134 else
135 return (address)p + byte_offset;
136 }
137
138 // Externally callable versions:
139 // (Use these in compiler intrinsics which emulate unsafe primitives.)
140 jlong Unsafe_field_offset_to_byte_offset(jlong field_offset) {
141 return field_offset;
142 }
143 jlong Unsafe_field_offset_from_byte_offset(jlong byte_offset) {
144 return byte_offset;
145 }
146 jint Unsafe_invocation_key_from_method_slot(jint slot) {
147 return invocation_key_from_method_slot(slot);
148 }
149 jint Unsafe_invocation_key_to_method_slot(jint key) {
|