Commit 1959359a authored by erik.corry@gmail.com's avatar erik.corry@gmail.com

Speed up cloning objects by avoiding a write barrier check.

Review URL: http://codereview.chromium.org/8274032

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9622 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent fe747260
...@@ -3695,6 +3695,8 @@ MaybeObject* Heap::CopyJSObject(JSObject* source) { ...@@ -3695,6 +3695,8 @@ MaybeObject* Heap::CopyJSObject(JSObject* source) {
int object_size = map->instance_size(); int object_size = map->instance_size();
Object* clone; Object* clone;
WriteBarrierMode wb_mode = UPDATE_WRITE_BARRIER;
// If we're forced to always allocate, we use the general allocation // If we're forced to always allocate, we use the general allocation
// functions which may leave us with an object in old space. // functions which may leave us with an object in old space.
if (always_allocate()) { if (always_allocate()) {
...@@ -3711,6 +3713,7 @@ MaybeObject* Heap::CopyJSObject(JSObject* source) { ...@@ -3711,6 +3713,7 @@ MaybeObject* Heap::CopyJSObject(JSObject* source) {
JSObject::kHeaderSize, JSObject::kHeaderSize,
(object_size - JSObject::kHeaderSize) / kPointerSize); (object_size - JSObject::kHeaderSize) / kPointerSize);
} else { } else {
wb_mode = SKIP_WRITE_BARRIER;
{ MaybeObject* maybe_clone = new_space_.AllocateRaw(object_size); { MaybeObject* maybe_clone = new_space_.AllocateRaw(object_size);
if (!maybe_clone->ToObject(&clone)) return maybe_clone; if (!maybe_clone->ToObject(&clone)) return maybe_clone;
} }
...@@ -3739,7 +3742,7 @@ MaybeObject* Heap::CopyJSObject(JSObject* source) { ...@@ -3739,7 +3742,7 @@ MaybeObject* Heap::CopyJSObject(JSObject* source) {
} }
if (!maybe_elem->ToObject(&elem)) return maybe_elem; if (!maybe_elem->ToObject(&elem)) return maybe_elem;
} }
JSObject::cast(clone)->set_elements(FixedArrayBase::cast(elem)); JSObject::cast(clone)->set_elements(FixedArrayBase::cast(elem), wb_mode);
} }
// Update properties if necessary. // Update properties if necessary.
if (properties->length() > 0) { if (properties->length() > 0) {
...@@ -3747,7 +3750,7 @@ MaybeObject* Heap::CopyJSObject(JSObject* source) { ...@@ -3747,7 +3750,7 @@ MaybeObject* Heap::CopyJSObject(JSObject* source) {
{ MaybeObject* maybe_prop = CopyFixedArray(properties); { MaybeObject* maybe_prop = CopyFixedArray(properties);
if (!maybe_prop->ToObject(&prop)) return maybe_prop; if (!maybe_prop->ToObject(&prop)) return maybe_prop;
} }
JSObject::cast(clone)->set_properties(FixedArray::cast(prop)); JSObject::cast(clone)->set_properties(FixedArray::cast(prop), wb_mode);
} }
// Return the new clone. // Return the new clone.
return clone; return clone;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment