blob: be5dcab03dfca9cedb6a7384cc33519b690512fd [file] [log] [blame]
Ian Rogers2dd0e2c2013-01-24 12:42:14 -08001/*
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_SRC_MIRROR_FIELD_INL_H_
18#define ART_SRC_MIRROR_FIELD_INL_H_
19
20#include "field.h"
21
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080022#include "base/logging.h"
Ian Rogers1d54e732013-05-02 21:10:01 -070023#include "gc/accounting/card_table-inl.h"
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080024#include "jvalue.h"
25#include "object-inl.h"
26#include "object_utils.h"
27#include "primitive.h"
28
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080029namespace art {
30namespace mirror {
31
32inline Class* Field::GetDeclaringClass() const {
33 Class* result = GetFieldObject<Class*>(OFFSET_OF_OBJECT_MEMBER(Field, declaring_class_), false);
34 DCHECK(result != NULL);
35 DCHECK(result->IsLoaded() || result->IsErroneous());
36 return result;
37}
38
39inline void Field::SetDeclaringClass(Class *new_declaring_class) {
40 SetFieldObject(OFFSET_OF_OBJECT_MEMBER(Field, declaring_class_), new_declaring_class, false);
41}
42
43inline uint32_t Field::GetAccessFlags() const {
44 DCHECK(GetDeclaringClass()->IsLoaded() || GetDeclaringClass()->IsErroneous());
45 return GetField32(OFFSET_OF_OBJECT_MEMBER(Field, access_flags_), false);
46}
47
48inline MemberOffset Field::GetOffset() const {
49 DCHECK(GetDeclaringClass()->IsResolved() || GetDeclaringClass()->IsErroneous());
50 return MemberOffset(GetField32(OFFSET_OF_OBJECT_MEMBER(Field, offset_), false));
51}
52
53inline MemberOffset Field::GetOffsetDuringLinking() const {
54 DCHECK(GetDeclaringClass()->IsLoaded() || GetDeclaringClass()->IsErroneous());
55 return MemberOffset(GetField32(OFFSET_OF_OBJECT_MEMBER(Field, offset_), false));
56}
57
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080058inline uint32_t Field::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
64inline void Field::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
70inline uint64_t Field::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
76inline void Field::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
82inline Object* Field::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
88inline void Field::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
94inline bool Field::GetBoolean(const Object* object) const {
95 DCHECK_EQ(Primitive::kPrimBoolean, FieldHelper(this).GetTypeAsPrimitiveType())
96 << PrettyField(this);
97 return Get32(object);
98}
99
100inline void Field::SetBoolean(Object* object, bool z) const {
101 DCHECK_EQ(Primitive::kPrimBoolean, FieldHelper(this).GetTypeAsPrimitiveType())
102 << PrettyField(this);
103 Set32(object, z);
104}
105
106inline int8_t Field::GetByte(const Object* object) const {
107 DCHECK_EQ(Primitive::kPrimByte, FieldHelper(this).GetTypeAsPrimitiveType())
108 << PrettyField(this);
109 return Get32(object);
110}
111
112inline void Field::SetByte(Object* object, int8_t b) const {
113 DCHECK_EQ(Primitive::kPrimByte, FieldHelper(this).GetTypeAsPrimitiveType())
114 << PrettyField(this);
115 Set32(object, b);
116}
117
118inline uint16_t Field::GetChar(const Object* object) const {
119 DCHECK_EQ(Primitive::kPrimChar, FieldHelper(this).GetTypeAsPrimitiveType())
120 << PrettyField(this);
121 return Get32(object);
122}
123
124inline void Field::SetChar(Object* object, uint16_t c) const {
125 DCHECK_EQ(Primitive::kPrimChar, FieldHelper(this).GetTypeAsPrimitiveType())
126 << PrettyField(this);
127 Set32(object, c);
128}
129
130inline int16_t Field::GetShort(const Object* object) const {
131 DCHECK_EQ(Primitive::kPrimShort, FieldHelper(this).GetTypeAsPrimitiveType())
132 << PrettyField(this);
133 return Get32(object);
134}
135
136inline void Field::SetShort(Object* object, int16_t s) const {
137 DCHECK_EQ(Primitive::kPrimShort, FieldHelper(this).GetTypeAsPrimitiveType())
138 << PrettyField(this);
139 Set32(object, s);
140}
141
142inline int32_t Field::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
150inline void Field::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
158inline int64_t Field::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
166inline void Field::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
174inline float Field::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
182inline void Field::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
190inline double Field::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
198inline void Field::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
206inline Object* Field::GetObject(const Object* object) const {
207 DCHECK_EQ(Primitive::kPrimNot, FieldHelper(this).GetTypeAsPrimitiveType())
208 << PrettyField(this);
209 return GetObj(object);
210}
211
212inline void Field::SetObject(Object* object, const Object* l) const {
213 DCHECK_EQ(Primitive::kPrimNot, FieldHelper(this).GetTypeAsPrimitiveType())
214 << PrettyField(this);
215 SetObj(object, l);
216}
217
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800218} // namespace mirror
219} // namespace art
220
221#endif // ART_SRC_MIRROR_FIELD_INL_H_