// Copyright 2012 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_HEAP_OBJECTS_VISITING_H_ #define V8_HEAP_OBJECTS_VISITING_H_ #include "src/allocation.h" #include "src/layout-descriptor.h" #include "src/objects-body-descriptors.h" #include "src/objects.h" #include "src/objects/hash-table.h" #include "src/objects/ordered-hash-table.h" #include "src/objects/string.h" #include "src/visitors.h" namespace v8 { namespace internal { class BigInt; class BytecodeArray; class DataHandler; class JSArrayBuffer; class JSRegExp; class JSWeakCollection; class UncompiledDataWithoutPreParsedScope; class UncompiledDataWithPreParsedScope; #define TYPED_VISITOR_ID_LIST(V) \ V(AllocationSite) \ V(BigInt) \ V(ByteArray) \ V(BytecodeArray) \ V(Cell) \ V(Code) \ V(CodeDataContainer) \ V(ConsString) \ V(DataHandler) \ V(EphemeronHashTable) \ V(FeedbackCell) \ V(FeedbackVector) \ V(FixedArray) \ V(FixedDoubleArray) \ V(FixedFloat64Array) \ V(FixedTypedArrayBase) \ V(JSArrayBuffer) \ V(JSFunction) \ V(JSObject) \ V(JSWeakCollection) \ V(Map) \ V(Oddball) \ V(PreParsedScopeData) \ V(PropertyArray) \ V(PropertyCell) \ V(PrototypeInfo) \ V(SeqOneByteString) \ V(SeqTwoByteString) \ V(SharedFunctionInfo) \ V(SlicedString) \ V(SmallOrderedHashMap) \ V(SmallOrderedHashSet) \ V(Symbol) \ V(ThinString) \ V(TransitionArray) \ V(UncompiledDataWithoutPreParsedScope) \ V(UncompiledDataWithPreParsedScope) \ V(WasmInstanceObject) // The base class for visitors that need to dispatch on object type. The default // behavior of all visit functions is to iterate body of the given object using // the BodyDescriptor of the object. // // The visit functions return the size of the object cast to ResultType. // // This class is intended to be used in the following way: // // class SomeVisitor : public HeapVisitor<ResultType, SomeVisitor> { // ... // } template <typename ResultType, typename ConcreteVisitor> class HeapVisitor : public ObjectVisitor { public: V8_INLINE ResultType Visit(HeapObject* object); V8_INLINE ResultType Visit(Map* map, HeapObject* object); protected: // A guard predicate for visiting the object. // If it returns false then the default implementations of the Visit* // functions bailout from iterating the object pointers. V8_INLINE bool ShouldVisit(HeapObject* object) { return true; } // Guard predicate for visiting the objects map pointer separately. V8_INLINE bool ShouldVisitMapPointer() { return true; } // A callback for visiting the map pointer in the object header. V8_INLINE void VisitMapPointer(HeapObject* host, HeapObject** map); // If this predicate returns false, then the heap visitor will fail // in default Visit implemention for subclasses of JSObject. V8_INLINE bool AllowDefaultJSObjectVisit() { return true; } #define VISIT(type) V8_INLINE ResultType Visit##type(Map* map, type* object); TYPED_VISITOR_ID_LIST(VISIT) #undef VISIT V8_INLINE ResultType VisitShortcutCandidate(Map* map, ConsString* object); V8_INLINE ResultType VisitNativeContext(Map* map, Context* object); V8_INLINE ResultType VisitDataObject(Map* map, HeapObject* object); V8_INLINE ResultType VisitJSObjectFast(Map* map, JSObject* object); V8_INLINE ResultType VisitJSApiObject(Map* map, JSObject* object); V8_INLINE ResultType VisitStruct(Map* map, HeapObject* object); V8_INLINE ResultType VisitFreeSpace(Map* map, FreeSpace* object); V8_INLINE ResultType VisitWeakArray(Map* map, HeapObject* object); template <typename T> static V8_INLINE T* Cast(HeapObject* object); }; template <typename ConcreteVisitor> class NewSpaceVisitor : public HeapVisitor<int, ConcreteVisitor> { public: V8_INLINE bool ShouldVisitMapPointer() { return false; } // Special cases for young generation. V8_INLINE int VisitJSFunction(Map* map, JSFunction* object); V8_INLINE int VisitNativeContext(Map* map, Context* object); V8_INLINE int VisitJSApiObject(Map* map, JSObject* object); int VisitBytecodeArray(Map* map, BytecodeArray* object) { UNREACHABLE(); return 0; } int VisitSharedFunctionInfo(Map* map, SharedFunctionInfo* object) { UNREACHABLE(); return 0; } }; class WeakObjectRetainer; // A weak list is single linked list where each element has a weak pointer to // the next element. Given the head of the list, this function removes dead // elements from the list and if requested records slots for next-element // pointers. The template parameter T is a WeakListVisitor that defines how to // access the next-element pointers. template <class T> Object* VisitWeakList(Heap* heap, Object* list, WeakObjectRetainer* retainer); } // namespace internal } // namespace v8 #endif // V8_HEAP_OBJECTS_VISITING_H_