Reviewers: Michael Starzinger,

Description:
Process weak references between optimized JSFunctions on scavenges.

[email protected]


Please review this at https://chromiumcodereview.appspot.com/10091027/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/heap.cc
  M src/objects-visiting-inl.h
  M src/objects-visiting.h


Index: src/heap.cc
diff --git a/src/heap.cc b/src/heap.cc
index 4000548c5b4a860faa940725fa573e3380ba0aa7..e9d0ab68539c5da898b3561a0231c6fd3f28d6bd 100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -1124,6 +1124,27 @@ void PromotionQueue::RelocateQueueHead() {
 }


+class ScavengeWeakObjectRetainer : public WeakObjectRetainer {
+ public:
+  explicit ScavengeWeakObjectRetainer(Heap* heap) : heap_(heap) { }
+
+  virtual Object* RetainAs(Object* object) {
+    if (!heap_->InFromSpace(object)) {
+      return object;
+    }
+
+    MapWord map_word = HeapObject::cast(object)->map_word();
+    if (map_word.IsForwardingAddress()) {
+      return map_word.ToForwardingAddress();
+    }
+    return NULL;
+  }
+
+ private:
+  Heap* heap_;
+};
+
+
 void Heap::Scavenge() {
 #ifdef DEBUG
   if (FLAG_verify_heap) VerifyNonPointerSpacePointers();
@@ -1222,6 +1243,9 @@ void Heap::Scavenge() {
   }
   incremental_marking()->UpdateMarkingDequeAfterScavenge();

+  ScavengeWeakObjectRetainer weak_object_retainer(this);
+  ProcessWeakReferences(&weak_object_retainer);
+
   ASSERT(new_space_front == new_space_.top());

   // Set age mark.
@@ -1643,7 +1667,12 @@ class ScavengingVisitor : public StaticVisitorBase {
         MigrateObject(heap, object, target, object_size);

         if (object_contents == POINTER_OBJECT) {
-          heap->promotion_queue()->insert(target, object_size);
+          if (map->instance_type() == JS_FUNCTION_TYPE) {
+            heap->promotion_queue()->insert(
+                target, JSFunction::kNonWeakFieldsEndOffset);
+          } else {
+            heap->promotion_queue()->insert(target, object_size);
+          }
         }

         heap->tracer()->increment_promoted_objects_size(object_size);
Index: src/objects-visiting-inl.h
diff --git a/src/objects-visiting-inl.h b/src/objects-visiting-inl.h
index 627d1bc2ef2bf1e9a3520d3900987daa1e498b4c..8ba92f70c9b8f2dab86f02d1c80ac55889d93211 100644
--- a/src/objects-visiting-inl.h
+++ b/src/objects-visiting-inl.h
@@ -72,9 +72,7 @@ void StaticNewSpaceVisitor<StaticVisitor>::Initialize() {

   table_.Register(kVisitSeqTwoByteString, &VisitSeqTwoByteString);

-  table_.Register(kVisitJSFunction,
-                  &JSObjectVisitor::
-                      template VisitSpecialized<JSFunction::kSize>);
+  table_.Register(kVisitJSFunction, &VisitJSFunction);

   table_.Register(kVisitFreeSpace, &VisitFreeSpace);

Index: src/objects-visiting.h
diff --git a/src/objects-visiting.h b/src/objects-visiting.h
index 26e79ae5eddf4b1bde097ff62d9c4c54b150787f..f0ce213549e5300eed6feb8b3bb86d81b4402598 100644
--- a/src/objects-visiting.h
+++ b/src/objects-visiting.h
@@ -289,6 +289,20 @@ class StaticNewSpaceVisitor : public StaticVisitorBase {
   }

  private:
+  static inline int VisitJSFunction(Map* map, HeapObject* object) {
+    Heap* heap = map->GetHeap();
+    VisitPointers(heap,
+ HeapObject::RawField(object, JSFunction::kPropertiesOffset), + HeapObject::RawField(object, JSFunction::kCodeEntryOffset));
+    VisitPointers(
+        heap,
+        HeapObject::RawField(object,
+                             JSFunction::kCodeEntryOffset + kPointerSize),
+        HeapObject::RawField(object,
+                             JSFunction::kNonWeakFieldsEndOffset));
+    return JSFunction::kSize;
+  }
+
   static inline int VisitByteArray(Map* map, HeapObject* object) {
     return reinterpret_cast<ByteArray*>(object)->ByteArraySize();
   }


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to