From c340df4e6c167e2dd93d7d42247c4bd43e828726 Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Mon, 5 Dec 2011 07:48:46 +0000 Subject: [PATCH] [0.1.x] update : output type name for "complex" type ( mixed array and pointers ) git-svn-id: https://pykd.svn.codeplex.com/svn@72039 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/typeinfo.cpp | 62 ++++++++++++++++++++++++++++++--- pykd/typeinfo.h | 74 +++++++--------------------------------- test/scripts/pykdtest.py | 3 +- test/scripts/typeinfo.py | 28 +++++++-------- 4 files changed, 85 insertions(+), 82 deletions(-) diff --git a/pykd/typeinfo.cpp b/pykd/typeinfo.cpp index 00ab5e2..c72644e 100644 --- a/pykd/typeinfo.cpp +++ b/pykd/typeinfo.cpp @@ -160,7 +160,8 @@ PointerTypeInfo::PointerTypeInfo( pyDia::SymbolPtr &symScope, const std::string std::string PointerTypeInfo::getName() { - return m_derefType->getName() + '*'; + //return m_derefType->getName() + '*'; + return getComplexName(); } ///////////////////////////////////////////////////////////////////////////////////// @@ -190,11 +191,12 @@ ArrayTypeInfo::ArrayTypeInfo( pyDia::SymbolPtr &symScope, const std::string &sym std::string ArrayTypeInfo::getName() { - std::stringstream sstr; + //std::stringstream sstr; - sstr << m_derefType->getName() << '[' << m_count << ']'; + //sstr << m_derefType->getName() << '[' << m_count << ']'; - return sstr.str(); + //return sstr.str(); + return getComplexName(); } ///////////////////////////////////////////////////////////////////////////////////// @@ -206,4 +208,56 @@ ULONG ArrayTypeInfo::getSize() ///////////////////////////////////////////////////////////////////////////////////// +std::string TypeInfo::getComplexName() +{ + std::string name; + TypeInfo *typeInfo = this; + + do { + + if ( typeInfo->isArray() ) + { + std::vector indices; + + do { + indices.push_back( typeInfo->getCount() ); + } + while( ( typeInfo = dynamic_cast(typeInfo)->getDerefType().get() )->isArray() ); + + if ( !name.empty() ) + { + name.insert( 0, 1, '(' ); + name.insert( name.size(), 1, ')' ); + } + + std::stringstream sstr; + + for ( std::vector::iterator it = indices.begin(); it != indices.end(); ++it ) + sstr << '[' << *it << ']'; + + name += sstr.str(); + + continue; + } + else + if ( typeInfo->isPointer() ) + { + name.insert( 0, 1, '*' ); + + typeInfo = dynamic_cast(typeInfo)->getDerefType().get(); + + continue; + } + + break; + + } while ( true ); + + name.insert( 0, typeInfo->getName() ); + + return name; +} + +///////////////////////////////////////////////////////////////////////////////////// + }; // end namespace pykd \ No newline at end of file diff --git a/pykd/typeinfo.h b/pykd/typeinfo.h index 8a50055..539b0a6 100644 --- a/pykd/typeinfo.h +++ b/pykd/typeinfo.h @@ -71,6 +71,8 @@ public: protected: + std::string getComplexName(); + ULONG m_offset; }; @@ -194,6 +196,11 @@ public: return true; } + TypeInfoPtr getDerefType() { + return m_derefType; + } + + private: TypeInfoPtr m_derefType; @@ -231,6 +238,11 @@ public: return m_derefType; } + TypeInfoPtr getDerefType() { + return m_derefType; + } + + private: @@ -241,66 +253,4 @@ private: /////////////////////////////////////////////////////////////////////////////////// - - - - - - - -// -//class TypeInfo { -// -//public: -// -// TypeInfo( pyDia::GlobalScopePtr &diaScope, const std::string &symName ); -// -// TypeInfo( pyDia::SymbolPtr &diaType ) : -// m_offset( 0 ), -// m_dia( diaType ) -// {} -// -// TypeInfo -// getField( const std::string &fieldName ) { -// pyDia::SymbolPtr field = m_dia->getChildByName( fieldName ); -// TypeInfo ti( field->getType() ); -// ti.m_offset = field->getOffset(); -// return ti; -// } -// -// std::string -// getName(); -// -// ULONG -// getOffset() { -// return m_offset; -// } -// -// ULONG -// getSize() { -// return (ULONG)m_dia->getSize(); -// } -// -// bool -// isBasicType(); -// -// bool -// isArrayType(); -// -// bool -// isPointer(); -// -// bool -// isUserDefined(); -// -//private: -// -// pyDia::SymbolPtr m_dia; -// -// ULONG m_offset; -// -//}; - -/////////////////////////////////////////////////////////////////////////////////// - }; // namespace pykd diff --git a/test/scripts/pykdtest.py b/test/scripts/pykdtest.py index 8220b5d..5b78d8d 100644 --- a/test/scripts/pykdtest.py +++ b/test/scripts/pykdtest.py @@ -56,9 +56,10 @@ if __name__ == "__main__": target.module.reload(); suite = getTestSuite() + #suite = getTestSuite( "typeinfo.TypeInfoTest.testCreateBySymbol" ) #suite = getTestSuite( "intbase.IntBaseTest.testLongConvert" ) #suite = getTestSuite( "typedvar.TypedVarTest.testStruct" ) unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( suite ) - a = raw_input("\npress return\n") \ No newline at end of file + a = raw_input("\npress return\n") diff --git a/test/scripts/typeinfo.py b/test/scripts/typeinfo.py index a300bc3..b04dbde 100644 --- a/test/scripts/typeinfo.py +++ b/test/scripts/typeinfo.py @@ -15,9 +15,20 @@ class TypeInfoTest( unittest.TestCase ): def testCreateByName( self ): """ creating typeInfo by the type name """ - #self.assertEqual( "structTest", target.module.type( "structTest" ).name() ) - #self.assertEqual( "structTest**", target.module.type( "structTest**" ).name() ) + self.assertEqual( "structTest", target.module.type( "structTest" ).name() ) + self.assertEqual( "structTest**", target.module.type( "structTest**" ).name() ) self.assertEqual( "Int4B[2][3]", target.module.type("Int4B[2][3]").name() ) + + + def testCreateBySymbol(self): + """ creating typeInfo by the symbol name """ + self.assertEqual( "structTest[2]", target.module.type("g_testArray").name() ) + self.assertEqual( "Int4B[2][3]", target.module.type("intMatrix").name() ) + self.assertEqual( "structTest*", target.module.type("g_structTestPtr").name() ) + self.assertEqual( "structTest**", target.module.type("g_structTestPtrPtr").name() ) + self.assertEqual( "Char*[2]", target.module.type("strArray").name() ) + self.assertEqual( "Char*(*)[2]", target.module.type("ptrStrArray").name() ) + self.assertEqual( "Int4B(*[4])[2][3]", target.module.type("arrIntMatrixPtrs").name() ) def testGetField( self ): """ get field of the complex type """ @@ -42,19 +53,6 @@ class TypeInfoTest( unittest.TestCase ): self.assertEqual( "Int4B", ti1.m_childField.name() ) self.assertEqual( "structTest", ti1.m_childField3.name() ) self.assertEqual( "structTest", target.module.type("g_structTest").name() ) - - def testPtrName( self ): - self.assertEqual( "structTest*", target.module.type("g_structTestPtr").name() ) - self.assertEqual( "structTest**", target.module.type("g_structTestPtrPtr").name() ) - self.assertEqual( "structTest**", target.module.type("structTest**").name() ) - - def testArrayName( self ): - self.assertEqual( "structTest[2]", target.module.type("g_testArray").name() ) - self.assertEqual( "Int4B[2][3]", target.module.type("intMatrix").name() ) - self.assertEqual( "Char*[2]", target.module.type("strArray").name() ) - self.assertEqual( "Int4B[2][3]*",target.module.type("ptrIntMatrix").name() ) - self.assertEqual( "Char*[2]*", target.module.type("ptrStrArray").name() ) - self.assertEqual( "Int4B[2][3]", target.module.type("Int[2][3]").name() ) def testOffset( self ): ti1 = target.module.type( "structTest" )