| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- #pragma once
- #ifdef RECYCLER_DUMP_OBJECT_GRAPH
- class RecyclerObjectGraphDumper
- {
- public:
- struct Param
- {
- bool (*dumpReferenceFunc)(char16 const *, void *objectAddress, void *referenceAddress);
- bool dumpRootOnly;
- bool skipStack;
- #ifdef RECYCLER_STATS
- RecyclerCollectionStats stats;
- #endif
- };
- RecyclerObjectGraphDumper(Recycler * recycler, Param * param);
- ~RecyclerObjectGraphDumper();
- void BeginDumpObject(void * objectAddres);
- void BeginDumpObject(char16 const * name);
- void BeginDumpObject(char16 const * name, void* objectAddress);
- void EndDumpObject();
- void DumpObjectReference(void * objectAddress, bool remark);
- Recycler * recycler;
- Param * param;
- char16 const * dumpObjectName;
- char16 tempObjectName[256];
- void * dumpObject;
- #ifdef PROFILE_RECYCLER_ALLOC
- type_info const * dumpObjectTypeInfo;
- bool dumpObjectIsArray;
- #endif
- bool isOutOfMemory;
- };
- #endif
- #ifdef RECYCLER_DUMP_OBJECT_GRAPH
- #define BEGIN_DUMP_OBJECT(recycler, address) { if (recycler->objectGraphDumper != nullptr) { recycler->objectGraphDumper->BeginDumpObject(address); }
- #define BEGIN_DUMP_OBJECT_ADDRESS(name, address) { if (this->objectGraphDumper != nullptr) { this->objectGraphDumper->BeginDumpObject(name, address); }
- #define DUMP_OBJECT_REFERENCE(recycler, address) if (recycler->objectGraphDumper != nullptr) { recycler->objectGraphDumper->DumpObjectReference(address, false); }
- #define DUMP_OBJECT_REFERENCE_REMARK(recycler, address) if (recycler->objectGraphDumper != nullptr && recycler->IsValidObject(address)) { recycler->objectGraphDumper->DumpObjectReference(address, true); }
- #define END_DUMP_OBJECT(recycler) if (recycler->objectGraphDumper != nullptr) { recycler->objectGraphDumper->EndDumpObject(); } }
- #define DUMP_IMPLICIT_ROOT(recycler, address) BEGIN_DUMP_OBJECT(recycler, _u("Implicit Root")); DUMP_OBJECT_REFERENCE(recycler, address); END_DUMP_OBJECT(recycler);
- #else
- #define BEGIN_DUMP_OBJECT(recycler, address)
- #define BEGIN_DUMP_OBJECT_ADDRESS(name, address)
- #define DUMP_OBJECT_REFERENCE(recycler, address)
- #define DUMP_OBJECT_REFERENCE_REMARK(recycler, address)
- #define END_DUMP_OBJECT(recycler)
- #define DUMP_IMPLICIT_ROOT(recycler, address)
- #endif
|