1b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 2ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// Redistribution and use in source and binary forms, with or without 3ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// modification, are permitted provided that the following conditions are 4ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// met: 5ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// 6ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// * Redistributions of source code must retain the above copyright 7ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// notice, this list of conditions and the following disclaimer. 8ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// * Redistributions in binary form must reproduce the above 9ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// copyright notice, this list of conditions and the following 10ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// disclaimer in the documentation and/or other materials provided 11ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// with the distribution. 12ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// * Neither the name of Google Inc. nor the names of its 13ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// contributors may be used to endorse or promote products derived 14ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// from this software without specific prior written permission. 15ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// 16ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 28eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org#ifndef V8_OBJECTS_VISITING_H_ 29eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org#define V8_OBJECTS_VISITING_H_ 30ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 311c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org#include "allocation.h" 321c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org 33ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// This file provides base classes and auxiliary methods for defining 34ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// static object visitors used during GC. 35ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// Visiting HeapObject body with a normal ObjectVisitor requires performing 36ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// two switches on object's instance type to determine object size and layout 37ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// and one or more virtual method calls on visitor itself. 38ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// Static visitor is different: it provides a dispatch table which contains 39ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// pointers to specialized visit functions. Each map has the visitor_id 40ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// field which contains an index of specialized visitor to use. 41ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 42ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgnamespace v8 { 43ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgnamespace internal { 44ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 45ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 46ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// Base class for all static visitors. 47ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgclass StaticVisitorBase : public AllStatic { 48ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 4928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org#define VISITOR_ID_LIST(V) \ 50fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org V(SeqOneByteString) \ 5128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(SeqTwoByteString) \ 5228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(ShortcutCandidate) \ 5328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(ByteArray) \ 5428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(FreeSpace) \ 5528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(FixedArray) \ 5628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(FixedDoubleArray) \ 57a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org V(ConstantPoolArray) \ 5846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org V(NativeContext) \ 59ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org V(AllocationSite) \ 6028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(DataObject2) \ 6128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(DataObject3) \ 6228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(DataObject4) \ 6328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(DataObject5) \ 6428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(DataObject6) \ 6528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(DataObject7) \ 6628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(DataObject8) \ 6728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(DataObject9) \ 6828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(DataObjectGeneric) \ 6928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(JSObject2) \ 7028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(JSObject3) \ 7128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(JSObject4) \ 7228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(JSObject5) \ 7328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(JSObject6) \ 7428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(JSObject7) \ 7528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(JSObject8) \ 7628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(JSObject9) \ 7728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(JSObjectGeneric) \ 7828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(Struct2) \ 7928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(Struct3) \ 8028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(Struct4) \ 8128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(Struct5) \ 8228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(Struct6) \ 8328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(Struct7) \ 8428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(Struct8) \ 8528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(Struct9) \ 8628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(StructGeneric) \ 8728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(ConsString) \ 8828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(SlicedString) \ 89f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org V(Symbol) \ 9028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(Oddball) \ 9128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(Code) \ 9228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(Map) \ 9341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org V(Cell) \ 9428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(PropertyCell) \ 9528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(SharedFunctionInfo) \ 9628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(JSFunction) \ 9728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(JSWeakMap) \ 98ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org V(JSWeakSet) \ 991fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org V(JSArrayBuffer) \ 1001fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org V(JSTypedArray) \ 1011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(JSDataView) \ 10228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org V(JSRegExp) 10328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 10428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // For data objects, JS objects and structs along with generic visitor which 10528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // can visit object of any size we provide visitors specialized by 10628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // object size in words. 10728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // Ids of specialized visitors are declared in a linear order (without 10828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // holes) starting from the id of visitor specialized for 2 words objects 10928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // (base visitor id) and ending with the id of generic visitor. 11028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // Method GetVisitorIdForSize depends on this ordering to calculate visitor 11128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // id of specialized visitor from given instance size, base visitor id and 11228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // generic visitor's id. 113ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org enum VisitorId { 11428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org#define VISITOR_ID_ENUM_DECL(id) kVisit##id, 11528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org VISITOR_ID_LIST(VISITOR_ID_ENUM_DECL) 11628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org#undef VISITOR_ID_ENUM_DECL 117ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kVisitorIdCount, 11828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org kVisitDataObject = kVisitDataObject2, 11928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org kVisitJSObject = kVisitJSObject2, 12028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org kVisitStruct = kVisitStruct2, 121ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kMinObjectSizeInWords = 2 122ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org }; 123ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1245b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org // Visitor ID should fit in one byte. 1255b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org STATIC_ASSERT(kVisitorIdCount <= 256); 1265b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org 127ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org // Determine which specialized visitor should be used for given instance type 128ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org // and instance type. 129ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static VisitorId GetVisitorId(int instance_type, int instance_size); 130ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 131ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static VisitorId GetVisitorId(Map* map) { 132ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return GetVisitorId(map->instance_type(), map->instance_size()); 133ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 134ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 135ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org // For visitors that allow specialization by size calculate VisitorId based 136ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org // on size, base visitor id and generic visitor id. 137ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static VisitorId GetVisitorIdForSize(VisitorId base, 138ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org VisitorId generic, 139ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int object_size) { 140ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org ASSERT((base == kVisitDataObject) || 141ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org (base == kVisitStruct) || 142ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org (base == kVisitJSObject)); 143ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org ASSERT(IsAligned(object_size, kPointerSize)); 144ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org ASSERT(kMinObjectSizeInWords * kPointerSize <= object_size); 145594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT(object_size <= Page::kMaxNonCodeHeapObjectSize); 146ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 147ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org const VisitorId specialization = static_cast<VisitorId>( 148ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org base + (object_size >> kPointerSizeLog2) - kMinObjectSizeInWords); 149ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 150ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return Min(specialization, generic); 151ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 152ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}; 153ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 154ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 155ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgtemplate<typename Callback> 156ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgclass VisitorDispatchTable { 157ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 158c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org void CopyFrom(VisitorDispatchTable* other) { 159c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org // We are not using memcpy to guarantee that during update 160c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org // every element of callbacks_ array will remain correct 161c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org // pointer (memcpy might be implemented as a byte copying loop). 162c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org for (int i = 0; i < StaticVisitorBase::kVisitorIdCount; i++) { 163c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org NoBarrier_Store(&callbacks_[i], other->callbacks_[i]); 164c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org } 165c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org } 166c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 167a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org inline Callback GetVisitorById(StaticVisitorBase::VisitorId id) { 168a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org return reinterpret_cast<Callback>(callbacks_[id]); 169a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org } 170a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org 171ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org inline Callback GetVisitor(Map* map) { 172c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org return reinterpret_cast<Callback>(callbacks_[map->visitor_id()]); 173ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 174ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 175ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org void Register(StaticVisitorBase::VisitorId id, Callback callback) { 176c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org ASSERT(id < StaticVisitorBase::kVisitorIdCount); // id is unsigned. 177c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org callbacks_[id] = reinterpret_cast<AtomicWord>(callback); 178ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 179ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 180ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org template<typename Visitor, 181ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org StaticVisitorBase::VisitorId base, 182ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org StaticVisitorBase::VisitorId generic, 183ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int object_size_in_words> 184ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org void RegisterSpecialization() { 185ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static const int size = object_size_in_words * kPointerSize; 186ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org Register(StaticVisitorBase::GetVisitorIdForSize(base, generic, size), 187ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org &Visitor::template VisitSpecialized<size>); 188ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 189ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 190ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 191ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org template<typename Visitor, 192ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org StaticVisitorBase::VisitorId base, 193ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org StaticVisitorBase::VisitorId generic> 194ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org void RegisterSpecializations() { 195ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org STATIC_ASSERT( 196ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org (generic - base + StaticVisitorBase::kMinObjectSizeInWords) == 10); 197ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org RegisterSpecialization<Visitor, base, generic, 2>(); 198ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org RegisterSpecialization<Visitor, base, generic, 3>(); 199ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org RegisterSpecialization<Visitor, base, generic, 4>(); 200ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org RegisterSpecialization<Visitor, base, generic, 5>(); 201ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org RegisterSpecialization<Visitor, base, generic, 6>(); 202ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org RegisterSpecialization<Visitor, base, generic, 7>(); 203ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org RegisterSpecialization<Visitor, base, generic, 8>(); 204ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org RegisterSpecialization<Visitor, base, generic, 9>(); 205ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org Register(generic, &Visitor::Visit); 206ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 207ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 208ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org private: 209c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org AtomicWord callbacks_[StaticVisitorBase::kVisitorIdCount]; 210ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}; 211ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 212ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 213ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgtemplate<typename StaticVisitor> 214ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgclass BodyVisitorBase : public AllStatic { 215ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 216ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org INLINE(static void IteratePointers(Heap* heap, 217ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org HeapObject* object, 218ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int start_offset, 2199e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org int end_offset)) { 220ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org Object** start_slot = reinterpret_cast<Object**>(object->address() + 221ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org start_offset); 222ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org Object** end_slot = reinterpret_cast<Object**>(object->address() + 223ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org end_offset); 2242ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org StaticVisitor::VisitPointers(heap, start_slot, end_slot); 225ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 226ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}; 227ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 228ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 229ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgtemplate<typename StaticVisitor, typename BodyDescriptor, typename ReturnType> 230ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgclass FlexibleBodyVisitor : public BodyVisitorBase<StaticVisitor> { 231ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 232003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static ReturnType Visit(Map* map, HeapObject* object)) { 233ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int object_size = BodyDescriptor::SizeOf(map, object); 234145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com BodyVisitorBase<StaticVisitor>::IteratePointers( 235c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com map->GetHeap(), 236ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org object, 237ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org BodyDescriptor::kStartOffset, 238ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org object_size); 239ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return static_cast<ReturnType>(object_size); 240ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 241ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 242ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org template<int object_size> 243ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline ReturnType VisitSpecialized(Map* map, HeapObject* object) { 2440b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org ASSERT(BodyDescriptor::SizeOf(map, object) == object_size); 245145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com BodyVisitorBase<StaticVisitor>::IteratePointers( 246c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com map->GetHeap(), 247ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org object, 248ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org BodyDescriptor::kStartOffset, 249ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org object_size); 250ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return static_cast<ReturnType>(object_size); 251ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 252ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}; 253ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 254ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 255ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgtemplate<typename StaticVisitor, typename BodyDescriptor, typename ReturnType> 256ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgclass FixedBodyVisitor : public BodyVisitorBase<StaticVisitor> { 257ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 258003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static ReturnType Visit(Map* map, HeapObject* object)) { 259145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com BodyVisitorBase<StaticVisitor>::IteratePointers( 260c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com map->GetHeap(), 261ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org object, 262ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org BodyDescriptor::kStartOffset, 263ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org BodyDescriptor::kEndOffset); 264ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return static_cast<ReturnType>(BodyDescriptor::kSize); 265ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 266ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}; 267ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 268ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 269ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// Base class for visitors used for a linear new space iteration. 270ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// IterateBody returns size of visited object. 271ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// Certain types of objects (i.e. Code objects) are not handled 272ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// by dispatch table of this visitor because they cannot appear 273ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// in the new space. 274ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// 275ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// This class is intended to be used in the following way: 276ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// 277ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// class SomeVisitor : public StaticNewSpaceVisitor<SomeVisitor> { 278ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// ... 279ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// } 280ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// 281ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// This is an example of Curiously recurring template pattern 282ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// (see http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern). 283ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// We use CRTP to guarantee aggressive compile time optimizations (i.e. 284ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// inlining and specialization of StaticVisitor::VisitPointers methods). 285ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgtemplate<typename StaticVisitor> 286ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgclass StaticNewSpaceVisitor : public StaticVisitorBase { 287ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 288c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static void Initialize(); 289ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 290003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static int IterateBody(Map* map, HeapObject* obj)) { 291ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return table_.GetVisitor(map)(map, obj); 292ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 293ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 294003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void VisitPointers(Heap* heap, Object** start, Object** end)) { 295ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org for (Object** p = start; p < end; p++) StaticVisitor::VisitPointer(heap, p); 296ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 297ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 298ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org private: 299003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static int VisitJSFunction(Map* map, HeapObject* object)) { 300ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com Heap* heap = map->GetHeap(); 301ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com VisitPointers(heap, 3022ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org HeapObject::RawField(object, JSFunction::kPropertiesOffset), 303ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com HeapObject::RawField(object, JSFunction::kCodeEntryOffset)); 304ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 305ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // Don't visit code entry. We are using this visitor only during scavenges. 306ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 307ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com VisitPointers( 308ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com heap, 309ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com HeapObject::RawField(object, 310ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com JSFunction::kCodeEntryOffset + kPointerSize), 311ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com HeapObject::RawField(object, 312ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com JSFunction::kNonWeakFieldsEndOffset)); 313ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com return JSFunction::kSize; 314ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 315ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 316003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static int VisitByteArray(Map* map, HeapObject* object)) { 317ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return reinterpret_cast<ByteArray*>(object)->ByteArraySize(); 318ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 319ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 320003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static int VisitFixedDoubleArray(Map* map, HeapObject* object)) { 3216d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org int length = reinterpret_cast<FixedDoubleArray*>(object)->length(); 3226d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org return FixedDoubleArray::SizeFor(length); 3236d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 3246d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 325003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static int VisitJSObject(Map* map, HeapObject* object)) { 3267c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org return JSObjectVisitor::Visit(map, object); 3277c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } 3287c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 329003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static int VisitSeqOneByteString(Map* map, HeapObject* object)) { 330fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org return SeqOneByteString::cast(object)-> 331fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org SeqOneByteStringSize(map->instance_type()); 332ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 333ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 334003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static int VisitSeqTwoByteString(Map* map, HeapObject* object)) { 335ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return SeqTwoByteString::cast(object)-> 336ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org SeqTwoByteStringSize(map->instance_type()); 337ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 338ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 339003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static int VisitFreeSpace(Map* map, HeapObject* object)) { 340c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return FreeSpace::cast(object)->Size(); 341c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 342c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 3431fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org INLINE(static int VisitJSArrayBuffer(Map* map, HeapObject* object)); 3441fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org INLINE(static int VisitJSTypedArray(Map* map, HeapObject* object)); 3451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org INLINE(static int VisitJSDataView(Map* map, HeapObject* object)); 3461fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 347ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org class DataObjectVisitor { 348ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 349ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org template<int object_size> 350ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline int VisitSpecialized(Map* map, HeapObject* object) { 351ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return object_size; 352ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 353ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 354003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static int Visit(Map* map, HeapObject* object)) { 355ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return map->instance_size(); 356ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 357ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org }; 358ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 359ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org typedef FlexibleBodyVisitor<StaticVisitor, 360ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org StructBodyDescriptor, 361ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int> StructVisitor; 362ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 363ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org typedef FlexibleBodyVisitor<StaticVisitor, 364ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org JSObject::BodyDescriptor, 365ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int> JSObjectVisitor; 366ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 367ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org typedef int (*Callback)(Map* map, HeapObject* object); 368ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 369ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static VisitorDispatchTable<Callback> table_; 370ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}; 371ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 372ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 373ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgtemplate<typename StaticVisitor> 374ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgVisitorDispatchTable<typename StaticNewSpaceVisitor<StaticVisitor>::Callback> 375b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org StaticNewSpaceVisitor<StaticVisitor>::table_; 376b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org 377b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org 378b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// Base class for visitors used to transitively mark the entire heap. 379b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// IterateBody returns nothing. 380b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// Certain types of objects might not be handled by this base class and 381b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// no visitor function is registered by the generic initialization. A 382b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// specialized visitor function needs to be provided by the inheriting 383b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// class itself for those cases. 384b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// 385b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// This class is intended to be used in the following way: 386b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// 387b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// class SomeVisitor : public StaticMarkingVisitor<SomeVisitor> { 388b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// ... 389b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// } 390b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// 391b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org// This is an example of Curiously recurring template pattern. 392b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.orgtemplate<typename StaticVisitor> 393b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.orgclass StaticMarkingVisitor : public StaticVisitorBase { 394b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org public: 395b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org static void Initialize(); 396b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org 397003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void IterateBody(Map* map, HeapObject* obj)) { 398b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org table_.GetVisitor(map)(map, obj); 399b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org } 400b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org 4011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org INLINE(static void VisitPropertyCell(Map* map, HeapObject* object)); 402af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org INLINE(static void VisitAllocationSite(Map* map, HeapObject* object)); 403003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void VisitCodeEntry(Heap* heap, Address entry_address)); 404003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void VisitEmbeddedPointer(Heap* heap, RelocInfo* rinfo)); 40541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org INLINE(static void VisitCell(Heap* heap, RelocInfo* rinfo)); 406003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void VisitDebugTarget(Heap* heap, RelocInfo* rinfo)); 407003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void VisitCodeTarget(Heap* heap, RelocInfo* rinfo)); 408003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void VisitCodeAgeSequence(Heap* heap, RelocInfo* rinfo)); 409003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void VisitExternalReference(RelocInfo* rinfo)) { } 410003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void VisitRuntimeEntry(RelocInfo* rinfo)) { } 411b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org 412b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org // TODO(mstarzinger): This should be made protected once refactoring is done. 413c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org // Mark non-optimize code for functions inlined into the given optimized 414c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org // code. This will prevent it from being flushed. 415c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org static void MarkInlinedFunctionsCode(Heap* heap, Code* code); 416c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 417b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org protected: 418003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void VisitMap(Map* map, HeapObject* object)); 419003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void VisitCode(Map* map, HeapObject* object)); 420003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void VisitSharedFunctionInfo(Map* map, HeapObject* object)); 421a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org INLINE(static void VisitConstantPoolArray(Map* map, HeapObject* object)); 422003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void VisitJSFunction(Map* map, HeapObject* object)); 423003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void VisitJSRegExp(Map* map, HeapObject* object)); 4241fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org INLINE(static void VisitJSArrayBuffer(Map* map, HeapObject* object)); 4251fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org INLINE(static void VisitJSTypedArray(Map* map, HeapObject* object)); 4261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org INLINE(static void VisitJSDataView(Map* map, HeapObject* object)); 427003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void VisitNativeContext(Map* map, HeapObject* object)); 428b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org 42933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org // Mark pointers in a Map and its TransitionArray together, possibly 43033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org // treating transitions or back pointers weak. 43133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org static void MarkMapContents(Heap* heap, Map* map); 43233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org static void MarkTransitionArray(Heap* heap, TransitionArray* transitions); 43333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 434c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org // Code flushing support. 435003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static bool IsFlushable(Heap* heap, JSFunction* function)); 436003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static bool IsFlushable(Heap* heap, SharedFunctionInfo* shared_info)); 437c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 438c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org // Helpers used by code flushing support that visit pointer fields and treat 439c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org // references to code objects either strongly or weakly. 440c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org static void VisitSharedFunctionInfoStrongCode(Heap* heap, HeapObject* object); 441c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org static void VisitSharedFunctionInfoWeakCode(Heap* heap, HeapObject* object); 442c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org static void VisitJSFunctionStrongCode(Heap* heap, HeapObject* object); 443c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org static void VisitJSFunctionWeakCode(Heap* heap, HeapObject* object); 444c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 445b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org class DataObjectVisitor { 446b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org public: 447b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org template<int size> 448b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org static inline void VisitSpecialized(Map* map, HeapObject* object) { 449b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org } 450b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org 451003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org INLINE(static void Visit(Map* map, HeapObject* object)) { 452b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org } 453b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org }; 454b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org 455b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org typedef FlexibleBodyVisitor<StaticVisitor, 456fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org FixedArray::BodyDescriptor, 457fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org void> FixedArrayVisitor; 458fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 459fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org typedef FlexibleBodyVisitor<StaticVisitor, 460b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org JSObject::BodyDescriptor, 461b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org void> JSObjectVisitor; 462b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org 463b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org typedef FlexibleBodyVisitor<StaticVisitor, 464b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org StructBodyDescriptor, 465b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org void> StructObjectVisitor; 466b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org 467b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org typedef void (*Callback)(Map* map, HeapObject* object); 468b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org 469b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org static VisitorDispatchTable<Callback> table_; 470b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org}; 471b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org 472b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org 473b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.orgtemplate<typename StaticVisitor> 474b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.orgVisitorDispatchTable<typename StaticMarkingVisitor<StaticVisitor>::Callback> 475b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org StaticMarkingVisitor<StaticVisitor>::table_; 476ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 477ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 478ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org} } // namespace v8::internal 479ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 480eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org#endif // V8_OBJECTS_VISITING_H_ 481