Revision: 9193
Author:   [email protected]
Date:     Thu Sep  8 05:04:27 2011
Log:      Bring back write barrier modes on the new GC branch.
Review URL: http://codereview.chromium.org/7846014
http://code.google.com/p/v8/source/detail?r=9193

Modified:
 /branches/experimental/gc/src/builtins.cc
 /branches/experimental/gc/src/mark-compact.cc
 /branches/experimental/gc/src/objects-inl.h
 /branches/experimental/gc/src/runtime.cc

=======================================
--- /branches/experimental/gc/src/builtins.cc   Wed Aug  3 09:10:10 2011
+++ /branches/experimental/gc/src/builtins.cc   Thu Sep  8 05:04:27 2011
@@ -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,
=======================================
--- /branches/experimental/gc/src/mark-compact.cc       Tue Sep  6 08:11:38 2011
+++ /branches/experimental/gc/src/mark-compact.cc       Thu Sep  8 05:04:27 2011
@@ -2192,6 +2192,9 @@
       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.  Also it's a
+        // root.
         prototype_transitions->set_unchecked(heap_,
                                              header + i,
                                              undefined,
@@ -3415,10 +3418,10 @@
                         SlotType type,
                         Address addr,
                         AdditionMode mode) {
-  if(!AddTo(allocator,
-            buffer_address,
-            reinterpret_cast<ObjectSlot>(type),
-            mode)) {
+  if (!AddTo(allocator,
+             buffer_address,
+             reinterpret_cast<ObjectSlot>(type),
+             mode)) {
     return false;
   }
   return AddTo(allocator,
=======================================
--- /branches/experimental/gc/src/objects-inl.h Tue Sep  6 08:11:38 2011
+++ /branches/experimental/gc/src/objects-inl.h Thu Sep  8 05:04:27 2011
@@ -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);
 }

=======================================
--- /branches/experimental/gc/src/runtime.cc    Mon Aug 29 05:23:10 2011
+++ /branches/experimental/gc/src/runtime.cc    Thu Sep  8 05:04:27 2011
@@ -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,11 @@
   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

Reply via email to