Index: src/global-handles.h |
diff --git a/src/global-handles.h b/src/global-handles.h |
index 7697364d13716f6d5ad28c49ebe026a0a593b7c3..90707b0bc24b5067bc1d46155852b784406c9b70 100644 |
--- a/src/global-handles.h |
+++ b/src/global-handles.h |
@@ -28,7 +28,6 @@ |
#ifndef V8_GLOBAL_HANDLES_H_ |
#define V8_GLOBAL_HANDLES_H_ |
-#include "../include/v8.h" |
#include "../include/v8-profiler.h" |
#include "list.h" |
@@ -47,64 +46,70 @@ class ObjectVisitor; |
// At GC the destroyed global handles are removed from the free list |
// and deallocated. |
-// Data structures for tracking object groups and implicit references. |
- |
// An object group is treated like a single JS object: if one of object in |
// the group is alive, all objects in the same group are considered alive. |
// An object group is used to simulate object relationship in a DOM tree. |
- |
-// An implicit references group consists of two parts: a parent object and a |
-// list of children objects. If the parent is alive, all the children are alive |
-// too. |
- |
-struct ObjectGroupConnection { |
- ObjectGroupConnection(UniqueId id, Object** object) |
- : id(id), object(object) {} |
- |
- bool operator==(const ObjectGroupConnection& other) const { |
- return id == other.id; |
+class ObjectGroup { |
+ public: |
+ static ObjectGroup* New(Object*** handles, |
+ size_t length, |
+ v8::RetainedObjectInfo* info) { |
+ ASSERT(length > 0); |
+ ObjectGroup* group = reinterpret_cast<ObjectGroup*>( |
+ malloc(OFFSET_OF(ObjectGroup, objects_[length]))); |
+ group->length_ = length; |
+ group->info_ = info; |
+ CopyWords(group->objects_, handles, static_cast<int>(length)); |
+ return group; |
} |
- bool operator<(const ObjectGroupConnection& other) const { |
- return id < other.id; |
+ void Dispose() { |
+ if (info_ != NULL) info_->Dispose(); |
+ free(this); |
} |
- UniqueId id; |
- Object** object; |
-}; |
- |
- |
-struct ObjectGroupRetainerInfo { |
- ObjectGroupRetainerInfo(UniqueId id, RetainedObjectInfo* info) |
- : id(id), info(info) {} |
+ size_t length_; |
+ v8::RetainedObjectInfo* info_; |
+ Object** objects_[1]; // Variable sized array. |
- bool operator==(const ObjectGroupRetainerInfo& other) const { |
- return id == other.id; |
- } |
- |
- bool operator<(const ObjectGroupRetainerInfo& other) const { |
- return id < other.id; |
- } |
- |
- UniqueId id; |
- RetainedObjectInfo* info; |
+ private: |
+ void* operator new(size_t size); |
+ void operator delete(void* p); |
+ ~ObjectGroup(); |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectGroup); |
}; |
-struct ObjectGroupRepresentative { |
- ObjectGroupRepresentative(UniqueId id, HeapObject** object) |
- : id(id), object(object) {} |
- |
- bool operator==(const ObjectGroupRepresentative& other) const { |
- return id == other.id; |
+// An implicit references group consists of two parts: a parent object and |
+// a list of children objects. If the parent is alive, all the children |
+// are alive too. |
+class ImplicitRefGroup { |
+ public: |
+ static ImplicitRefGroup* New(HeapObject** parent, |
+ Object*** children, |
+ size_t length) { |
+ ASSERT(length > 0); |
+ ImplicitRefGroup* group = reinterpret_cast<ImplicitRefGroup*>( |
+ malloc(OFFSET_OF(ImplicitRefGroup, children_[length]))); |
+ group->parent_ = parent; |
+ group->length_ = length; |
+ CopyWords(group->children_, children, length); |
+ return group; |
} |
- bool operator<(const ObjectGroupRepresentative& other) const { |
- return id < other.id; |
+ void Dispose() { |
+ free(this); |
} |
- UniqueId id; |
- HeapObject** object; |
+ HeapObject** parent_; |
+ size_t length_; |
+ Object** children_[1]; // Variable sized array. |
+ |
+ private: |
+ void* operator new(size_t size); |
+ void operator delete(void* p); |
+ ~ImplicitRefGroup(); |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ImplicitRefGroup); |
}; |
@@ -213,22 +218,6 @@ class GlobalHandles { |
size_t length, |
v8::RetainedObjectInfo* info); |
- // Associates handle with the object group represented by id. |
- // Should be only used in GC callback function before a collection. |
- // All groups are destroyed after a garbage collection. |
- void SetObjectGroupId(Object** handle, UniqueId id); |
- |
- // Set RetainedObjectInfo for an object group. Should not be called more than |
- // once for a group. Should not be called for a group which contains no |
- // handles. |
- void SetRetainedObjectInfo(UniqueId id, RetainedObjectInfo* info); |
- |
- // Sets a representative object for an object group. Should not be called more |
- // than once for a group. Should not be called for a group which contains no |
- // handles. |
- void SetObjectGroupRepresentative(UniqueId id, |
- HeapObject** representative_object); |
- |
// Add an implicit references' group. |
// Should be only used in GC callback function before a collection. |
// All groups are destroyed after a mark-compact collection. |
@@ -236,28 +225,14 @@ class GlobalHandles { |
Object*** children, |
size_t length); |
- // Adds an implicit reference from a group (representative object of that |
- // group) to an object. Should be only used in GC callback function before a |
- // collection. All implicit references are destroyed after a mark-compact |
- // collection. |
- void AddImplicitReference(UniqueId id, Object** child); |
+ // Returns the object groups. |
+ List<ObjectGroup*>* object_groups() { return &object_groups_; } |
- List<ObjectGroupConnection>* object_groups() { |
- return &object_groups_; |
- } |
- |
- List<ObjectGroupRetainerInfo>* retainer_infos() { |
- return &retainer_infos_; |
- } |
- |
- List<ObjectGroupConnection>* implicit_ref_groups() { |
+ // Returns the implicit references' groups. |
+ List<ImplicitRefGroup*>* implicit_ref_groups() { |
return &implicit_ref_groups_; |
} |
- List<ObjectGroupRepresentative>* representative_objects() { |
- return &representative_objects_; |
- } |
- |
// Remove bags, this should only happen after GC. |
void RemoveObjectGroups(); |
void RemoveImplicitRefGroups(); |
@@ -300,13 +275,8 @@ class GlobalHandles { |
int post_gc_processing_count_; |
- // Object groups. |
- List<ObjectGroupConnection> object_groups_; |
- List<ObjectGroupRetainerInfo> retainer_infos_; |
- List<ObjectGroupRepresentative> representative_objects_; |
- |
- // Implicit references. |
- List<ObjectGroupConnection> implicit_ref_groups_; |
+ List<ObjectGroup*> object_groups_; |
+ List<ImplicitRefGroup*> implicit_ref_groups_; |
friend class Isolate; |