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 }