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