summaryrefslogtreecommitdiff
path: root/runtime/mirror/var_handle.cc
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/mirror/var_handle.cc')
-rw-r--r--runtime/mirror/var_handle.cc21
1 files changed, 17 insertions, 4 deletions
diff --git a/runtime/mirror/var_handle.cc b/runtime/mirror/var_handle.cc
index 7970c621d7..c071e23fd0 100644
--- a/runtime/mirror/var_handle.cc
+++ b/runtime/mirror/var_handle.cc
@@ -1454,16 +1454,19 @@ bool VarHandle::Access(AccessMode access_mode,
ObjPtr<ObjectArray<Class>> class_roots = Runtime::Current()->GetClassLinker()->GetClassRoots();
ObjPtr<Class> klass = GetClass();
if (klass == GetClassRoot<FieldVarHandle>(class_roots)) {
- auto vh = reinterpret_cast<FieldVarHandle*>(this);
+ auto vh = ObjPtr<FieldVarHandle>::DownCast(this);
+ return vh->Access(access_mode, shadow_frame, operands, result);
+ } else if (klass == GetClassRoot<StaticFieldVarHandle>(class_roots)) {
+ auto vh = ObjPtr<StaticFieldVarHandle>::DownCast(this);
return vh->Access(access_mode, shadow_frame, operands, result);
} else if (klass == GetClassRoot<ArrayElementVarHandle>(class_roots)) {
- auto vh = reinterpret_cast<ArrayElementVarHandle*>(this);
+ auto vh = ObjPtr<ArrayElementVarHandle>::DownCast(this);
return vh->Access(access_mode, shadow_frame, operands, result);
} else if (klass == GetClassRoot<ByteArrayViewVarHandle>(class_roots)) {
- auto vh = reinterpret_cast<ByteArrayViewVarHandle*>(this);
+ auto vh = ObjPtr<ByteArrayViewVarHandle>::DownCast(this);
return vh->Access(access_mode, shadow_frame, operands, result);
} else if (klass == GetClassRoot<ByteBufferViewVarHandle>(class_roots)) {
- auto vh = reinterpret_cast<ByteBufferViewVarHandle*>(this);
+ auto vh = ObjPtr<ByteBufferViewVarHandle>::DownCast(this);
return vh->Access(access_mode, shadow_frame, operands, result);
} else {
LOG(FATAL) << "Unknown varhandle kind";
@@ -2004,6 +2007,16 @@ void FieldVarHandle::VisitTarget(ReflectiveValueVisitor* v) {
}
}
+void StaticFieldVarHandle::VisitTarget(ReflectiveValueVisitor* v) {
+ ArtField* orig = GetField();
+ ArtField* new_value =
+ v->VisitField(orig, HeapReflectiveSourceInfo(kSourceJavaLangInvokeFieldVarHandle, this));
+ if (orig != new_value) {
+ SetField64</*kTransactionActive*/ false>(ArtFieldOffset(),
+ reinterpret_cast<uintptr_t>(new_value));
+ SetFieldObject<false>(DeclaringClassOffset(), new_value->GetDeclaringClass());
+ }
+}
} // namespace mirror
} // namespace art