1257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_GLOBAL_HANDLES_H_
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_GLOBAL_HANDLES_H_
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#include "../include/v8-profiler.h"
328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
33257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "list.h"
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Structure for tracking global handles.
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A single list keeps all the allocated global handles.
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Destroyed handles stay in the list but is added to the free list.
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// At GC the destroyed global handles are removed from the free list
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// and deallocated.
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// An object group is treated like a single JS object: if one of object in
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// the group is alive, all objects in the same group are considered alive.
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// An object group is used to simulate object relationship in a DOM tree.
478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass ObjectGroup {
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static ObjectGroup* New(Object*** handles,
508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                          size_t length,
518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                          v8::RetainedObjectInfo* info) {
528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    ASSERT(length > 0);
538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    ObjectGroup* group = reinterpret_cast<ObjectGroup*>(
548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        malloc(OFFSET_OF(ObjectGroup, objects_[length])));
558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    group->length_ = length;
568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    group->info_ = info;
578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    CopyWords(group->objects_, handles, static_cast<int>(length));
588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return group;
598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void Dispose() {
628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    if (info_ != NULL) info_->Dispose();
638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    free(this);
648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  size_t length_;
6744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  v8::RetainedObjectInfo* info_;
688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Object** objects_[1];  // Variable sized array.
6944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7044f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void* operator new(size_t size);
728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void operator delete(void* p);
738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  ~ObjectGroup();
748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectGroup);
7544f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
7644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7844f0eee88ff00398ff7f715fab053374d808c90dSteve Block// An implicit references group consists of two parts: a parent object and
7944f0eee88ff00398ff7f715fab053374d808c90dSteve Block// a list of children objects.  If the parent is alive, all the children
8044f0eee88ff00398ff7f715fab053374d808c90dSteve Block// are alive too.
818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass ImplicitRefGroup {
8244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static ImplicitRefGroup* New(HeapObject** parent,
848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                               Object*** children,
858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                               size_t length) {
868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    ASSERT(length > 0);
878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    ImplicitRefGroup* group = reinterpret_cast<ImplicitRefGroup*>(
888b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        malloc(OFFSET_OF(ImplicitRefGroup, children_[length])));
898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    group->parent_ = parent;
908b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    group->length_ = length;
918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    CopyWords(group->children_, children, static_cast<int>(length));
928b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return group;
938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void Dispose() {
968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    free(this);
978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
9844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HeapObject** parent_;
1008b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  size_t length_;
1018b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Object** children_[1];  // Variable sized array.
10244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
10344f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
1048b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void* operator new(size_t size);
1058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void operator delete(void* p);
1068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  ~ImplicitRefGroup();
1078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  DISALLOW_IMPLICIT_CONSTRUCTORS(ImplicitRefGroup);
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blocktypedef void (*WeakReferenceGuest)(Object* object, void* parameter);
1123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass GlobalHandles {
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
11544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~GlobalHandles();
11644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Creates a new global handle that is alive until Destroy is called.
11844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Object> Create(Object* value);
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Destroy a global handle.
12144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Destroy(Object** location);
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Make the global handle weak and set the callback parameter for the
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // handle.  When the garbage collector recognizes that only weak global
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // handles point to an object the handles are cleared and the callback
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // function is invoked (for each handle) with the handle and corresponding
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // parameter as arguments.  Note: cleared means set to Smi::FromInt(0). The
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // reason is that Smi::FromInt(0) does not change during garage collection.
12944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void MakeWeak(Object** location,
13044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                void* parameter,
13144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                WeakReferenceCallback callback);
13244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
13344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void SetWrapperClassId(Object** location, uint16_t class_id);
134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Returns the current number of weak handles.
13644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int NumberOfWeakHandles() { return number_of_weak_handles_; }
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void RecordStats(HeapStats* stats);
139d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Returns the current number of weak handles to global objects.
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // These handles are also included in NumberOfWeakHandles().
14244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int NumberOfGlobalObjectWeakHandles() {
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return number_of_global_object_weak_handles_;
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Returns the current number of handles to global objects.
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int NumberOfGlobalHandles() {
1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return number_of_global_handles_;
1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Clear the weakness of a global handle.
15244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ClearWeakness(Object** location);
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
154257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Clear the weakness of a global handle.
155257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void MarkIndependent(Object** location);
156257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Tells whether global handle is near death.
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static bool IsNearDeath(Object** location);
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Tells whether global handle is weak.
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static bool IsWeak(Object** location);
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1635913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  // Process pending weak handles.
1643e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu  // Returns true if next major GC is likely to collect more garbage.
165257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool PostGarbageCollectionProcessing(GarbageCollector collector);
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
167d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  // Iterates over all strong handles.
16844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void IterateStrongRoots(ObjectVisitor* v);
169d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Iterates over all handles.
17144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void IterateAllRoots(ObjectVisitor* v);
17244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
17344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Iterates over all handles that have embedder-assigned class ID.
17444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void IterateAllRootsWithClassIds(ObjectVisitor* v);
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Iterates over all weak roots in heap.
17744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void IterateWeakRoots(ObjectVisitor* v);
178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  // Iterates over weak roots that are bound to a given callback.
18044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void IterateWeakRoots(WeakReferenceGuest f,
18144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                        WeakReferenceCallback callback);
1823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Find all weak handles satisfying the callback predicate, mark
184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // them as pending.
18544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void IdentifyWeakHandles(WeakSlotCallback f);
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // NOTE: Three ...NewSpace... functions below are used during
1883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // scavenge collections and iterate over sets of handles that are
1893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // guaranteed to contain all handles holding new space objects (but
1903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // may also include old space objects).
1913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // Iterates over strong and dependent handles. See the node above.
1933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void IterateNewSpaceStrongAndDependentRoots(ObjectVisitor* v);
1943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // Finds weak independent handles satisfying the callback predicate
1963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // and marks them as pending. See the note above.
1973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void IdentifyNewSpaceWeakIndependentHandles(WeakSlotCallbackWithHeap f);
1983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // Iterates over weak independent handles. See the note above.
2003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void IterateNewSpaceWeakIndependentRoots(ObjectVisitor* v);
201257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Add an object group.
20344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Should be only used in GC callback function before a collection.
20444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // All groups are destroyed after a mark-compact collection.
20544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void AddObjectGroup(Object*** handles,
20644f0eee88ff00398ff7f715fab053374d808c90dSteve Block                      size_t length,
20744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                      v8::RetainedObjectInfo* info);
20844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
20944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Add an implicit references' group.
21044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Should be only used in GC callback function before a collection.
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // All groups are destroyed after a mark-compact collection.
2128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void AddImplicitReferences(HeapObject** parent,
21344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                             Object*** children,
21444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                             size_t length);
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Returns the object groups.
21744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  List<ObjectGroup*>* object_groups() { return &object_groups_; }
21844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
21944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the implicit references' groups.
22044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  List<ImplicitRefGroup*>* implicit_ref_groups() {
22144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &implicit_ref_groups_;
22244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Remove bags, this should only happen after GC.
22544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void RemoveObjectGroups();
22644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void RemoveImplicitRefGroups();
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Tear down the global handle structure.
22944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void TearDown();
23044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
23144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Isolate* isolate() { return isolate_; }
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
23444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void PrintStats();
23544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Print();
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
2373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private:
23944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit GlobalHandles(Isolate* isolate);
24044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // Internal node structures.
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  class Node;
2433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  class NodeBlock;
2443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  class NodeIterator;
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
24644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Isolate* isolate_;
24744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Field always containing the number of weak and near-death handles.
24944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int number_of_weak_handles_;
250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Field always containing the number of weak and near-death handles
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // to global objects.  These objects are also included in
253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // number_of_weak_handles_.
25444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int number_of_global_object_weak_handles_;
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Field always containing the number of handles to global objects.
2573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int number_of_global_handles_;
2583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // List of all allocated node blocks.
2603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  NodeBlock* first_block_;
2613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // List of node blocks with used nodes.
2633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  NodeBlock* first_used_block_;
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // Free list of nodes.
26644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Node* first_free_;
26744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // Contains all nodes holding new space objects. Note: when the list
2693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // is accessed, some of the objects may have been promoted already.
2703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  List<Node*> new_space_nodes_;
2713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
27244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int post_gc_processing_count_;
2733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
27444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  List<ObjectGroup*> object_groups_;
27544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  List<ImplicitRefGroup*> implicit_ref_groups_;
27644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
27744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class Isolate;
27844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
27944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DISALLOW_COPY_AND_ASSIGN(GlobalHandles);
280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // V8_GLOBAL_HANDLES_H_
286