| Index: src/heap-inl.h
|
| diff --git a/src/heap-inl.h b/src/heap-inl.h
|
| index 3c1d4d274ba883a854d794f9eeef7763a4bb1dd9..6caa742f532b0503313846976383cf71de1aff40 100644
|
| --- a/src/heap-inl.h
|
| +++ b/src/heap-inl.h
|
| @@ -439,6 +439,43 @@ AllocationSpace Heap::TargetSpaceId(InstanceType type) {
|
| }
|
|
|
|
|
| +bool Heap::AllowedToBeMigrated(HeapObject* object, AllocationSpace dst) {
|
| + // Object migration is governed by the following rules:
|
| + //
|
| + // 1) Objects in new-space can be migrated to one of the old spaces
|
| + // that matches their target space or they stay in new-space.
|
| + // 2) Objects in old-space stay in the same space when migrating.
|
| + // 3) Fillers (two or more words) can migrate due to left-trimming of
|
| + // fixed arrays in new-space, old-data-space and old-pointer-space.
|
| + // 4) Fillers (one word) can never migrate, they are skipped by
|
| + // incremental marking explicitly to prevent invalid pattern.
|
| + //
|
| + // Since this function is used for debugging only, we do not place
|
| + // asserts here, but check everything explicitly.
|
| + if (object->map() == one_pointer_filler_map()) return false;
|
| + InstanceType type = object->map()->instance_type();
|
| + MemoryChunk* chunk = MemoryChunk::FromAddress(object->address());
|
| + AllocationSpace src = chunk->owner()->identity();
|
| + switch (src) {
|
| + case NEW_SPACE:
|
| + return dst == src || dst == TargetSpaceId(type);
|
| + case OLD_POINTER_SPACE:
|
| + return dst == src && (dst == TargetSpaceId(type) || object->IsFiller());
|
| + case OLD_DATA_SPACE:
|
| + return dst == src && dst == TargetSpaceId(type);
|
| + case CODE_SPACE:
|
| + return dst == src && type == CODE_TYPE;
|
| + case MAP_SPACE:
|
| + case CELL_SPACE:
|
| + case PROPERTY_CELL_SPACE:
|
| + case LO_SPACE:
|
| + return false;
|
| + }
|
| + UNREACHABLE();
|
| + return false;
|
| +}
|
| +
|
| +
|
| void Heap::CopyBlock(Address dst, Address src, int byte_size) {
|
| CopyWords(reinterpret_cast<Object**>(dst),
|
| reinterpret_cast<Object**>(src),
|
|
|