From f15f01a155154607c6805d9b5882e44f33a2d59e Mon Sep 17 00:00:00 2001 From: "SND\\EreTIk_cp" Date: Mon, 20 Feb 2012 19:42:19 +0000 Subject: [PATCH] [0.1.x] issue #10393: name of poiner to void, name of pointer to function git-svn-id: https://pykd.svn.codeplex.com/svn@74349 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/typeinfo.cpp | 34 +++++++++++++++++++++++++++++++--- pykd/typeinfo.h | 16 ++++++++++++---- test/scripts/typeinfo.py | 2 ++ test/targetapp/targetapp.cpp | 9 +++++++++ 4 files changed, 54 insertions(+), 7 deletions(-) diff --git a/pykd/typeinfo.cpp b/pykd/typeinfo.cpp index 6669385..fd887ed 100644 --- a/pykd/typeinfo.cpp +++ b/pykd/typeinfo.cpp @@ -218,14 +218,33 @@ BitFieldTypeInfo::BitFieldTypeInfo( pyDia::SymbolPtr &symbol ) PointerTypeInfo::PointerTypeInfo( pyDia::SymbolPtr &symbol ) { + pyDia::SymbolPtr pointTo = symbol->getType(); try { - m_derefType = TypeInfo::getTypeInfo( symbol->getType() ); + m_derefType = TypeInfo::getTypeInfo( pointTo ); } catch (const SymbolException &) { m_derefType.swap( TypeInfoPtr() ); } + if (!derefPossible()) + { + // special cases: + const ULONG symTag = pointTo->getSymTag(); + switch (symTag) + { + // * pointer to function + case SymTagFunctionType: + m_derefName = ""; + break; + + case SymTagBaseType: + // * pointer to Void + if (btVoid == static_cast(pointTo->getBaseType())) + m_derefName = "Void"; + break; + } + } m_size = (ULONG)symbol->getSize(); } @@ -295,6 +314,7 @@ std::string TypeInfo::getComplexName() std::string name; TypeInfo *typeInfo = this; + std::string tiName; do { if ( typeInfo->isArray() ) @@ -326,16 +346,24 @@ std::string TypeInfo::getComplexName() { name.insert( 0, 1, '*' ); - typeInfo = dynamic_cast(typeInfo)->getDerefType().get(); + PointerTypeInfo *ptrTypeInfo = dynamic_cast(typeInfo); + if (!ptrTypeInfo->derefPossible()) + { + tiName = ptrTypeInfo->getDerefName(); + break; + } + + typeInfo = ptrTypeInfo->getDerefType().get(); continue; } + tiName = typeInfo->getName(); break; } while ( true ); - name.insert( 0, typeInfo->getName() ); + name.insert( 0, tiName ); return name; } diff --git a/pykd/typeinfo.h b/pykd/typeinfo.h index a52f1b1..2493c9d 100644 --- a/pykd/typeinfo.h +++ b/pykd/typeinfo.h @@ -285,9 +285,7 @@ public: } virtual TypeInfoPtr deref() { - if (!m_derefType) - throw TypeException("", "this pointer can not be dereferenced"); - return m_derefType; + return getDerefType(); } TypeInfoPtr getDerefType() { @@ -296,11 +294,21 @@ public: return m_derefType; } + bool derefPossible() const { + return m_derefType; + } + + const std::string getDerefName() const { + if (m_derefName.empty()) + throw TypeException("", "this pointer can not be dereferenced"); + return m_derefName; + } + private: TypeInfoPtr m_derefType; - ULONG m_size; + std::string m_derefName; }; /////////////////////////////////////////////////////////////////////////////////// diff --git a/test/scripts/typeinfo.py b/test/scripts/typeinfo.py index 10bcada..c74f741 100644 --- a/test/scripts/typeinfo.py +++ b/test/scripts/typeinfo.py @@ -117,6 +117,8 @@ class TypeInfoTest( unittest.TestCase ): self.assertEqual( "listStruct1*[2]", target.module.type( "g_arrOfListStruct1" ).name()) self.assertEqual( "Void*", target.module.type( "g_voidPtr" ).name() ) self.assertEqual( "Void*[3]", target.module.type( "g_arrOfVoidPtr" ).name()) + self.assertEqual( "*", target.module.type( "g_ptrToFunction" ).name()) + self.assertEqual( "*[4]", target.module.type( "g_arrOfPtrToFunc" ).name()) def testUnion(self): ti = target.module.type("unionTest") diff --git a/test/targetapp/targetapp.cpp b/test/targetapp/targetapp.cpp index ff2e59a..fbbb245 100644 --- a/test/targetapp/targetapp.cpp +++ b/test/targetapp/targetapp.cpp @@ -170,6 +170,12 @@ void *g_arrOfVoidPtr[] = { g_voidPtr, g_voidPtr, g_voidPtr }; +// kd> x targetapp!g_arrOfPtrToFunc +// xxxxxxxx`xxxxxxxx targetapp!g_arrOfPtrToFunc = *[4] +WNDPROC g_arrOfPtrToFunc[] = { + NULL, NULL, NULL, NULL +}; + struct listStruct1 { int num; struct listStruct1 *next; @@ -310,6 +316,9 @@ void FuncWithName1(int a) std::cout << g_unNamedStruct.m_fieldOfUnNamed; std::cout << g_structWithNested.m_field; std::cout << g_ptrToFunction; + + std::cout << g_ptrToFunction; + std::cout << g_arrOfPtrToFunc[1]; } ////////////////////////////////////////////////////////////////////////////////