36 *
result->SizeAddress() = size;
51 return object->IsHeapObject() &&
object->IsForwardingCorpse();
58 return forwarder->
target();
69 FATAL(
"become: ForwardObjectTo failure.");
73 if (size_before != size_after) {
74 FATAL(
"become: Before and after sizes do not match.");
83 visiting_object_(nullptr) {}
86 for (
ObjectPtr* p = first; p <= last; p++) {
97 new_target = old_target;
99 if (visiting_object_ ==
nullptr) {
109#if defined(DART_COMPRESSED_POINTERS)
114 ObjectPtr old_target = p->Decompress(heap_base);
124 new_target = old_target;
126 if (visiting_object_ ==
nullptr) {
140 visiting_object_ = obj;
143 if ((obj !=
nullptr) && obj->IsOldObject() &&
161 : pointer_visitor_(pointer_visitor) {}
195#if defined(TARGET_ARCH_IA32)
196class WritableCodeLiteralsScope :
public ValueObject {
198 explicit WritableCodeLiteralsScope(Heap* heap) : heap_(heap) {
199 if (FLAG_write_protect_code) {
200 heap_->WriteProtectCode(
false);
205 if (FLAG_write_protect_code) {
206 heap_->WriteProtectCode(
true);
223 ASSERT(group->become() ==
nullptr);
224 group->set_become(
this);
232 pointers_.Add(before.
ptr());
233 pointers_.Add(after.
ptr());
237 if (pointers_.length() != 0) {
264 before->IsHeapObject() ? before->
untag()->
tags() : 0);
266 after->IsHeapObject() ? after->
untag()->
tags() : 0);
270 OS::PrintErr(
"before: %s\n", before_handle.ToCString());
276 if (pointers_.length() == 0) {
287 for (intptr_t i = 0; i < pointers_.length(); i += 2) {
291 if (before == after) {
294 if (before->IsImmediateObject()) {
297 if (after->IsImmediateObject()) {
314 heap->ForwardWeakEntries(before, after);
315#if defined(HASH_IN_OBJECT_HEADER)
316 Object::SetCachedHashIfNotSet(after, Object::GetCachedHash(before));
323 for (intptr_t i = 0; i < pointers_.length(); i += 2) {
324 ASSERT(pointers_[i] == pointers_[i + 1]);
334 Heap* heap = isolate_group->heap();
337 isolate_group->ReleaseStoreBuffers();
338 isolate_group->store_buffer()->Reset();
346 heap->VisitObjects(&object_visitor);
351 isolate_group->VisitObjectPointers(&pointer_visitor,
354 isolate_group->ForEachIsolate(
357 if (ring !=
nullptr) {
366 isolate_group->VisitWeakPersistentHandles(&handle_visitor);
static void FollowForwardingPointers(Thread *thread)
static void MakeDummyObject(const Instance &instance)
void VisitObjectPointers(ObjectPointerVisitor *visitor)
void Add(const Object &before, const Object &after)
static constexpr uword update(ClassIdTagType value, uword original)
ForwardHeapPointersHandleVisitor(Thread *thread)
void VisitHandle(uword addr) override
void VisitObject(ObjectPtr obj) override
ForwardHeapPointersVisitor(ForwardPointersVisitor *pointer_visitor)
void VisitPointers(ObjectPtr *first, ObjectPtr *last) override
ForwardPointersVisitor(Thread *thread)
void VisitingObject(ObjectPtr obj)
static ForwardingCorpse * AsForwarder(uword addr, intptr_t size)
void set_target(ObjectPtr target)
void set_become(Become *become)
ObjectIdRing * object_id_ring() const
static void static void PrintErr(const char *format,...) PRINTF_ATTRIBUTE(1
void VisitPointers(ObjectPointerVisitor *visitor)
virtual void VisitPointers(ObjectPtr *first, ObjectPtr *last)=0
IsolateGroup * isolate_group() const
void VisitCompressedPointers(uword heap_base, CompressedObjectPtr *first, CompressedObjectPtr *last)
bool IsFreeListElement() const
UntaggedObject * untag() const
bool IsForwardingCorpse() const
virtual const char * ToCString() const
static intptr_t tags_offset()
static Thread * Current()
IsolateGroup * isolate_group() const
static constexpr uword update(intptr_t size, uword tag)
static constexpr intptr_t kMaxSizeTag
void StorePointer(type const *addr, type value)
void StoreCompressedArrayPointer(compressed_type const *addr, type value)
void StoreArrayPointer(type const *addr, value_type value)
bool IsCardRemembered() const
intptr_t HeapSize() const
bool InVMIsolateHeap() const
void ClearRememberedBit()
intptr_t VisitPointers(ObjectPointerVisitor *visitor)
bool IsRemembered() const
void StoreCompressedPointer(compressed_type const *addr, type value)
static constexpr bool IsAligned(T x, uintptr_t alignment, uintptr_t offset=0)
~WritableCodeLiteralsScope()
WritableCodeLiteralsScope(Heap *heap)
DART_NOINLINE static DART_NORETURN void InvalidForwarding(ObjectPtr before, ObjectPtr after, const char *message)
static ObjectPtr GetForwardedObject(ObjectPtr object)
static constexpr intptr_t kOldObjectAlignmentOffset
static constexpr intptr_t kNewObjectAlignmentOffset
static void ForwardObjectTo(ObjectPtr before_obj, ObjectPtr after_obj)
static bool IsDummyObject(ObjectPtr object)
static bool IsForwardingObject(ObjectPtr object)
static constexpr intptr_t kObjectAlignment
#define TIMELINE_FUNCTION_GC_DURATION(thread, name)
#define OFFSET_OF(type, field)