blob: d8c278c9ac28231ffb9b0551f91368a225bb60f9 [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
Brian Carlstromea46f952013-07-30 01:26:50 -070017#ifndef ART_RUNTIME_MIRROR_ART_FIELD_INL_H_
18#define ART_RUNTIME_MIRROR_ART_FIELD_INL_H_
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080019
Brian Carlstromea46f952013-07-30 01:26:50 -070020#include "art_field.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080021
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
Brian Carlstromea46f952013-07-30 01:26:50 -070032inline Class* ArtField::GetDeclaringClass() const {
33 Class* result = GetFieldObject<Class*>(OFFSET_OF_OBJECT_MEMBER(ArtField, declaring_class_), false);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080034 DCHECK(result != NULL);
35 DCHECK(result->IsLoaded() || result->IsErroneous());
36 return result;
37}
38
Brian Carlstromea46f952013-07-30 01:26:50 -070039inline void ArtField::SetDeclaringClass(Class *new_declaring_class) {
40 SetFieldObject(OFFSET_OF_OBJECT_MEMBER(ArtField, declaring_class_), new_declaring_class, false);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080041}
42
Brian Carlstromea46f952013-07-30 01:26:50 -070043inline uint32_t ArtField::GetAccessFlags() const {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080044 DCHECK(GetDeclaringClass()->IsLoaded() || GetDeclaringClass()->IsErroneous());
Brian Carlstromea46f952013-07-30 01:26:50 -070045 return GetField32(OFFSET_OF_OBJECT_MEMBER(ArtField, access_flags_), false);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080046}
47
Brian Carlstromea46f952013-07-30 01:26:50 -070048inline MemberOffset ArtField::GetOffset() const {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080049 DCHECK(GetDeclaringClass()->IsResolved() || GetDeclaringClass()->IsErroneous());
Brian Carlstromea46f952013-07-30 01:26:50 -070050 return MemberOffset(GetField32(OFFSET_OF_OBJECT_MEMBER(ArtField, offset_), false));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080051}
52
Brian Carlstromea46f952013-07-30 01:26:50 -070053inline MemberOffset ArtField::GetOffsetDuringLinking() const {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080054 DCHECK(GetDeclaringClass()->IsLoaded() || GetDeclaringClass()->IsErroneous());
Brian Carlstromea46f952013-07-30 01:26:50 -070055 return MemberOffset(GetField32(OFFSET_OF_OBJECT_MEMBER(ArtField, offset_), false));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080056}
57
Brian Carlstromea46f952013-07-30 01:26:50 -070058inline uint32_t ArtField::Get32(const Object* object) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080059 DCHECK(object != NULL) << PrettyField(this);
60 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
61 return object->GetField32(GetOffset(), IsVolatile());
62}
63
Brian Carlstromea46f952013-07-30 01:26:50 -070064inline void ArtField::Set32(Object* object, uint32_t new_value) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080065 DCHECK(object != NULL) << PrettyField(this);
66 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
67 object->SetField32(GetOffset(), new_value, IsVolatile());
68}
69
Brian Carlstromea46f952013-07-30 01:26:50 -070070inline uint64_t ArtField::Get64(const Object* object) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080071 DCHECK(object != NULL) << PrettyField(this);
72 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
73 return object->GetField64(GetOffset(), IsVolatile());
74}
75
Brian Carlstromea46f952013-07-30 01:26:50 -070076inline void ArtField::Set64(Object* object, uint64_t new_value) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080077 DCHECK(object != NULL) << PrettyField(this);
78 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
79 object->SetField64(GetOffset(), new_value, IsVolatile());
80}
81
Brian Carlstromea46f952013-07-30 01:26:50 -070082inline Object* ArtField::GetObj(const Object* object) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080083 DCHECK(object != NULL) << PrettyField(this);
84 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
85 return object->GetFieldObject<Object*>(GetOffset(), IsVolatile());
86}
87
Brian Carlstromea46f952013-07-30 01:26:50 -070088inline void ArtField::SetObj(Object* object, const Object* new_value) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080089 DCHECK(object != NULL) << PrettyField(this);
90 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
91 object->SetFieldObject(GetOffset(), new_value, IsVolatile());
92}
93
Brian Carlstromea46f952013-07-30 01:26:50 -070094inline bool ArtField::GetBoolean(const Object* object) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080095 DCHECK_EQ(Primitive::kPrimBoolean, FieldHelper(this).GetTypeAsPrimitiveType())
96 << PrettyField(this);
97 return Get32(object);
98}
99
Brian Carlstromea46f952013-07-30 01:26:50 -0700100inline void ArtField::SetBoolean(Object* object, bool z) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800101 DCHECK_EQ(Primitive::kPrimBoolean, FieldHelper(this).GetTypeAsPrimitiveType())
102 << PrettyField(this);
103 Set32(object, z);
104}
105
Brian Carlstromea46f952013-07-30 01:26:50 -0700106inline int8_t ArtField::GetByte(const Object* object) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800107 DCHECK_EQ(Primitive::kPrimByte, FieldHelper(this).GetTypeAsPrimitiveType())
108 << PrettyField(this);
109 return Get32(object);
110}
111
Brian Carlstromea46f952013-07-30 01:26:50 -0700112inline void ArtField::SetByte(Object* object, int8_t b) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800113 DCHECK_EQ(Primitive::kPrimByte, FieldHelper(this).GetTypeAsPrimitiveType())
114 << PrettyField(this);
115 Set32(object, b);
116}
117
Brian Carlstromea46f952013-07-30 01:26:50 -0700118inline uint16_t ArtField::GetChar(const Object* object) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800119 DCHECK_EQ(Primitive::kPrimChar, FieldHelper(this).GetTypeAsPrimitiveType())
120 << PrettyField(this);
121 return Get32(object);
122}
123
Brian Carlstromea46f952013-07-30 01:26:50 -0700124inline void ArtField::SetChar(Object* object, uint16_t c) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800125 DCHECK_EQ(Primitive::kPrimChar, FieldHelper(this).GetTypeAsPrimitiveType())
126 << PrettyField(this);
127 Set32(object, c);
128}
129
Brian Carlstromea46f952013-07-30 01:26:50 -0700130inline int16_t ArtField::GetShort(const Object* object) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800131 DCHECK_EQ(Primitive::kPrimShort, FieldHelper(this).GetTypeAsPrimitiveType())
132 << PrettyField(this);
133 return Get32(object);
134}
135
Brian Carlstromea46f952013-07-30 01:26:50 -0700136inline void ArtField::SetShort(Object* object, int16_t s) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800137 DCHECK_EQ(Primitive::kPrimShort, FieldHelper(this).GetTypeAsPrimitiveType())
138 << PrettyField(this);
139 Set32(object, s);
140}
141
Brian Carlstromea46f952013-07-30 01:26:50 -0700142inline int32_t ArtField::GetInt(const Object* object) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800143#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
Brian Carlstromea46f952013-07-30 01:26:50 -0700150inline void ArtField::SetInt(Object* object, int32_t i) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800151#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
Brian Carlstromea46f952013-07-30 01:26:50 -0700158inline int64_t ArtField::GetLong(const Object* object) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800159#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
Brian Carlstromea46f952013-07-30 01:26:50 -0700166inline void ArtField::SetLong(Object* object, int64_t j) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800167#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
Brian Carlstromea46f952013-07-30 01:26:50 -0700174inline float ArtField::GetFloat(const Object* object) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800175 DCHECK_EQ(Primitive::kPrimFloat, FieldHelper(this).GetTypeAsPrimitiveType())
176 << PrettyField(this);
177 JValue bits;
178 bits.SetI(Get32(object));
179 return bits.GetF();
180}
181
Brian Carlstromea46f952013-07-30 01:26:50 -0700182inline void ArtField::SetFloat(Object* object, float f) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800183 DCHECK_EQ(Primitive::kPrimFloat, FieldHelper(this).GetTypeAsPrimitiveType())
184 << PrettyField(this);
185 JValue bits;
186 bits.SetF(f);
187 Set32(object, bits.GetI());
188}
189
Brian Carlstromea46f952013-07-30 01:26:50 -0700190inline double ArtField::GetDouble(const Object* object) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800191 DCHECK_EQ(Primitive::kPrimDouble, FieldHelper(this).GetTypeAsPrimitiveType())
192 << PrettyField(this);
193 JValue bits;
194 bits.SetJ(Get64(object));
195 return bits.GetD();
196}
197
Brian Carlstromea46f952013-07-30 01:26:50 -0700198inline void ArtField::SetDouble(Object* object, double d) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800199 DCHECK_EQ(Primitive::kPrimDouble, FieldHelper(this).GetTypeAsPrimitiveType())
200 << PrettyField(this);
201 JValue bits;
202 bits.SetD(d);
203 Set64(object, bits.GetJ());
204}
205
Brian Carlstromea46f952013-07-30 01:26:50 -0700206inline Object* ArtField::GetObject(const Object* object) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800207 DCHECK_EQ(Primitive::kPrimNot, FieldHelper(this).GetTypeAsPrimitiveType())
208 << PrettyField(this);
209 return GetObj(object);
210}
211
Brian Carlstromea46f952013-07-30 01:26:50 -0700212inline void ArtField::SetObject(Object* object, const Object* l) const {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800213 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
Brian Carlstromea46f952013-07-30 01:26:50 -0700221#endif // ART_RUNTIME_MIRROR_ART_FIELD_INL_H_