Index: src/heap.cc |
=================================================================== |
--- src/heap.cc (revision 465) |
+++ src/heap.cc (working copy) |
@@ -733,11 +733,21 @@ |
int size) { |
void** src = reinterpret_cast<void**>((*source_p)->address()); |
void** dst = reinterpret_cast<void**>(target->address()); |
- int counter = size/kPointerSize - 1; |
- do { |
- *dst++ = *src++; |
- } while (counter-- > 0); |
+ // Use block copying memcpy if the object we're migrating is big |
+ // enough to justify the extra call/setup overhead. |
+ static const int kBlockCopyLimit = 16 * kPointerSize; |
+ |
+ if (size >= kBlockCopyLimit) { |
+ memcpy(dst, src, size); |
+ } else { |
+ int remaining = size / kPointerSize; |
+ do { |
+ remaining--; |
+ *dst++ = *src++; |
+ } while (remaining > 0); |
+ } |
+ |
// Set the forwarding address. |
(*source_p)->set_map_word(MapWord::FromForwardingAddress(target)); |