diff options
Diffstat (limited to 'runtime/mirror/var_handle.cc')
| -rw-r--r-- | runtime/mirror/var_handle.cc | 21 |
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 |