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