1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef PANDA_RUNTIME_INCLUDE_OBJECT_HEADER_INL_H_
17 #define PANDA_RUNTIME_INCLUDE_OBJECT_HEADER_INL_H_
18
19 #include "runtime/include/class-inl.h"
20 #include "runtime/include/field.h"
21 #include "runtime/include/object_accessor-inl.h"
22 #include "runtime/include/object_header.h"
23
24 namespace panda {
25
IsInstanceOf(Class * klass)26 inline bool ObjectHeader::IsInstanceOf(Class *klass)
27 {
28 return klass->IsAssignableFrom(ClassAddr<Class>());
29 }
30
31 // CODECHECK-NOLINTNEXTLINE(C_RULE_ID_COMMENT_LOCATION)
32 template <class T, bool is_volatile /* = false */>
GetFieldPrimitive(size_t offset)33 inline T ObjectHeader::GetFieldPrimitive(size_t offset) const
34 {
35 return ObjectAccessor::GetPrimitive<T, is_volatile>(this, offset);
36 }
37
38 // CODECHECK-NOLINTNEXTLINE(C_RULE_ID_COMMENT_LOCATION)
39 template <class T, bool is_volatile /* = false */>
SetFieldPrimitive(size_t offset,T value)40 inline void ObjectHeader::SetFieldPrimitive(size_t offset, T value)
41 {
42 ObjectAccessor::SetPrimitive<T, is_volatile>(this, offset, value);
43 }
44
45 // CODECHECK-NOLINTNEXTLINE(C_RULE_ID_HORIZON_SPACE, C_RULE_ID_COMMENT_LOCATION)
46 template <bool is_volatile /* = false */, bool need_read_barrier /* = true */, bool is_dyn /* = false */>
GetFieldObject(int offset)47 inline ObjectHeader *ObjectHeader::GetFieldObject(int offset) const
48 {
49 return ObjectAccessor::GetObject<is_volatile, need_read_barrier, is_dyn>(this, offset);
50 }
51
52 // CODECHECK-NOLINTNEXTLINE(C_RULE_ID_HORIZON_SPACE, C_RULE_ID_COMMENT_LOCATION)
53 template <bool is_volatile /* = false */, bool need_write_barrier /* = true */, bool is_dyn /* = false */>
SetFieldObject(size_t offset,ObjectHeader * value)54 inline void ObjectHeader::SetFieldObject(size_t offset, ObjectHeader *value)
55 {
56 ObjectAccessor::SetObject<is_volatile, need_write_barrier, is_dyn>(this, offset, value);
57 }
58
59 template <class T>
GetFieldPrimitive(const Field & field)60 inline T ObjectHeader::GetFieldPrimitive(const Field &field) const
61 {
62 return ObjectAccessor::GetFieldPrimitive<T>(this, field);
63 }
64
65 template <class T>
SetFieldPrimitive(const Field & field,T value)66 inline void ObjectHeader::SetFieldPrimitive(const Field &field, T value)
67 {
68 ObjectAccessor::SetFieldPrimitive(this, field, value);
69 }
70
71 // CODECHECK-NOLINTNEXTLINE(C_RULE_ID_HORIZON_SPACE, C_RULE_ID_COMMENT_LOCATION)
72 template <bool need_read_barrier /* = true */, bool is_dyn /* = false */>
GetFieldObject(const Field & field)73 inline ObjectHeader *ObjectHeader::GetFieldObject(const Field &field) const
74 {
75 return ObjectAccessor::GetFieldObject<need_read_barrier, is_dyn>(this, field);
76 }
77
78 // CODECHECK-NOLINTNEXTLINE(C_RULE_ID_HORIZON_SPACE, C_RULE_ID_COMMENT_LOCATION)
79 template <bool need_write_barrier /* = true */, bool is_dyn /* = false */>
SetFieldObject(const Field & field,ObjectHeader * value)80 inline void ObjectHeader::SetFieldObject(const Field &field, ObjectHeader *value)
81 {
82 ObjectAccessor::SetFieldObject<need_write_barrier, is_dyn>(this, field, value);
83 }
84
85 // CODECHECK-NOLINTNEXTLINE(C_RULE_ID_HORIZON_SPACE, C_RULE_ID_COMMENT_LOCATION)
86 template <bool need_read_barrier /* = true */, bool is_dyn /* = false */>
GetFieldObject(ManagedThread * thread,const Field & field)87 inline ObjectHeader *ObjectHeader::GetFieldObject(ManagedThread *thread, const Field &field)
88 {
89 return ObjectAccessor::GetFieldObject<need_read_barrier, is_dyn>(thread, this, field);
90 }
91
92 // CODECHECK-NOLINTNEXTLINE(C_RULE_ID_HORIZON_SPACE, C_RULE_ID_COMMENT_LOCATION)
93 template <bool need_write_barrier /* = true */, bool is_dyn /* = false */>
SetFieldObject(ManagedThread * thread,const Field & field,ObjectHeader * value)94 inline void ObjectHeader::SetFieldObject(ManagedThread *thread, const Field &field, ObjectHeader *value)
95 {
96 ObjectAccessor::SetFieldObject<need_write_barrier, is_dyn>(thread, this, field, value);
97 }
98
99 // CODECHECK-NOLINTNEXTLINE(C_RULE_ID_HORIZON_SPACE, C_RULE_ID_COMMENT_LOCATION)
100 template <bool is_volatile /* = false */, bool need_write_barrier /* = true */, bool is_dyn /* = false */>
SetFieldObject(ManagedThread * thread,size_t offset,ObjectHeader * value)101 inline void ObjectHeader::SetFieldObject(ManagedThread *thread, size_t offset, ObjectHeader *value)
102 {
103 ObjectAccessor::SetObject<is_volatile, need_write_barrier, is_dyn>(thread, this, offset, value);
104 }
105
106 template <class T>
GetFieldPrimitive(size_t offset,std::memory_order memory_order)107 inline T ObjectHeader::GetFieldPrimitive(size_t offset, std::memory_order memory_order) const
108 {
109 return ObjectAccessor::GetFieldPrimitive<T>(this, offset, memory_order);
110 }
111
112 template <class T>
SetFieldPrimitive(size_t offset,T value,std::memory_order memory_order)113 inline void ObjectHeader::SetFieldPrimitive(size_t offset, T value, std::memory_order memory_order)
114 {
115 ObjectAccessor::SetFieldPrimitive(this, offset, value, memory_order);
116 }
117
118 // CODECHECK-NOLINTNEXTLINE(C_RULE_ID_HORIZON_SPACE, C_RULE_ID_COMMENT_LOCATION)
119 template <bool need_read_barrier /* = true */, bool is_dyn /* = false */>
GetFieldObject(size_t offset,std::memory_order memory_order)120 inline ObjectHeader *ObjectHeader::GetFieldObject(size_t offset, std::memory_order memory_order) const
121 {
122 return ObjectAccessor::GetFieldObject<need_read_barrier, is_dyn>(this, offset, memory_order);
123 }
124
125 // CODECHECK-NOLINTNEXTLINE(C_RULE_ID_HORIZON_SPACE, C_RULE_ID_COMMENT_LOCATION)
126 template <bool need_write_barrier /* = true */, bool is_dyn /* = false */>
SetFieldObject(size_t offset,ObjectHeader * value,std::memory_order memory_order)127 inline void ObjectHeader::SetFieldObject(size_t offset, ObjectHeader *value, std::memory_order memory_order)
128 {
129 ObjectAccessor::SetFieldObject<need_write_barrier, is_dyn>(this, offset, value, memory_order);
130 }
131
132 template <typename T>
CompareAndSetFieldPrimitive(size_t offset,T old_value,T new_value,std::memory_order memory_order,bool strong)133 inline bool ObjectHeader::CompareAndSetFieldPrimitive(size_t offset, T old_value, T new_value,
134 std::memory_order memory_order, bool strong)
135 {
136 return ObjectAccessor::CompareAndSetFieldPrimitive(this, offset, old_value, new_value, memory_order, strong).first;
137 }
138
139 // CODECHECK-NOLINTNEXTLINE(C_RULE_ID_HORIZON_SPACE, C_RULE_ID_COMMENT_LOCATION)
140 template <bool need_write_barrier /* = true */, bool is_dyn /* = false */>
CompareAndSetFieldObject(size_t offset,ObjectHeader * old_value,ObjectHeader * new_value,std::memory_order memory_order,bool strong)141 inline bool ObjectHeader::CompareAndSetFieldObject(size_t offset, ObjectHeader *old_value, ObjectHeader *new_value,
142 std::memory_order memory_order, bool strong)
143 {
144 return ObjectAccessor::CompareAndSetFieldObject<need_write_barrier, is_dyn>(this, offset, old_value, new_value,
145 memory_order, strong)
146 .first;
147 }
148
149 template <typename T>
CompareAndExchangeFieldPrimitive(size_t offset,T old_value,T new_value,std::memory_order memory_order,bool strong)150 inline T ObjectHeader::CompareAndExchangeFieldPrimitive(size_t offset, T old_value, T new_value,
151 std::memory_order memory_order, bool strong)
152 {
153 return ObjectAccessor::CompareAndSetFieldPrimitive(this, offset, old_value, new_value, memory_order, strong).second;
154 }
155
156 // CODECHECK-NOLINTNEXTLINE(C_RULE_ID_HORIZON_SPACE, C_RULE_ID_COMMENT_LOCATION)
157 template <bool need_write_barrier /* = true */, bool is_dyn /* = false */>
CompareAndExchangeFieldObject(size_t offset,ObjectHeader * old_value,ObjectHeader * new_value,std::memory_order memory_order,bool strong)158 inline ObjectHeader *ObjectHeader::CompareAndExchangeFieldObject(size_t offset, ObjectHeader *old_value,
159 ObjectHeader *new_value,
160 std::memory_order memory_order, bool strong)
161 {
162 return ObjectAccessor::CompareAndSetFieldObject<need_write_barrier, is_dyn>(this, offset, old_value, new_value,
163 memory_order, strong)
164 .second;
165 }
166
167 template <typename T>
GetAndSetFieldPrimitive(size_t offset,T value,std::memory_order memory_order)168 inline T ObjectHeader::GetAndSetFieldPrimitive(size_t offset, T value, std::memory_order memory_order)
169 {
170 return ObjectAccessor::GetAndSetFieldPrimitive(this, offset, value, memory_order);
171 }
172
173 // CODECHECK-NOLINTNEXTLINE(C_RULE_ID_HORIZON_SPACE, C_RULE_ID_COMMENT_LOCATION)
174 template <bool need_write_barrier /* = true */, bool is_dyn /* = false */>
GetAndSetFieldObject(size_t offset,ObjectHeader * value,std::memory_order memory_order)175 inline ObjectHeader *ObjectHeader::GetAndSetFieldObject(size_t offset, ObjectHeader *value,
176 std::memory_order memory_order)
177 {
178 return ObjectAccessor::GetAndSetFieldObject<need_write_barrier, is_dyn>(this, offset, value, memory_order);
179 }
180
181 template <typename T>
GetAndAddFieldPrimitive(size_t offset,T value,std::memory_order memory_order)182 inline T ObjectHeader::GetAndAddFieldPrimitive(size_t offset, T value, std::memory_order memory_order)
183 {
184 return ObjectAccessor::GetAndAddFieldPrimitive(this, offset, value, memory_order);
185 }
186
187 template <typename T>
GetAndBitwiseOrFieldPrimitive(size_t offset,T value,std::memory_order memory_order)188 inline T ObjectHeader::GetAndBitwiseOrFieldPrimitive(size_t offset, T value, std::memory_order memory_order)
189 {
190 return ObjectAccessor::GetAndBitwiseOrFieldPrimitive(this, offset, value, memory_order);
191 }
192
193 template <typename T>
GetAndBitwiseAndFieldPrimitive(size_t offset,T value,std::memory_order memory_order)194 inline T ObjectHeader::GetAndBitwiseAndFieldPrimitive(size_t offset, T value, std::memory_order memory_order)
195 {
196 return ObjectAccessor::GetAndBitwiseAndFieldPrimitive(this, offset, value, memory_order);
197 }
198
199 template <typename T>
GetAndBitwiseXorFieldPrimitive(size_t offset,T value,std::memory_order memory_order)200 inline T ObjectHeader::GetAndBitwiseXorFieldPrimitive(size_t offset, T value, std::memory_order memory_order)
201 {
202 return ObjectAccessor::GetAndBitwiseXorFieldPrimitive(this, offset, value, memory_order);
203 }
204
205 } // namespace panda
206
207 #endif // PANDA_RUNTIME_INCLUDE_OBJECT_HEADER_INL_H_
208