| Index: src/objects.cc
|
| ===================================================================
|
| --- src/objects.cc (revision 10171)
|
| +++ src/objects.cc (working copy)
|
| @@ -5395,7 +5395,9 @@
|
| AssertNoAllocation no_gc;
|
| int len = length();
|
| if (new_length < len) len = new_length;
|
| - result->set_map(map());
|
| + // We are taking the map from the old fixed array so the map is sure to
|
| + // be an immortal immutable object.
|
| + result->set_map_unsafe(map());
|
| WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc);
|
| for (int i = 0; i < len; i++) {
|
| result->set(i, get(i), mode);
|
| @@ -8115,9 +8117,20 @@
|
| static void CopyFastElementsToFast(FixedArray* source,
|
| FixedArray* destination,
|
| WriteBarrierMode mode) {
|
| - uint32_t count = static_cast<uint32_t>(source->length());
|
| - for (uint32_t i = 0; i < count; ++i) {
|
| - destination->set(i, source->get(i), mode);
|
| + int count = source->length();
|
| + if (mode == SKIP_WRITE_BARRIER ||
|
| + !Page::FromAddress(destination->address())->IsFlagSet(
|
| + MemoryChunk::POINTERS_FROM_HERE_ARE_INTERESTING)) {
|
| + ASSERT(count <= destination->length());
|
| + Address to = destination->address() + FixedArray::kHeaderSize;
|
| + Address from = source->address() + FixedArray::kHeaderSize;
|
| + memcpy(reinterpret_cast<void*>(to),
|
| + reinterpret_cast<void*>(from),
|
| + kPointerSize * count);
|
| + } else {
|
| + for (int i = 0; i < count; ++i) {
|
| + destination->set(i, source->get(i), mode);
|
| + }
|
| }
|
| }
|
|
|
|
|