Skip to content
This repository was archived by the owner on May 29, 2024. It is now read-only.

Commit 97b0336

Browse files
committed
Add templated field_addr implementation
1 parent be4d33a commit 97b0336

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

src/hotspot/share/jvmci/jvmciCompilerToVM.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2097,14 +2097,14 @@ static jobject read_field_value(Handle obj, long displacement, jchar type_char,
20972097
// folding Unsafe.get* methods with volatile semantics.
20982098

20992099
switch (basic_type) {
2100-
case T_BOOLEAN: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr<jboolean>(displacement)); break;
2101-
case T_BYTE: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr<jbyte>(displacement)); break;
2102-
case T_SHORT: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr<jshort>(displacement)); break;
2103-
case T_CHAR: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr<jchar>(displacement)); break;
2100+
case T_BOOLEAN: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr_of_type<jboolean>(displacement)); break;
2101+
case T_BYTE: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr_of_type<jbyte>(displacement)); break;
2102+
case T_SHORT: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr_of_type<jshort>(displacement)); break;
2103+
case T_CHAR: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr_of_type<jchar>(displacement)); break;
21042104
case T_FLOAT:
2105-
case T_INT: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr<jint>(displacement)); break;
2105+
case T_INT: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr_of_type<jint>(displacement)); break;
21062106
case T_DOUBLE:
2107-
case T_LONG: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr<jlong>(displacement)); break;
2107+
case T_LONG: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr_of_type<jlong>(displacement)); break;
21082108

21092109
case T_OBJECT: {
21102110
if (displacement == java_lang_Class::component_mirror_offset() && java_lang_Class::is_instance(obj()) &&

src/hotspot/share/oops/oop.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ class oopDesc {
117117
// field addresses in oop
118118
inline void* field_addr(int offset) const;
119119

120+
// Backport of templating version of field_addr
121+
template<typename T>
122+
inline T* field_addr_of_type(int offset) const;
123+
120124
// Need this as public for garbage collection.
121125
template <class T> inline T* obj_field_addr(int offset) const;
122126

src/hotspot/share/oops/oop.inline.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ void* oopDesc::field_addr(int offset) const { return reinterpret_cast<voi
211211
template <class T>
212212
T* oopDesc::obj_field_addr(int offset) const { return (T*) field_addr(offset); }
213213

214+
template<typename T>
215+
T* oopDesc::field_addr_of_type(int offset) const { return reinterpret_cast<T*>(cast_from_oop<intptr_t>(as_oop()) + offset); }
216+
214217
template <typename T>
215218
size_t oopDesc::field_offset(T* p) const { return pointer_delta((void*)p, (void*)this, 1); }
216219

0 commit comments

Comments
 (0)