text: //-------------------------------------------------------------------------------------------------------
  // 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
  