Reviewers: Vyacheslav Egorov,
Description:
Bring back write barrier modes on the new GC branch.
Please review this at http://codereview.chromium.org/7846014/
SVN Base: http://v8.googlecode.com/svn/branches/experimental/gc/
Affected files:
M src/builtins.cc
M src/mark-compact.cc
M src/objects-inl.h
M src/runtime.cc
Index: src/builtins.cc
===================================================================
--- src/builtins.cc (revision 9191)
+++ src/builtins.cc (working copy)
@@ -562,9 +562,7 @@
}
if (!heap->lo_space()->Contains(elms)) {
- // As elms still in the same space they used to be,
- // there is no need to update region dirty mark.
- array->set_elements(LeftTrimFixedArray(heap, elms, 1),
SKIP_WRITE_BARRIER);
+ array->set_elements(LeftTrimFixedArray(heap, elms, 1));
} else {
// Shift the elements.
AssertNoAllocation no_gc;
@@ -853,7 +851,7 @@
}
elms = LeftTrimFixedArray(heap, elms, delta);
- array->set_elements(elms, SKIP_WRITE_BARRIER);
+ array->set_elements(elms);
} else {
AssertNoAllocation no_gc;
MoveElements(heap, &no_gc,
Index: src/mark-compact.cc
===================================================================
--- src/mark-compact.cc (revision 9191)
+++ src/mark-compact.cc (working copy)
@@ -2183,7 +2183,7 @@
heap_,
map_offset + new_number_of_transitions * step,
cached_map,
- SKIP_WRITE_BARRIER);
+ SKIP_WRITE_BARRIER);//Is this OK?
}
}
@@ -2192,6 +2192,8 @@
for (int i = new_number_of_transitions * step;
i < number_of_transitions * step;
i++) {
+ // The undefined object is on a page that is never compacted and
never
+ // in new space so it is OK to skip the write barrier.
prototype_transitions->set_unchecked(heap_,
header + i,
undefined,
Index: src/objects-inl.h
===================================================================
--- src/objects-inl.h (revision 9191)
+++ src/objects-inl.h (working copy)
@@ -83,7 +83,7 @@
type* holder::name() { return type::cast(READ_FIELD(this, offset)); } \
void holder::set_##name(type* value, WriteBarrierMode mode) { \
WRITE_FIELD(this, offset, value); \
- WRITE_BARRIER(GetHeap(), this, offset, value); \
+ CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); \
}
@@ -92,7 +92,7 @@
type* holder::name() { return type::cast(READ_FIELD(this, offset)); } \
void holder::set_##name(type* value, WriteBarrierMode mode) { \
WRITE_FIELD(this, offset, value); \
- WRITE_BARRIER(HEAP, this, offset, value); \
+ CONDITIONAL_WRITE_BARRIER(HEAP, this, offset, value, mode); \
}
@@ -920,6 +920,15 @@
if (heap->InNewSpace(value)) { \
heap->RecordWrite(object->address(), offset); \
}
+
+#define CONDITIONAL_WRITE_BARRIER(heap, object, offset, value, mode) \
+ if (mode == UPDATE_WRITE_BARRIER) { \
+ heap->incremental_marking()->RecordWrite( \
+ object, HeapObject::RawField(object, offset), value); \
+ if (heap->InNewSpace(value)) { \
+ heap->RecordWrite(object->address(), offset); \
+ } \
+ }
#ifndef V8_TARGET_ARCH_MIPS
#define READ_DOUBLE_FIELD(p, offset) \
@@ -1256,7 +1265,7 @@
value->IsFixedDoubleArray());
ASSERT(value->HasValidElements());
WRITE_FIELD(this, kElementsOffset, value);
- WRITE_BARRIER(GetHeap(), this, kElementsOffset, value);
+ CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, value, mode);
}
@@ -1437,7 +1446,7 @@
ASSERT(index < 0);
int offset = map()->instance_size() + (index * kPointerSize);
WRITE_FIELD(this, offset, value);
- WRITE_BARRIER(GetHeap(), this, offset, value);
+ CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
return value;
}
@@ -1645,7 +1654,9 @@
WriteBarrierMode HeapObject::GetWriteBarrierMode(const
AssertNoAllocation&) {
- if (GetHeap()->InNewSpace(this)) return SKIP_WRITE_BARRIER;
+ Heap* heap = GetHeap();
+ if (heap->incremental_marking()->IsMarking()) return
UPDATE_WRITE_BARRIER;
+ if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER;
return UPDATE_WRITE_BARRIER;
}
@@ -1657,7 +1668,7 @@
ASSERT(index >= 0 && index < this->length());
int offset = kHeaderSize + index * kPointerSize;
WRITE_FIELD(this, offset, value);
- WRITE_BARRIER(GetHeap(), this, offset, value);
+ CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
}
@@ -1722,7 +1733,7 @@
WriteBarrierMode mode) {
int offset = kHeaderSize + index * kPointerSize;
WRITE_FIELD(this, offset, value);
- WRITE_BARRIER(heap, this, offset, value);
+ CONDITIONAL_WRITE_BARRIER(heap, this, offset, value, mode);
}
@@ -2185,7 +2196,7 @@
void ConsString::set_first(String* value, WriteBarrierMode mode) {
WRITE_FIELD(this, kFirstOffset, value);
- WRITE_BARRIER(GetHeap(), this, kFirstOffset, value);
+ CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kFirstOffset, value, mode);
}
@@ -2201,7 +2212,7 @@
void ConsString::set_second(String* value, WriteBarrierMode mode) {
WRITE_FIELD(this, kSecondOffset, value);
- WRITE_BARRIER(GetHeap(), this, kSecondOffset, value);
+ CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kSecondOffset, value, mode);
}
@@ -3032,7 +3043,7 @@
void Map::set_prototype(Object* value, WriteBarrierMode mode) {
ASSERT(value->IsNull() || value->IsJSReceiver());
WRITE_FIELD(this, kPrototypeOffset, value);
- WRITE_BARRIER(GetHeap(), this, kPrototypeOffset, value);
+ CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kPrototypeOffset, value,
mode);
}
@@ -3120,7 +3131,8 @@
}
ASSERT(!is_shared());
WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, value);
- WRITE_BARRIER(heap, this, kInstanceDescriptorsOrBitField3Offset, value);
+ CONDITIONAL_WRITE_BARRIER(
+ heap, this, kInstanceDescriptorsOrBitField3Offset, value, mode);
}
@@ -3460,7 +3472,7 @@
void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) {
WRITE_FIELD(this, kCodeOffset, value);
- WRITE_BARRIER(value->GetHeap(), this, kCodeOffset, value);
+ CONDITIONAL_WRITE_BARRIER(value->GetHeap(), this, kCodeOffset, value,
mode);
}
@@ -3473,10 +3485,11 @@
void SharedFunctionInfo::set_scope_info(SerializedScopeInfo* value,
WriteBarrierMode mode) {
WRITE_FIELD(this, kScopeInfoOffset, reinterpret_cast<Object*>(value));
- WRITE_BARRIER(GetHeap(),
- this,
- kScopeInfoOffset,
- reinterpret_cast<Object*>(value));
+ CONDITIONAL_WRITE_BARRIER(GetHeap(),
+ this,
+ kScopeInfoOffset,
+ reinterpret_cast<Object*>(value),
+ mode);
}
@@ -3889,6 +3902,7 @@
if (value->IsSmi()) {
fa->set_unchecked(index, Smi::cast(value));
} else {
+ // We only do this during GC, so we don't need to notify the write
barrier.
fa->set_unchecked(heap, index, value, SKIP_WRITE_BARRIER);
}
}
@@ -4365,6 +4379,7 @@
void JSArray::set_length(Smi* length) {
+ // Don't need a write barrier for a Smi.
set_length(static_cast<Object*>(length), SKIP_WRITE_BARRIER);
}
Index: src/runtime.cc
===================================================================
--- src/runtime.cc (revision 9191)
+++ src/runtime.cc (working copy)
@@ -1782,7 +1782,7 @@
regexp->InObjectPropertyAtPut(JSRegExp::kMultilineFieldIndex,
multiline);
regexp->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex,
Smi::FromInt(0),
- SKIP_WRITE_BARRIER);
+ SKIP_WRITE_BARRIER); // It's a Smi.
return regexp;
}
@@ -2187,9 +2187,7 @@
literals->set(JSFunction::kLiteralGlobalContextIndex,
context->global_context());
}
- // It's okay to skip the write barrier here because the literals
- // are guaranteed to be in old space.
- target->set_literals(*literals, SKIP_WRITE_BARRIER);
+ target->set_literals(*literals);
target->set_next_function_link(isolate->heap()->undefined_value());
}
@@ -6077,11 +6075,12 @@
FixedArray* ascii_cache = heap->single_character_string_cache();
Object* undefined = heap->undefined_value();
int i;
+ WriteBarrierMode mode = elements->GetWriteBarrierMode(no_gc);
for (i = 0; i < length; ++i) {
Object* value = ascii_cache->get(chars[i]);
if (value == undefined) break;
ASSERT(!heap->InNewSpace(value));
- elements->set(i, value, SKIP_WRITE_BARRIER);
+ elements->set(i, value, mode);
}
if (i < length) {
ASSERT(Smi::FromInt(0) == 0);
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev