void CLR_RT_DUMP::OBJECT( CLR_RT_HeapBlock* ptr, LPCSTR text )
{
    NATIVE_PROFILE_CLR_DIAGNOSTICS();
#define PELEMENT_TO_STRING(elem) case DATATYPE_##elem: CLR_Debug::Printf( "%s", #elem ); break

    CLR_Debug::Printf( "%s - ", text );

    while(ptr->DataType() == DATATYPE_OBJECT && ptr->Dereference())
    {
        ptr = ptr->Dereference();

        CLR_Debug::Printf( "PTR " );
    }

    CLR_Debug::Printf( "%04x blocks at %08x [%02x] ", ptr->DataSize(), (int)(size_t)ptr, ptr->DataType() );

    switch(ptr->DataType())
    {
    case DATATYPE_CLASS:
    case DATATYPE_VALUETYPE:
        {
            CLR_RT_DUMP::TYPE( ptr->ObjectCls() );
        }
        break;

    case DATATYPE_STRING:
        {
            CLR_Debug::Printf( "'%s'", ptr->StringText() );
        }
        break;

    case DATATYPE_SZARRAY:
        {
            CLR_RT_HeapBlock_Array* array = (CLR_RT_HeapBlock_Array*)ptr;

            CLR_RT_DUMP::TYPE( array->ReflectionData() );
        }
        break;

    case DATATYPE_DELEGATE_HEAD:
        {
            CLR_RT_HeapBlock_Delegate* dlg = (CLR_RT_HeapBlock_Delegate*)ptr;

            CLR_RT_DUMP::METHOD( dlg->DelegateFtn() );
        }
        break;


    PELEMENT_TO_STRING(BOOLEAN);
    PELEMENT_TO_STRING(CHAR   );
    PELEMENT_TO_STRING(I1     );
    PELEMENT_TO_STRING(U1     );
    PELEMENT_TO_STRING(I2     );
    PELEMENT_TO_STRING(U2     );
    PELEMENT_TO_STRING(I4     );
    PELEMENT_TO_STRING(U4     );
    PELEMENT_TO_STRING(I8     );
    PELEMENT_TO_STRING(U8     );
    PELEMENT_TO_STRING(R4     );
    PELEMENT_TO_STRING(R8     );

    PELEMENT_TO_STRING(FREEBLOCK             );
    PELEMENT_TO_STRING(CACHEDBLOCK           );
    PELEMENT_TO_STRING(ASSEMBLY              );
    PELEMENT_TO_STRING(WEAKCLASS             );
    PELEMENT_TO_STRING(REFLECTION            );
    PELEMENT_TO_STRING(ARRAY_BYREF           );
    PELEMENT_TO_STRING(DELEGATELIST_HEAD     );
    PELEMENT_TO_STRING(OBJECT_TO_EVENT       );
    PELEMENT_TO_STRING(BINARY_BLOB_HEAD      );

    PELEMENT_TO_STRING(THREAD                );
    PELEMENT_TO_STRING(SUBTHREAD             );
    PELEMENT_TO_STRING(STACK_FRAME           );
    PELEMENT_TO_STRING(TIMER_HEAD            );
    PELEMENT_TO_STRING(LOCK_HEAD             );
    PELEMENT_TO_STRING(LOCK_OWNER_HEAD       );
    PELEMENT_TO_STRING(LOCK_REQUEST_HEAD     );
    PELEMENT_TO_STRING(WAIT_FOR_OBJECT_HEAD  );
    PELEMENT_TO_STRING(FINALIZER_HEAD        );
    PELEMENT_TO_STRING(MEMORY_STREAM_HEAD    );
    PELEMENT_TO_STRING(MEMORY_STREAM_DATA    );

    }

    CLR_Debug::Printf( "\r\n" );

#undef PELEMENT_TO_STRING
}