• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ART_RUNTIME_MIRROR_ART_FIELD_INL_H_
18 #define ART_RUNTIME_MIRROR_ART_FIELD_INL_H_
19 
20 #include "art_field.h"
21 
22 #include "base/logging.h"
23 #include "gc/accounting/card_table-inl.h"
24 #include "jvalue.h"
25 #include "object-inl.h"
26 #include "object_utils.h"
27 #include "primitive.h"
28 
29 namespace art {
30 namespace mirror {
31 
GetDeclaringClass()32 inline Class* ArtField::GetDeclaringClass() const {
33   Class* result = GetFieldObject<Class*>(OFFSET_OF_OBJECT_MEMBER(ArtField, declaring_class_), false);
34   DCHECK(result != NULL);
35   DCHECK(result->IsLoaded() || result->IsErroneous());
36   return result;
37 }
38 
SetDeclaringClass(Class * new_declaring_class)39 inline void ArtField::SetDeclaringClass(Class *new_declaring_class) {
40   SetFieldObject(OFFSET_OF_OBJECT_MEMBER(ArtField, declaring_class_), new_declaring_class, false);
41 }
42 
GetAccessFlags()43 inline uint32_t ArtField::GetAccessFlags() const {
44   DCHECK(GetDeclaringClass()->IsLoaded() || GetDeclaringClass()->IsErroneous());
45   return GetField32(OFFSET_OF_OBJECT_MEMBER(ArtField, access_flags_), false);
46 }
47 
GetOffset()48 inline MemberOffset ArtField::GetOffset() const {
49   DCHECK(GetDeclaringClass()->IsResolved() || GetDeclaringClass()->IsErroneous());
50   return MemberOffset(GetField32(OFFSET_OF_OBJECT_MEMBER(ArtField, offset_), false));
51 }
52 
GetOffsetDuringLinking()53 inline MemberOffset ArtField::GetOffsetDuringLinking() const {
54   DCHECK(GetDeclaringClass()->IsLoaded() || GetDeclaringClass()->IsErroneous());
55   return MemberOffset(GetField32(OFFSET_OF_OBJECT_MEMBER(ArtField, offset_), false));
56 }
57 
Get32(const Object * object)58 inline uint32_t ArtField::Get32(const Object* object) const {
59   DCHECK(object != NULL) << PrettyField(this);
60   DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
61   return object->GetField32(GetOffset(), IsVolatile());
62 }
63 
Set32(Object * object,uint32_t new_value)64 inline void ArtField::Set32(Object* object, uint32_t new_value) const {
65   DCHECK(object != NULL) << PrettyField(this);
66   DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
67   object->SetField32(GetOffset(), new_value, IsVolatile());
68 }
69 
Get64(const Object * object)70 inline uint64_t ArtField::Get64(const Object* object) const {
71   DCHECK(object != NULL) << PrettyField(this);
72   DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
73   return object->GetField64(GetOffset(), IsVolatile());
74 }
75 
Set64(Object * object,uint64_t new_value)76 inline void ArtField::Set64(Object* object, uint64_t new_value) const {
77   DCHECK(object != NULL) << PrettyField(this);
78   DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
79   object->SetField64(GetOffset(), new_value, IsVolatile());
80 }
81 
GetObj(const Object * object)82 inline Object* ArtField::GetObj(const Object* object) const {
83   DCHECK(object != NULL) << PrettyField(this);
84   DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
85   return object->GetFieldObject<Object*>(GetOffset(), IsVolatile());
86 }
87 
SetObj(Object * object,const Object * new_value)88 inline void ArtField::SetObj(Object* object, const Object* new_value) const {
89   DCHECK(object != NULL) << PrettyField(this);
90   DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
91   object->SetFieldObject(GetOffset(), new_value, IsVolatile());
92 }
93 
GetBoolean(const Object * object)94 inline bool ArtField::GetBoolean(const Object* object) const {
95   DCHECK_EQ(Primitive::kPrimBoolean, FieldHelper(this).GetTypeAsPrimitiveType())
96       << PrettyField(this);
97   return Get32(object);
98 }
99 
SetBoolean(Object * object,bool z)100 inline void ArtField::SetBoolean(Object* object, bool z) const {
101   DCHECK_EQ(Primitive::kPrimBoolean, FieldHelper(this).GetTypeAsPrimitiveType())
102       << PrettyField(this);
103   Set32(object, z);
104 }
105 
GetByte(const Object * object)106 inline int8_t ArtField::GetByte(const Object* object) const {
107   DCHECK_EQ(Primitive::kPrimByte, FieldHelper(this).GetTypeAsPrimitiveType())
108       << PrettyField(this);
109   return Get32(object);
110 }
111 
SetByte(Object * object,int8_t b)112 inline void ArtField::SetByte(Object* object, int8_t b) const {
113   DCHECK_EQ(Primitive::kPrimByte, FieldHelper(this).GetTypeAsPrimitiveType())
114       << PrettyField(this);
115   Set32(object, b);
116 }
117 
GetChar(const Object * object)118 inline uint16_t ArtField::GetChar(const Object* object) const {
119   DCHECK_EQ(Primitive::kPrimChar, FieldHelper(this).GetTypeAsPrimitiveType())
120       << PrettyField(this);
121   return Get32(object);
122 }
123 
SetChar(Object * object,uint16_t c)124 inline void ArtField::SetChar(Object* object, uint16_t c) const {
125   DCHECK_EQ(Primitive::kPrimChar, FieldHelper(this).GetTypeAsPrimitiveType())
126        << PrettyField(this);
127   Set32(object, c);
128 }
129 
GetShort(const Object * object)130 inline int16_t ArtField::GetShort(const Object* object) const {
131   DCHECK_EQ(Primitive::kPrimShort, FieldHelper(this).GetTypeAsPrimitiveType())
132        << PrettyField(this);
133   return Get32(object);
134 }
135 
SetShort(Object * object,int16_t s)136 inline void ArtField::SetShort(Object* object, int16_t s) const {
137   DCHECK_EQ(Primitive::kPrimShort, FieldHelper(this).GetTypeAsPrimitiveType())
138        << PrettyField(this);
139   Set32(object, s);
140 }
141 
GetInt(const Object * object)142 inline int32_t ArtField::GetInt(const Object* object) const {
143 #ifndef NDEBUG
144   Primitive::Type type = FieldHelper(this).GetTypeAsPrimitiveType();
145   CHECK(type == Primitive::kPrimInt || type == Primitive::kPrimFloat) << PrettyField(this);
146 #endif
147   return Get32(object);
148 }
149 
SetInt(Object * object,int32_t i)150 inline void ArtField::SetInt(Object* object, int32_t i) const {
151 #ifndef NDEBUG
152   Primitive::Type type = FieldHelper(this).GetTypeAsPrimitiveType();
153   CHECK(type == Primitive::kPrimInt || type == Primitive::kPrimFloat) << PrettyField(this);
154 #endif
155   Set32(object, i);
156 }
157 
GetLong(const Object * object)158 inline int64_t ArtField::GetLong(const Object* object) const {
159 #ifndef NDEBUG
160   Primitive::Type type = FieldHelper(this).GetTypeAsPrimitiveType();
161   CHECK(type == Primitive::kPrimLong || type == Primitive::kPrimDouble) << PrettyField(this);
162 #endif
163   return Get64(object);
164 }
165 
SetLong(Object * object,int64_t j)166 inline void ArtField::SetLong(Object* object, int64_t j) const {
167 #ifndef NDEBUG
168   Primitive::Type type = FieldHelper(this).GetTypeAsPrimitiveType();
169   CHECK(type == Primitive::kPrimLong || type == Primitive::kPrimDouble) << PrettyField(this);
170 #endif
171   Set64(object, j);
172 }
173 
GetFloat(const Object * object)174 inline float ArtField::GetFloat(const Object* object) const {
175   DCHECK_EQ(Primitive::kPrimFloat, FieldHelper(this).GetTypeAsPrimitiveType())
176        << PrettyField(this);
177   JValue bits;
178   bits.SetI(Get32(object));
179   return bits.GetF();
180 }
181 
SetFloat(Object * object,float f)182 inline void ArtField::SetFloat(Object* object, float f) const {
183   DCHECK_EQ(Primitive::kPrimFloat, FieldHelper(this).GetTypeAsPrimitiveType())
184        << PrettyField(this);
185   JValue bits;
186   bits.SetF(f);
187   Set32(object, bits.GetI());
188 }
189 
GetDouble(const Object * object)190 inline double ArtField::GetDouble(const Object* object) const {
191   DCHECK_EQ(Primitive::kPrimDouble, FieldHelper(this).GetTypeAsPrimitiveType())
192        << PrettyField(this);
193   JValue bits;
194   bits.SetJ(Get64(object));
195   return bits.GetD();
196 }
197 
SetDouble(Object * object,double d)198 inline void ArtField::SetDouble(Object* object, double d) const {
199   DCHECK_EQ(Primitive::kPrimDouble, FieldHelper(this).GetTypeAsPrimitiveType())
200        << PrettyField(this);
201   JValue bits;
202   bits.SetD(d);
203   Set64(object, bits.GetJ());
204 }
205 
GetObject(const Object * object)206 inline Object* ArtField::GetObject(const Object* object) const {
207   DCHECK_EQ(Primitive::kPrimNot, FieldHelper(this).GetTypeAsPrimitiveType())
208        << PrettyField(this);
209   return GetObj(object);
210 }
211 
SetObject(Object * object,const Object * l)212 inline void ArtField::SetObject(Object* object, const Object* l) const {
213   DCHECK_EQ(Primitive::kPrimNot, FieldHelper(this).GetTypeAsPrimitiveType())
214        << PrettyField(this);
215   SetObj(object, l);
216 }
217 
218 }  // namespace mirror
219 }  // namespace art
220 
221 #endif  // ART_RUNTIME_MIRROR_ART_FIELD_INL_H_
222