Index: src/transitions.cc |
diff --git a/src/transitions.cc b/src/transitions.cc |
index d646eb80c888f287b42ec346ccc9585c22a4b622..c39534bbb566a2930934d2a56482517a2d18e1c6 100644 |
--- a/src/transitions.cc |
+++ b/src/transitions.cc |
@@ -17,11 +17,11 @@ |
Handle<Map> target, SimpleTransitionFlag flag) { |
Isolate* isolate = map->GetIsolate(); |
target->SetBackPointer(*map); |
- Handle<WeakCell> cell = Map::WeakCellForMap(target); |
// If the map doesn't have any transitions at all yet, install the new one. |
if (CanStoreSimpleTransition(map->raw_transitions())) { |
if (flag == SIMPLE_PROPERTY_TRANSITION) { |
+ Handle<WeakCell> cell = Map::WeakCellForMap(target); |
ReplaceTransitions(map, *cell); |
return; |
} |
@@ -42,6 +42,7 @@ |
if (flag == SIMPLE_PROPERTY_TRANSITION && key->Equals(*name) && |
old_details.kind() == new_details.kind() && |
old_details.attributes() == new_details.attributes()) { |
+ Handle<WeakCell> cell = Map::WeakCellForMap(target); |
ReplaceTransitions(map, *cell); |
return; |
} |
@@ -50,8 +51,8 @@ |
// Re-read existing data; the allocation might have caused it to be cleared. |
if (IsSimpleTransition(map->raw_transitions())) { |
old_target = GetSimpleTransition(map->raw_transitions()); |
- result->Set(0, GetSimpleTransitionKey(old_target), |
- GetSimpleTransitionCell(map->raw_transitions())); |
+ result->NoIncrementalWriteBarrierSet( |
+ 0, GetSimpleTransitionKey(old_target), old_target); |
} else { |
result->SetNumberOfTransitions(0); |
} |
@@ -82,7 +83,7 @@ |
&insertion_index); |
// If an existing entry was found, overwrite it and return. |
if (index != kNotFound) { |
- array->SetTargetCell(index, *cell); |
+ array->SetTarget(index, *target); |
return; |
} |
@@ -95,10 +96,10 @@ |
array->SetNumberOfTransitions(new_nof); |
for (index = number_of_transitions; index > insertion_index; --index) { |
array->SetKey(index, array->GetKey(index - 1)); |
- array->SetTargetCell(index, array->GetTargetCell(index - 1)); |
+ array->SetTarget(index, array->GetTarget(index - 1)); |
} |
array->SetKey(index, *name); |
- array->SetTargetCell(index, *cell); |
+ array->SetTarget(index, *target); |
SLOW_DCHECK(array->IsSortedNoDuplicates()); |
return; |
} |
@@ -144,11 +145,11 @@ |
DCHECK_NE(kNotFound, insertion_index); |
for (int i = 0; i < insertion_index; ++i) { |
- result->CopyFrom(array, i, i); |
- } |
- result->Set(insertion_index, *name, *cell); |
+ result->NoIncrementalWriteBarrierCopyFrom(array, i, i); |
+ } |
+ result->NoIncrementalWriteBarrierSet(insertion_index, *name, *target); |
for (int i = insertion_index; i < number_of_transitions; ++i) { |
- result->CopyFrom(array, i, i + 1); |
+ result->NoIncrementalWriteBarrierCopyFrom(array, i, i + 1); |
} |
SLOW_DCHECK(result->IsSortedNoDuplicates()); |
@@ -348,10 +349,12 @@ |
} |
-void TransitionArray::CopyFrom(TransitionArray* origin, int origin_transition, |
- int target_transition) { |
- Set(target_transition, origin->GetKey(origin_transition), |
- origin->GetTargetCell(origin_transition)); |
+void TransitionArray::NoIncrementalWriteBarrierCopyFrom(TransitionArray* origin, |
+ int origin_transition, |
+ int target_transition) { |
+ NoIncrementalWriteBarrierSet(target_transition, |
+ origin->GetKey(origin_transition), |
+ origin->GetTarget(origin_transition)); |
} |
@@ -419,9 +422,9 @@ |
result->Shrink(ToKeyIndex(0)); |
result->SetNumberOfTransitions(0); |
} else if (nof == 1) { |
- WeakCell* target_cell = GetSimpleTransitionCell(raw_transitions); |
- Name* key = GetSimpleTransitionKey(Map::cast(target_cell->value())); |
- result->Set(0, key, target_cell); |
+ Map* target = GetSimpleTransition(raw_transitions); |
+ Name* key = GetSimpleTransitionKey(target); |
+ result->NoIncrementalWriteBarrierSet(0, key, target); |
} |
ReplaceTransitions(map, *result); |
} |