Revision: 12519
Author: [email protected]
Date: Fri Sep 14 08:10:31 2012
Log: Moving the WhitenessWitness back to DescriptorArray.
TransitionArrays never allocate while being created.
Review URL: https://chromiumcodereview.appspot.com/10908237
http://code.google.com/p/v8/source/detail?r=12519
Modified:
/branches/bleeding_edge/src/objects-inl.h
/branches/bleeding_edge/src/objects.cc
/branches/bleeding_edge/src/objects.h
/branches/bleeding_edge/src/transitions-inl.h
/branches/bleeding_edge/src/transitions.cc
/branches/bleeding_edge/src/transitions.h
=======================================
--- /branches/bleeding_edge/src/objects-inl.h Wed Sep 12 09:43:57 2012
+++ /branches/bleeding_edge/src/objects-inl.h Fri Sep 14 08:10:31 2012
@@ -2167,14 +2167,14 @@
}
-FixedArray::WhitenessWitness::WhitenessWitness(FixedArray* array)
+DescriptorArray::WhitenessWitness::WhitenessWitness(FixedArray* array)
: marking_(array->GetHeap()->incremental_marking()) {
marking_->EnterNoMarkingScope();
ASSERT(Marking::Color(array) == Marking::WHITE_OBJECT);
}
-FixedArray::WhitenessWitness::~WhitenessWitness() {
+DescriptorArray::WhitenessWitness::~WhitenessWitness() {
marking_->LeaveNoMarkingScope();
}
=======================================
--- /branches/bleeding_edge/src/objects.cc Fri Sep 14 06:15:43 2012
+++ /branches/bleeding_edge/src/objects.cc Fri Sep 14 08:10:31 2012
@@ -5022,7 +5022,7 @@
DescriptorArray* new_descriptors;
MaybeObject* maybe_descriptors = DescriptorArray::Allocate(old_size + 1);
if (!maybe_descriptors->To(&new_descriptors)) return maybe_descriptors;
- FixedArray::WhitenessWitness witness(new_descriptors);
+ DescriptorArray::WhitenessWitness witness(new_descriptors);
for (int i = 0; i < old_size; ++i) {
new_descriptors->CopyFrom(i, descriptors, i, witness);
@@ -5212,7 +5212,7 @@
MaybeObject* maybe_descriptors = DescriptorArray::Allocate(old_size + 1);
if (!maybe_descriptors->To(&new_descriptors)) return maybe_descriptors;
- FixedArray::WhitenessWitness witness(new_descriptors);
+ DescriptorArray::WhitenessWitness witness(new_descriptors);
// Copy the descriptors, inserting a descriptor.
for (int i = 0; i < old_size; ++i) {
@@ -12921,7 +12921,7 @@
return maybe_descriptors;
}
- FixedArray::WhitenessWitness witness(descriptors);
+ DescriptorArray::WhitenessWitness witness(descriptors);
int number_of_allocated_fields =
number_of_fields + unused_property_fields - inobject_props;
=======================================
--- /branches/bleeding_edge/src/objects.h Fri Sep 14 06:15:43 2012
+++ /branches/bleeding_edge/src/objects.h Fri Sep 14 08:10:31 2012
@@ -2375,23 +2375,6 @@
}
};
- // WhitenessWitness is used to prove that a descriptor array is white
- // (unmarked), so incremental write barriers can be skipped because the
- // marking invariant cannot be broken and slots pointing into evacuation
- // candidates will be discovered when the object is scanned. A witness is
- // always stack-allocated right after creating an array. By allocating a
- // witness, incremental marking is globally disabled. The witness is then
- // passed along wherever needed to statically prove that the array is
known to
- // be white.
- class WhitenessWitness {
- public:
- inline explicit WhitenessWitness(FixedArray* array);
- inline ~WhitenessWitness();
-
- private:
- IncrementalMarking* marking_;
- };
-
protected:
// Set operation on FixedArray without using write barriers. Can
// only be used for storing old space objects or smis.
@@ -2475,6 +2458,23 @@
// [length() - kDescriptorSize]: last key
class DescriptorArray: public FixedArray {
public:
+ // WhitenessWitness is used to prove that a descriptor array is white
+ // (unmarked), so incremental write barriers can be skipped because the
+ // marking invariant cannot be broken and slots pointing into evacuation
+ // candidates will be discovered when the object is scanned. A witness is
+ // always stack-allocated right after creating an array. By allocating a
+ // witness, incremental marking is globally disabled. The witness is then
+ // passed along wherever needed to statically prove that the array is
known to
+ // be white.
+ class WhitenessWitness {
+ public:
+ inline explicit WhitenessWitness(FixedArray* array);
+ inline ~WhitenessWitness();
+
+ private:
+ IncrementalMarking* marking_;
+ };
+
// Returns true for both shared empty_descriptor_array and for smis,
which the
// map uses to encode additional bit fields when the descriptor array is
not
// yet used.
=======================================
--- /branches/bleeding_edge/src/transitions-inl.h Wed Sep 12 09:43:57 2012
+++ /branches/bleeding_edge/src/transitions-inl.h Fri Sep 14 08:10:31 2012
@@ -200,16 +200,13 @@
}
-void TransitionArray::Set(int transition_number,
- String* key,
- Map* target,
- const WhitenessWitness&) {
- NoIncrementalWriteBarrierSet(this,
- ToKeyIndex(transition_number),
- key);
- NoIncrementalWriteBarrierSet(this,
- ToTargetIndex(transition_number),
- target);
+void TransitionArray::NoIncrementalWriteBarrierSet(int transition_number,
+ String* key,
+ Map* target) {
+ FixedArray::NoIncrementalWriteBarrierSet(
+ this, ToKeyIndex(transition_number), key);
+ FixedArray::NoIncrementalWriteBarrierSet(
+ this, ToTargetIndex(transition_number), target);
}
=======================================
--- /branches/bleeding_edge/src/transitions.cc Wed Sep 12 09:43:57 2012
+++ /branches/bleeding_edge/src/transitions.cc Fri Sep 14 08:10:31 2012
@@ -58,14 +58,12 @@
}
-void TransitionArray::CopyFrom(TransitionArray* origin,
- int origin_transition,
- int target_transition,
- const WhitenessWitness& witness) {
- Set(target_transition,
- origin->GetKey(origin_transition),
- origin->GetTarget(origin_transition),
- witness);
+void TransitionArray::NoIncrementalWriteBarrierCopyFrom(TransitionArray*
origin,
+ int
origin_transition,
+ int
target_transition) {
+ NoIncrementalWriteBarrierSet(target_transition,
+ origin->GetKey(origin_transition),
+ origin->GetTarget(origin_transition));
}
@@ -84,9 +82,7 @@
MaybeObject* maybe_array = TransitionArray::Allocate(1,
descriptors_pointer);
if (!maybe_array->To(&result)) return maybe_array;
- FixedArray::WhitenessWitness witness(result);
-
- result->Set(0, name, target, witness);
+ result->NoIncrementalWriteBarrierSet(0, name, target);
result->set_back_pointer_storage(back_pointer);
return result;
}
@@ -112,27 +108,29 @@
if (HasPrototypeTransitions()) {
result->SetPrototypeTransitions(GetPrototypeTransitions());
}
-
- FixedArray::WhitenessWitness witness(result);
if (insertion_index != kNotFound) {
for (int i = 0; i < number_of_transitions; ++i) {
- if (i != insertion_index) result->CopyFrom(this, i, i, witness);
+ if (i != insertion_index) {
+ result->NoIncrementalWriteBarrierCopyFrom(this, i, i);
+ }
}
- result->Set(insertion_index, name, target, witness);
+ result->NoIncrementalWriteBarrierSet(insertion_index, name, target);
return result;
}
insertion_index = 0;
for (; insertion_index < number_of_transitions; ++insertion_index) {
if (InsertionPointFound(GetKey(insertion_index), name)) break;
- result->CopyFrom(this, insertion_index, insertion_index, witness);
+ result->NoIncrementalWriteBarrierCopyFrom(
+ this, insertion_index, insertion_index);
}
- result->Set(insertion_index, name, target, witness);
+ result->NoIncrementalWriteBarrierSet(insertion_index, name, target);
for (; insertion_index < number_of_transitions; ++insertion_index) {
- result->CopyFrom(this, insertion_index, insertion_index + 1, witness);
+ result->NoIncrementalWriteBarrierCopyFrom(
+ this, insertion_index, insertion_index + 1);
}
result->set_back_pointer_storage(back_pointer_storage());
=======================================
--- /branches/bleeding_edge/src/transitions.h Wed Sep 12 09:43:57 2012
+++ /branches/bleeding_edge/src/transitions.h Fri Sep 14 08:10:31 2012
@@ -111,10 +111,9 @@
MUST_USE_RESULT MaybeObject* CopyInsert(String* name, Map* target);
// Copy a single transition from the origin array.
- inline void CopyFrom(TransitionArray* origin,
- int origin_transition,
- int target_transition,
- const WhitenessWitness& witness);
+ inline void NoIncrementalWriteBarrierCopyFrom(TransitionArray* origin,
+ int origin_transition,
+ int target_transition);
// Search a transition for a given property name.
inline int Search(String* name);
@@ -182,10 +181,9 @@
kTransitionTarget;
}
- inline void Set(int transition_number,
- String* key,
- Map* target,
- const WhitenessWitness&);
+ inline void NoIncrementalWriteBarrierSet(int transition_number,
+ String* key,
+ Map* target);
DISALLOW_IMPLICIT_CONSTRUCTORS(TransitionArray);
};
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev