Revision: 10175
Author: [email protected]
Date: Tue Dec 6 05:00:40 2011
Log: Elide write barriers and remove some heap_object->GetHeap() calls
on
Smi write barriers.
Review URL: http://codereview.chromium.org/8822008
http://code.google.com/p/v8/source/detail?r=10175
Modified:
/branches/bleeding_edge/src/heap-inl.h
/branches/bleeding_edge/src/objects.cc
=======================================
--- /branches/bleeding_edge/src/heap-inl.h Wed Nov 23 05:08:28 2011
+++ /branches/bleeding_edge/src/heap-inl.h Tue Dec 6 05:00:40 2011
@@ -125,7 +125,8 @@
if (!maybe_result->ToObject(&result)) return maybe_result;
}
- reinterpret_cast<HeapObject*>(result)->set_map(map);
+ // String maps are all immortal immovable objects.
+ reinterpret_cast<HeapObject*>(result)->set_map_unsafe(map);
// Set length and hash fields of the allocated string.
String* answer = String::cast(result);
answer->set_length(str.length());
=======================================
--- /branches/bleeding_edge/src/objects.cc Tue Dec 6 04:11:08 2011
+++ /branches/bleeding_edge/src/objects.cc Tue Dec 6 05:00:40 2011
@@ -5392,7 +5392,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);
@@ -8112,9 +8114,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);
+ }
}
}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev