1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_MIRROR_VAR_HANDLE_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_MIRROR_VAR_HANDLE_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include "handle.h" 21*795d594fSAndroid Build Coastguard Worker #include "interpreter/shadow_frame.h" 22*795d594fSAndroid Build Coastguard Worker #include "jvalue.h" 23*795d594fSAndroid Build Coastguard Worker #include "object.h" 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker template<class T> class Handle; 28*795d594fSAndroid Build Coastguard Worker class InstructionOperands; 29*795d594fSAndroid Build Coastguard Worker template<class T> class ObjPtr; 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker enum class Intrinsics; 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker struct VarHandleOffsets; 34*795d594fSAndroid Build Coastguard Worker struct FieldVarHandleOffsets; 35*795d594fSAndroid Build Coastguard Worker struct StaticFieldVarHandleOffsets; 36*795d594fSAndroid Build Coastguard Worker struct ArrayElementVarHandleOffsets; 37*795d594fSAndroid Build Coastguard Worker struct ByteArrayViewVarHandleOffsets; 38*795d594fSAndroid Build Coastguard Worker struct ByteBufferViewVarHandleOffsets; 39*795d594fSAndroid Build Coastguard Worker 40*795d594fSAndroid Build Coastguard Worker class ReflectiveValueVisitor; 41*795d594fSAndroid Build Coastguard Worker class ShadowFrameGetter; 42*795d594fSAndroid Build Coastguard Worker 43*795d594fSAndroid Build Coastguard Worker namespace mirror { 44*795d594fSAndroid Build Coastguard Worker 45*795d594fSAndroid Build Coastguard Worker class MethodType; 46*795d594fSAndroid Build Coastguard Worker class RawMethodType; 47*795d594fSAndroid Build Coastguard Worker class VarHandleTest; 48*795d594fSAndroid Build Coastguard Worker 49*795d594fSAndroid Build Coastguard Worker // C++ mirror of java.lang.invoke.VarHandle 50*795d594fSAndroid Build Coastguard Worker class MANAGED VarHandle : public Object { 51*795d594fSAndroid Build Coastguard Worker public: 52*795d594fSAndroid Build Coastguard Worker MIRROR_CLASS("Ljava/lang/invoke/VarHandle;"); 53*795d594fSAndroid Build Coastguard Worker 54*795d594fSAndroid Build Coastguard Worker // The maximum number of parameters a VarHandle accessor method can 55*795d594fSAndroid Build Coastguard Worker // take. The Worst case is equivalent to a compare-and-swap 56*795d594fSAndroid Build Coastguard Worker // operation on an array element which requires four parameters 57*795d594fSAndroid Build Coastguard Worker // (array, index, old, new). 58*795d594fSAndroid Build Coastguard Worker static constexpr int kMaxAccessorParameters = 4; 59*795d594fSAndroid Build Coastguard Worker 60*795d594fSAndroid Build Coastguard Worker // The maximum number of VarType parameters a VarHandle accessor 61*795d594fSAndroid Build Coastguard Worker // method can take. 62*795d594fSAndroid Build Coastguard Worker static constexpr size_t kMaxVarTypeParameters = 2; 63*795d594fSAndroid Build Coastguard Worker 64*795d594fSAndroid Build Coastguard Worker // The minimum number of CoordinateType parameters a VarHandle acessor method may take. 65*795d594fSAndroid Build Coastguard Worker static constexpr size_t kMinCoordinateTypes = 0; 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker // The maximum number of CoordinateType parameters a VarHandle acessor method may take. 68*795d594fSAndroid Build Coastguard Worker static constexpr size_t kMaxCoordinateTypes = 2; 69*795d594fSAndroid Build Coastguard Worker 70*795d594fSAndroid Build Coastguard Worker // Enumeration of the possible access modes. This mirrors the enum 71*795d594fSAndroid Build Coastguard Worker // in java.lang.invoke.VarHandle. 72*795d594fSAndroid Build Coastguard Worker enum class AccessMode : uint32_t { 73*795d594fSAndroid Build Coastguard Worker kGet, 74*795d594fSAndroid Build Coastguard Worker kSet, 75*795d594fSAndroid Build Coastguard Worker kGetVolatile, 76*795d594fSAndroid Build Coastguard Worker kSetVolatile, 77*795d594fSAndroid Build Coastguard Worker kGetAcquire, 78*795d594fSAndroid Build Coastguard Worker kSetRelease, 79*795d594fSAndroid Build Coastguard Worker kGetOpaque, 80*795d594fSAndroid Build Coastguard Worker kSetOpaque, 81*795d594fSAndroid Build Coastguard Worker kCompareAndSet, 82*795d594fSAndroid Build Coastguard Worker kCompareAndExchange, 83*795d594fSAndroid Build Coastguard Worker kCompareAndExchangeAcquire, 84*795d594fSAndroid Build Coastguard Worker kCompareAndExchangeRelease, 85*795d594fSAndroid Build Coastguard Worker kWeakCompareAndSetPlain, 86*795d594fSAndroid Build Coastguard Worker kWeakCompareAndSet, 87*795d594fSAndroid Build Coastguard Worker kWeakCompareAndSetAcquire, 88*795d594fSAndroid Build Coastguard Worker kWeakCompareAndSetRelease, 89*795d594fSAndroid Build Coastguard Worker kGetAndSet, 90*795d594fSAndroid Build Coastguard Worker kGetAndSetAcquire, 91*795d594fSAndroid Build Coastguard Worker kGetAndSetRelease, 92*795d594fSAndroid Build Coastguard Worker kGetAndAdd, 93*795d594fSAndroid Build Coastguard Worker kGetAndAddAcquire, 94*795d594fSAndroid Build Coastguard Worker kGetAndAddRelease, 95*795d594fSAndroid Build Coastguard Worker kGetAndBitwiseOr, 96*795d594fSAndroid Build Coastguard Worker kGetAndBitwiseOrRelease, 97*795d594fSAndroid Build Coastguard Worker kGetAndBitwiseOrAcquire, 98*795d594fSAndroid Build Coastguard Worker kGetAndBitwiseAnd, 99*795d594fSAndroid Build Coastguard Worker kGetAndBitwiseAndRelease, 100*795d594fSAndroid Build Coastguard Worker kGetAndBitwiseAndAcquire, 101*795d594fSAndroid Build Coastguard Worker kGetAndBitwiseXor, 102*795d594fSAndroid Build Coastguard Worker kGetAndBitwiseXorRelease, 103*795d594fSAndroid Build Coastguard Worker kGetAndBitwiseXorAcquire, 104*795d594fSAndroid Build Coastguard Worker kLast = kGetAndBitwiseXorAcquire, 105*795d594fSAndroid Build Coastguard Worker }; 106*795d594fSAndroid Build Coastguard Worker constexpr static size_t kNumberOfAccessModes = static_cast<size_t>(AccessMode::kLast) + 1u; 107*795d594fSAndroid Build Coastguard Worker 108*795d594fSAndroid Build Coastguard Worker // Enumeration for describing the parameter and return types of an AccessMode. 109*795d594fSAndroid Build Coastguard Worker enum class AccessModeTemplate : uint32_t { 110*795d594fSAndroid Build Coastguard Worker kGet, // T Op(C0..CN) 111*795d594fSAndroid Build Coastguard Worker kSet, // void Op(C0..CN, T) 112*795d594fSAndroid Build Coastguard Worker kCompareAndSet, // boolean Op(C0..CN, T, T) 113*795d594fSAndroid Build Coastguard Worker kCompareAndExchange, // T Op(C0..CN, T, T) 114*795d594fSAndroid Build Coastguard Worker kGetAndUpdate, // T Op(C0..CN, T) 115*795d594fSAndroid Build Coastguard Worker }; 116*795d594fSAndroid Build Coastguard Worker 117*795d594fSAndroid Build Coastguard Worker // Returns true if the AccessMode specified is a supported operation. IsAccessModeSupported(AccessMode accessMode)118*795d594fSAndroid Build Coastguard Worker bool IsAccessModeSupported(AccessMode accessMode) REQUIRES_SHARED(Locks::mutator_lock_) { 119*795d594fSAndroid Build Coastguard Worker return (GetAccessModesBitMask() & (1u << static_cast<uint32_t>(accessMode))) != 0; 120*795d594fSAndroid Build Coastguard Worker } 121*795d594fSAndroid Build Coastguard Worker 122*795d594fSAndroid Build Coastguard Worker enum MatchKind : uint8_t { 123*795d594fSAndroid Build Coastguard Worker kNone, 124*795d594fSAndroid Build Coastguard Worker kWithConversions, 125*795d594fSAndroid Build Coastguard Worker kExact 126*795d594fSAndroid Build Coastguard Worker }; 127*795d594fSAndroid Build Coastguard Worker 128*795d594fSAndroid Build Coastguard Worker // Returns match information on the compatability between the exact method type for 129*795d594fSAndroid Build Coastguard Worker // 'access_mode' and the provided 'method_type'. 130*795d594fSAndroid Build Coastguard Worker MatchKind GetMethodTypeMatchForAccessMode(AccessMode access_mode, ObjPtr<MethodType> method_type) 131*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 132*795d594fSAndroid Build Coastguard Worker MatchKind GetMethodTypeMatchForAccessMode(AccessMode access_mode, Handle<MethodType> method_type) 133*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 134*795d594fSAndroid Build Coastguard Worker MatchKind GetMethodTypeMatchForAccessMode(AccessMode access_mode, RawMethodType method_type) 135*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 136*795d594fSAndroid Build Coastguard Worker 137*795d594fSAndroid Build Coastguard Worker // Allocates and returns the MethodType associated with the 138*795d594fSAndroid Build Coastguard Worker // AccessMode. No check is made for whether the AccessMode is a 139*795d594fSAndroid Build Coastguard Worker // supported operation so the MethodType can be used when raising a 140*795d594fSAndroid Build Coastguard Worker // WrongMethodTypeException exception. 141*795d594fSAndroid Build Coastguard Worker ObjPtr<MethodType> GetMethodTypeForAccessMode(Thread* self, AccessMode access_mode) 142*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 143*795d594fSAndroid Build Coastguard Worker 144*795d594fSAndroid Build Coastguard Worker // Overload that fills a handle scope with the return type and argument types 145*795d594fSAndroid Build Coastguard Worker // instead of creating an actual `MethodType`. 146*795d594fSAndroid Build Coastguard Worker void GetMethodTypeForAccessMode(AccessMode access_mode, /*out*/ RawMethodType method_type) 147*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 148*795d594fSAndroid Build Coastguard Worker 149*795d594fSAndroid Build Coastguard Worker // Returns a string representing the descriptor of the MethodType associated with 150*795d594fSAndroid Build Coastguard Worker // this AccessMode. 151*795d594fSAndroid Build Coastguard Worker std::string PrettyDescriptorForAccessMode(AccessMode access_mode) 152*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 153*795d594fSAndroid Build Coastguard Worker 154*795d594fSAndroid Build Coastguard Worker bool Access(AccessMode access_mode, 155*795d594fSAndroid Build Coastguard Worker ShadowFrame* shadow_frame, 156*795d594fSAndroid Build Coastguard Worker const InstructionOperands* const operands, 157*795d594fSAndroid Build Coastguard Worker JValue* result) 158*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 159*795d594fSAndroid Build Coastguard Worker 160*795d594fSAndroid Build Coastguard Worker // Gets the variable type that is operated on by this VarHandle instance. 161*795d594fSAndroid Build Coastguard Worker ObjPtr<Class> GetVarType() REQUIRES_SHARED(Locks::mutator_lock_); 162*795d594fSAndroid Build Coastguard Worker 163*795d594fSAndroid Build Coastguard Worker // Gets the type of the object that this VarHandle operates on, null for StaticFieldVarHandle. 164*795d594fSAndroid Build Coastguard Worker ObjPtr<Class> GetCoordinateType0() REQUIRES_SHARED(Locks::mutator_lock_); 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker // Gets the return type descriptor for a named accessor method, 167*795d594fSAndroid Build Coastguard Worker // nullptr if accessor_method is not supported. 168*795d594fSAndroid Build Coastguard Worker static const char* GetReturnTypeDescriptor(const char* accessor_method); 169*795d594fSAndroid Build Coastguard Worker 170*795d594fSAndroid Build Coastguard Worker // Returns the AccessMode corresponding to a VarHandle accessor intrinsic. 171*795d594fSAndroid Build Coastguard Worker static AccessMode GetAccessModeByIntrinsic(Intrinsics ordinal); 172*795d594fSAndroid Build Coastguard Worker 173*795d594fSAndroid Build Coastguard Worker // Returns true and sets access_mode if method_name corresponds to a 174*795d594fSAndroid Build Coastguard Worker // VarHandle access method, such as "setOpaque". Returns false otherwise. 175*795d594fSAndroid Build Coastguard Worker static bool GetAccessModeByMethodName(const char* method_name, AccessMode* access_mode); 176*795d594fSAndroid Build Coastguard Worker 177*795d594fSAndroid Build Coastguard Worker // Returns the AccessModeTemplate for a given mode. 178*795d594fSAndroid Build Coastguard Worker static AccessModeTemplate GetAccessModeTemplate(AccessMode access_mode); 179*795d594fSAndroid Build Coastguard Worker 180*795d594fSAndroid Build Coastguard Worker // Returns the AccessModeTemplate corresponding to a VarHandle accessor intrinsic. 181*795d594fSAndroid Build Coastguard Worker static AccessModeTemplate GetAccessModeTemplateByIntrinsic(Intrinsics ordinal); 182*795d594fSAndroid Build Coastguard Worker 183*795d594fSAndroid Build Coastguard Worker // Returns the number of VarType parameters for an access mode template. 184*795d594fSAndroid Build Coastguard Worker static int32_t GetNumberOfVarTypeParameters(AccessModeTemplate access_mode_template); 185*795d594fSAndroid Build Coastguard Worker VarTypeOffset()186*795d594fSAndroid Build Coastguard Worker static MemberOffset VarTypeOffset() { 187*795d594fSAndroid Build Coastguard Worker return MemberOffset(OFFSETOF_MEMBER(VarHandle, var_type_)); 188*795d594fSAndroid Build Coastguard Worker } 189*795d594fSAndroid Build Coastguard Worker CoordinateType0Offset()190*795d594fSAndroid Build Coastguard Worker static MemberOffset CoordinateType0Offset() { 191*795d594fSAndroid Build Coastguard Worker return MemberOffset(OFFSETOF_MEMBER(VarHandle, coordinate_type0_)); 192*795d594fSAndroid Build Coastguard Worker } 193*795d594fSAndroid Build Coastguard Worker CoordinateType1Offset()194*795d594fSAndroid Build Coastguard Worker static MemberOffset CoordinateType1Offset() { 195*795d594fSAndroid Build Coastguard Worker return MemberOffset(OFFSETOF_MEMBER(VarHandle, coordinate_type1_)); 196*795d594fSAndroid Build Coastguard Worker } 197*795d594fSAndroid Build Coastguard Worker AccessModesBitMaskOffset()198*795d594fSAndroid Build Coastguard Worker static MemberOffset AccessModesBitMaskOffset() { 199*795d594fSAndroid Build Coastguard Worker return MemberOffset(OFFSETOF_MEMBER(VarHandle, access_modes_bit_mask_)); 200*795d594fSAndroid Build Coastguard Worker } 201*795d594fSAndroid Build Coastguard Worker 202*795d594fSAndroid Build Coastguard Worker private: 203*795d594fSAndroid Build Coastguard Worker ObjPtr<Class> GetCoordinateType1() REQUIRES_SHARED(Locks::mutator_lock_); 204*795d594fSAndroid Build Coastguard Worker int32_t GetAccessModesBitMask() REQUIRES_SHARED(Locks::mutator_lock_); 205*795d594fSAndroid Build Coastguard Worker 206*795d594fSAndroid Build Coastguard Worker template <typename MethodTypeType> 207*795d594fSAndroid Build Coastguard Worker static MatchKind GetMethodTypeMatchForAccessModeImpl(AccessMode access_mode, 208*795d594fSAndroid Build Coastguard Worker ObjPtr<VarHandle> var_handle, 209*795d594fSAndroid Build Coastguard Worker MethodTypeType method_type) 210*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 211*795d594fSAndroid Build Coastguard Worker 212*795d594fSAndroid Build Coastguard Worker HeapReference<mirror::Class> coordinate_type0_; 213*795d594fSAndroid Build Coastguard Worker HeapReference<mirror::Class> coordinate_type1_; 214*795d594fSAndroid Build Coastguard Worker HeapReference<mirror::Class> var_type_; 215*795d594fSAndroid Build Coastguard Worker int32_t access_modes_bit_mask_; 216*795d594fSAndroid Build Coastguard Worker 217*795d594fSAndroid Build Coastguard Worker friend class VarHandleTest; // for testing purposes 218*795d594fSAndroid Build Coastguard Worker friend struct art::VarHandleOffsets; // for verifying offset information 219*795d594fSAndroid Build Coastguard Worker DISALLOW_IMPLICIT_CONSTRUCTORS(VarHandle); 220*795d594fSAndroid Build Coastguard Worker }; 221*795d594fSAndroid Build Coastguard Worker 222*795d594fSAndroid Build Coastguard Worker // Represents a VarHandle to a static or instance field. 223*795d594fSAndroid Build Coastguard Worker // The corresponding managed class in libart java.lang.invoke.FieldVarHandle. 224*795d594fSAndroid Build Coastguard Worker class MANAGED FieldVarHandle : public VarHandle { 225*795d594fSAndroid Build Coastguard Worker public: 226*795d594fSAndroid Build Coastguard Worker MIRROR_CLASS("Ljava/lang/invoke/FieldVarHandle;"); 227*795d594fSAndroid Build Coastguard Worker 228*795d594fSAndroid Build Coastguard Worker bool Access(AccessMode access_mode, 229*795d594fSAndroid Build Coastguard Worker ShadowFrame* shadow_frame, 230*795d594fSAndroid Build Coastguard Worker const InstructionOperands* const operands, 231*795d594fSAndroid Build Coastguard Worker JValue* result) 232*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 233*795d594fSAndroid Build Coastguard Worker 234*795d594fSAndroid Build Coastguard Worker template <VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> GetArtField()235*795d594fSAndroid Build Coastguard Worker ArtField* GetArtField() REQUIRES_SHARED(Locks::mutator_lock_) { 236*795d594fSAndroid Build Coastguard Worker return reinterpret_cast64<ArtField*>(GetField64<kVerifyFlags>(ArtFieldOffset())); 237*795d594fSAndroid Build Coastguard Worker } 238*795d594fSAndroid Build Coastguard Worker 239*795d594fSAndroid Build Coastguard Worker template <VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> SetArtField(ArtField * art_field)240*795d594fSAndroid Build Coastguard Worker void SetArtField(ArtField* art_field) REQUIRES_SHARED(Locks::mutator_lock_) { 241*795d594fSAndroid Build Coastguard Worker SetField64</*kTransactionActive*/ false, 242*795d594fSAndroid Build Coastguard Worker /*kCheckTransaction=*/ true, 243*795d594fSAndroid Build Coastguard Worker kVerifyFlags>(ArtFieldOffset(), reinterpret_cast64<uint64_t>(art_field)); 244*795d594fSAndroid Build Coastguard Worker } 245*795d594fSAndroid Build Coastguard Worker 246*795d594fSAndroid Build Coastguard Worker // Used for updating var-handles to obsolete fields. 247*795d594fSAndroid Build Coastguard Worker void VisitTarget(ReflectiveValueVisitor* v) REQUIRES(Locks::mutator_lock_); 248*795d594fSAndroid Build Coastguard Worker ArtFieldOffset()249*795d594fSAndroid Build Coastguard Worker static MemberOffset ArtFieldOffset() { 250*795d594fSAndroid Build Coastguard Worker return MemberOffset(OFFSETOF_MEMBER(FieldVarHandle, art_field_)); 251*795d594fSAndroid Build Coastguard Worker } 252*795d594fSAndroid Build Coastguard Worker 253*795d594fSAndroid Build Coastguard Worker private: 254*795d594fSAndroid Build Coastguard Worker // ArtField instance corresponding to variable for accessors. 255*795d594fSAndroid Build Coastguard Worker int64_t art_field_; 256*795d594fSAndroid Build Coastguard Worker 257*795d594fSAndroid Build Coastguard Worker friend class VarHandleTest; // for var_handle_test. 258*795d594fSAndroid Build Coastguard Worker friend struct art::FieldVarHandleOffsets; // for verifying offset information 259*795d594fSAndroid Build Coastguard Worker DISALLOW_IMPLICIT_CONSTRUCTORS(FieldVarHandle); 260*795d594fSAndroid Build Coastguard Worker }; 261*795d594fSAndroid Build Coastguard Worker 262*795d594fSAndroid Build Coastguard Worker class MANAGED StaticFieldVarHandle : public FieldVarHandle { 263*795d594fSAndroid Build Coastguard Worker public: 264*795d594fSAndroid Build Coastguard Worker MIRROR_CLASS("Ljava/lang/invoke/StaticFieldVarHandle;"); 265*795d594fSAndroid Build Coastguard Worker 266*795d594fSAndroid Build Coastguard Worker // Used for updating var-handles to obsolete fields. 267*795d594fSAndroid Build Coastguard Worker void VisitTarget(ReflectiveValueVisitor* v) REQUIRES(Locks::mutator_lock_); 268*795d594fSAndroid Build Coastguard Worker DeclaringClassOffset()269*795d594fSAndroid Build Coastguard Worker static MemberOffset DeclaringClassOffset() { 270*795d594fSAndroid Build Coastguard Worker return MemberOffset(OFFSETOF_MEMBER(StaticFieldVarHandle, declaring_class_)); 271*795d594fSAndroid Build Coastguard Worker } 272*795d594fSAndroid Build Coastguard Worker 273*795d594fSAndroid Build Coastguard Worker private: 274*795d594fSAndroid Build Coastguard Worker HeapReference<mirror::Class> declaring_class_; 275*795d594fSAndroid Build Coastguard Worker 276*795d594fSAndroid Build Coastguard Worker friend class VarHandleTest; // for var_handle_test. 277*795d594fSAndroid Build Coastguard Worker friend struct art::StaticFieldVarHandleOffsets; // for verifying offset information 278*795d594fSAndroid Build Coastguard Worker DISALLOW_IMPLICIT_CONSTRUCTORS(StaticFieldVarHandle); 279*795d594fSAndroid Build Coastguard Worker }; 280*795d594fSAndroid Build Coastguard Worker 281*795d594fSAndroid Build Coastguard Worker 282*795d594fSAndroid Build Coastguard Worker // Represents a VarHandle providing accessors to an array. 283*795d594fSAndroid Build Coastguard Worker // The corresponding managed class in libart java.lang.invoke.ArrayElementVarHandle. 284*795d594fSAndroid Build Coastguard Worker class MANAGED ArrayElementVarHandle : public VarHandle { 285*795d594fSAndroid Build Coastguard Worker public: 286*795d594fSAndroid Build Coastguard Worker bool Access(AccessMode access_mode, 287*795d594fSAndroid Build Coastguard Worker ShadowFrame* shadow_frame, 288*795d594fSAndroid Build Coastguard Worker const InstructionOperands* const operands, 289*795d594fSAndroid Build Coastguard Worker JValue* result) REQUIRES_SHARED(Locks::mutator_lock_); 290*795d594fSAndroid Build Coastguard Worker 291*795d594fSAndroid Build Coastguard Worker private: 292*795d594fSAndroid Build Coastguard Worker static bool CheckArrayStore(AccessMode access_mode, 293*795d594fSAndroid Build Coastguard Worker ShadowFrameGetter getter, 294*795d594fSAndroid Build Coastguard Worker ObjPtr<ObjectArray<Object>> array) 295*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 296*795d594fSAndroid Build Coastguard Worker 297*795d594fSAndroid Build Coastguard Worker friend class VarHandleTest; 298*795d594fSAndroid Build Coastguard Worker DISALLOW_IMPLICIT_CONSTRUCTORS(ArrayElementVarHandle); 299*795d594fSAndroid Build Coastguard Worker }; 300*795d594fSAndroid Build Coastguard Worker 301*795d594fSAndroid Build Coastguard Worker // Represents a VarHandle providing accessors to a view of a ByteArray. 302*795d594fSAndroid Build Coastguard Worker // The corresponding managed class in libart java.lang.invoke.ByteArrayViewVarHandle. 303*795d594fSAndroid Build Coastguard Worker class MANAGED ByteArrayViewVarHandle : public VarHandle { 304*795d594fSAndroid Build Coastguard Worker public: 305*795d594fSAndroid Build Coastguard Worker MIRROR_CLASS("Ljava/lang/invoke/ByteArrayViewVarHandle;"); 306*795d594fSAndroid Build Coastguard Worker 307*795d594fSAndroid Build Coastguard Worker bool Access(AccessMode access_mode, 308*795d594fSAndroid Build Coastguard Worker ShadowFrame* shadow_frame, 309*795d594fSAndroid Build Coastguard Worker const InstructionOperands* const operands, 310*795d594fSAndroid Build Coastguard Worker JValue* result) 311*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 312*795d594fSAndroid Build Coastguard Worker 313*795d594fSAndroid Build Coastguard Worker bool GetNativeByteOrder() REQUIRES_SHARED(Locks::mutator_lock_); 314*795d594fSAndroid Build Coastguard Worker NativeByteOrderOffset()315*795d594fSAndroid Build Coastguard Worker static MemberOffset NativeByteOrderOffset() { 316*795d594fSAndroid Build Coastguard Worker return MemberOffset(OFFSETOF_MEMBER(ByteArrayViewVarHandle, native_byte_order_)); 317*795d594fSAndroid Build Coastguard Worker } 318*795d594fSAndroid Build Coastguard Worker 319*795d594fSAndroid Build Coastguard Worker private: 320*795d594fSAndroid Build Coastguard Worker // Flag indicating that accessors should use native byte-ordering. 321*795d594fSAndroid Build Coastguard Worker uint8_t native_byte_order_; 322*795d594fSAndroid Build Coastguard Worker 323*795d594fSAndroid Build Coastguard Worker friend class VarHandleTest; // for var_handle_test. 324*795d594fSAndroid Build Coastguard Worker friend struct art::ByteArrayViewVarHandleOffsets; // for verifying offset information 325*795d594fSAndroid Build Coastguard Worker DISALLOW_IMPLICIT_CONSTRUCTORS(ByteArrayViewVarHandle); 326*795d594fSAndroid Build Coastguard Worker }; 327*795d594fSAndroid Build Coastguard Worker 328*795d594fSAndroid Build Coastguard Worker // Represents a VarHandle providing accessors to a view of a ByteBuffer 329*795d594fSAndroid Build Coastguard Worker // The corresponding managed class in libart java.lang.invoke.ByteBufferViewVarHandle. 330*795d594fSAndroid Build Coastguard Worker class MANAGED ByteBufferViewVarHandle : public VarHandle { 331*795d594fSAndroid Build Coastguard Worker public: 332*795d594fSAndroid Build Coastguard Worker MIRROR_CLASS("Ljava/lang/invoke/ByteBufferViewVarHandle;"); 333*795d594fSAndroid Build Coastguard Worker 334*795d594fSAndroid Build Coastguard Worker bool Access(AccessMode access_mode, 335*795d594fSAndroid Build Coastguard Worker ShadowFrame* shadow_frame, 336*795d594fSAndroid Build Coastguard Worker const InstructionOperands* const operands, 337*795d594fSAndroid Build Coastguard Worker JValue* result) 338*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 339*795d594fSAndroid Build Coastguard Worker 340*795d594fSAndroid Build Coastguard Worker bool GetNativeByteOrder() REQUIRES_SHARED(Locks::mutator_lock_); 341*795d594fSAndroid Build Coastguard Worker 342*795d594fSAndroid Build Coastguard Worker private: 343*795d594fSAndroid Build Coastguard Worker bool AccessHeapBuffer(AccessMode access_mode, 344*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> byte_buffer, 345*795d594fSAndroid Build Coastguard Worker int buffer_offset, 346*795d594fSAndroid Build Coastguard Worker ObjPtr<ByteArray> heap_byte_array, 347*795d594fSAndroid Build Coastguard Worker ShadowFrameGetter* getter, 348*795d594fSAndroid Build Coastguard Worker JValue* result) 349*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 350*795d594fSAndroid Build Coastguard Worker 351*795d594fSAndroid Build Coastguard Worker bool AccessFixedMemory(AccessMode access_mode, 352*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> byte_buffer, 353*795d594fSAndroid Build Coastguard Worker int buffer_offset, 354*795d594fSAndroid Build Coastguard Worker ShadowFrameGetter* getter, 355*795d594fSAndroid Build Coastguard Worker JValue* result) 356*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 357*795d594fSAndroid Build Coastguard Worker NativeByteOrderOffset()358*795d594fSAndroid Build Coastguard Worker static MemberOffset NativeByteOrderOffset() { 359*795d594fSAndroid Build Coastguard Worker return MemberOffset(OFFSETOF_MEMBER(ByteBufferViewVarHandle, native_byte_order_)); 360*795d594fSAndroid Build Coastguard Worker } 361*795d594fSAndroid Build Coastguard Worker 362*795d594fSAndroid Build Coastguard Worker // Flag indicating that accessors should use native byte-ordering. 363*795d594fSAndroid Build Coastguard Worker uint8_t native_byte_order_; 364*795d594fSAndroid Build Coastguard Worker 365*795d594fSAndroid Build Coastguard Worker friend class VarHandleTest; // for var_handle_test. 366*795d594fSAndroid Build Coastguard Worker friend struct art::ByteBufferViewVarHandleOffsets; // for verifying offset information 367*795d594fSAndroid Build Coastguard Worker DISALLOW_IMPLICIT_CONSTRUCTORS(ByteBufferViewVarHandle); 368*795d594fSAndroid Build Coastguard Worker }; 369*795d594fSAndroid Build Coastguard Worker 370*795d594fSAndroid Build Coastguard Worker } // namespace mirror 371*795d594fSAndroid Build Coastguard Worker } // namespace art 372*795d594fSAndroid Build Coastguard Worker 373*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_MIRROR_VAR_HANDLE_H_ 374