172 {
173 do {
174
175 ObjectPtr obj;
176 while (work_list_.
Pop(&obj)) {
177 if (sync && concurrent_ && obj->IsNewObject()) {
182 if (top <= addr && addr <
end) {
183 new_work_list_.
Push(obj);
184
185
187 remaining_budget -=
size;
188 if (remaining_budget < 0) {
189 return true;
190 }
191 continue;
192 }
193 }
194
195 const intptr_t class_id = obj->GetClassId();
199
201 if (class_id == kWeakPropertyCid) {
203 } else if (class_id == kWeakReferenceCid) {
205 } else if (class_id == kWeakArrayCid) {
207 } else if (class_id == kFinalizerEntryCid) {
209 } else if (sync && concurrent_ && class_id == kSuspendStateCid) {
210
211 deferred_work_list_.
Push(obj);
212 size = obj->untag()->HeapSize();
213 } else {
214 if ((class_id == kArrayCid) || (class_id == kImmutableArrayCid)) {
215 size = obj->untag()->HeapSize();
216 if (size > remaining_budget) {
217 work_list_.
Push(obj);
218 return true;
219 }
220 }
221 size = obj->untag()->VisitPointersNonvirtual(
this);
222 }
223 if (!obj->IsNewObject()) {
224 marked_bytes_ +=
size;
225 }
226 remaining_budget -=
size;
227 if (remaining_budget < 0) {
228 return true;
229 }
230 }
231
233
234 return false;
235 }
static constexpr intptr_t kObjectAlignment