Revision: 9763
Author: [email protected]
Date: Tue Oct 25 01:24:06 2011
Log: Get the speed back in new context creation after it was tanked
in 9744.
Review URL: http://codereview.chromium.org/8380035
http://code.google.com/p/v8/source/detail?r=9763
Modified:
/branches/bleeding_edge/src/serialize.cc
=======================================
--- /branches/bleeding_edge/src/serialize.cc Mon Oct 24 05:39:29 2011
+++ /branches/bleeding_edge/src/serialize.cc Tue Oct 25 01:24:06 2011
@@ -759,6 +759,10 @@
int source_space,
Address current_object_address) {
Isolate* const isolate = isolate_;
+ bool write_barrier_needed = (current_object_address != NULL &&
+ source_space != NEW_SPACE &&
+ source_space != CELL_SPACE &&
+ source_space == OLD_DATA_SPACE);
while (current < limit) {
int data = source_->Get();
switch (data) {
@@ -778,28 +782,18 @@
if (where == kNewObject && how == kPlain && within ==
kStartOfObject) {\
ASSIGN_DEST_SPACE(space_number) \
ReadObject(space_number, dest_space,
current); \
- emit_write_barrier = (space_number == NEW_SPACE
&& \
- source_space != NEW_SPACE
&& \
- source_space !=
CELL_SPACE); \
+ emit_write_barrier = (space_number ==
NEW_SPACE); \
} else
{ \
Object* new_object = NULL; /* May not be a real Object pointer.
*/ \
if (where == kNewObject)
{ \
ASSIGN_DEST_SPACE(space_number) \
ReadObject(space_number, dest_space,
&new_object); \
} else if (where == kRootArray)
{ \
- if (source_space != CELL_SPACE
&& \
- source_space != CODE_SPACE
&& \
- source_space != OLD_DATA_SPACE)
{ \
- emit_write_barrier =
true; \
-
} \
+ emit_write_barrier =
true; \
int root_id =
source_->GetInt(); \
new_object =
isolate->heap()->roots_array_start()[root_id]; \
} else if (where == kPartialSnapshotCache)
{ \
- if (source_space != CELL_SPACE
&& \
- source_space != CODE_SPACE
&& \
- source_space != OLD_DATA_SPACE)
{ \
- emit_write_barrier =
true; \
-
} \
+ emit_write_barrier =
true; \
int cache_index =
source_->GetInt(); \
new_object =
isolate->serialize_partial_snapshot_cache() \
[cache_index]; \
@@ -809,16 +803,12 @@
Decode(reference_id); \
new_object =
reinterpret_cast<Object*>(address); \
} else if (where == kBackref)
{ \
- emit_write_barrier = (space_number == NEW_SPACE
&& \
- source_space != NEW_SPACE
&& \
- source_space !=
CELL_SPACE); \
+ emit_write_barrier = (space_number ==
NEW_SPACE); \
new_object = GetAddressFromEnd(data &
kSpaceMask); \
} else
{ \
ASSERT(where ==
kFromStart); \
if (offset_from_start == kUnknownOffsetFromStart)
{ \
- emit_write_barrier = (space_number == NEW_SPACE
&& \
- source_space != NEW_SPACE
&& \
- source_space !=
CELL_SPACE); \
+ emit_write_barrier = (space_number ==
NEW_SPACE); \
new_object = GetAddressFromStart(data &
kSpaceMask); \
} else
{ \
Address object_address = pages_[space_number][0]
+ \
@@ -845,14 +835,14 @@
*current =
new_object; \
} \
} \
- if (emit_write_barrier && current_object_address != NULL)
{ \
+ if (emit_write_barrier && write_barrier_needed)
{ \
Address current_address =
reinterpret_cast<Address>(current); \
isolate->heap()->RecordWrite( \
current_object_address, \
static_cast<int>(current_address -
current_object_address)); \
} \
if (!current_was_incremented)
{ \
- current++; /* Increment current if it wasn't done above.
*/ \
+
current++; \
} \
break; \
} \
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev