mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-21 04:13:22 +08:00
[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
This commit is contained in:
parent
22cf80c801
commit
c340df4e6c
@ -160,7 +160,8 @@ PointerTypeInfo::PointerTypeInfo( pyDia::SymbolPtr &symScope, const std::string
|
|||||||
|
|
||||||
std::string PointerTypeInfo::getName()
|
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::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<ULONG> indices;
|
||||||
|
|
||||||
|
do {
|
||||||
|
indices.push_back( typeInfo->getCount() );
|
||||||
|
}
|
||||||
|
while( ( typeInfo = dynamic_cast<ArrayTypeInfo*>(typeInfo)->getDerefType().get() )->isArray() );
|
||||||
|
|
||||||
|
if ( !name.empty() )
|
||||||
|
{
|
||||||
|
name.insert( 0, 1, '(' );
|
||||||
|
name.insert( name.size(), 1, ')' );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::stringstream sstr;
|
||||||
|
|
||||||
|
for ( std::vector<ULONG>::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<PointerTypeInfo*>(typeInfo)->getDerefType().get();
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
} while ( true );
|
||||||
|
|
||||||
|
name.insert( 0, typeInfo->getName() );
|
||||||
|
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
}; // end namespace pykd
|
}; // end namespace pykd
|
@ -71,6 +71,8 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
std::string getComplexName();
|
||||||
|
|
||||||
ULONG m_offset;
|
ULONG m_offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -194,6 +196,11 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TypeInfoPtr getDerefType() {
|
||||||
|
return m_derefType;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
TypeInfoPtr m_derefType;
|
TypeInfoPtr m_derefType;
|
||||||
@ -231,6 +238,11 @@ public:
|
|||||||
return m_derefType;
|
return m_derefType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TypeInfoPtr getDerefType() {
|
||||||
|
return m_derefType;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
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
|
}; // namespace pykd
|
||||||
|
@ -56,6 +56,7 @@ if __name__ == "__main__":
|
|||||||
target.module.reload();
|
target.module.reload();
|
||||||
|
|
||||||
suite = getTestSuite()
|
suite = getTestSuite()
|
||||||
|
#suite = getTestSuite( "typeinfo.TypeInfoTest.testCreateBySymbol" )
|
||||||
#suite = getTestSuite( "intbase.IntBaseTest.testLongConvert" )
|
#suite = getTestSuite( "intbase.IntBaseTest.testLongConvert" )
|
||||||
#suite = getTestSuite( "typedvar.TypedVarTest.testStruct" )
|
#suite = getTestSuite( "typedvar.TypedVarTest.testStruct" )
|
||||||
|
|
||||||
|
@ -15,10 +15,21 @@ class TypeInfoTest( unittest.TestCase ):
|
|||||||
|
|
||||||
def testCreateByName( self ):
|
def testCreateByName( self ):
|
||||||
""" creating typeInfo by the type name """
|
""" 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() )
|
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 ):
|
def testGetField( self ):
|
||||||
""" get field of the complex type """
|
""" get field of the complex type """
|
||||||
ti1 = target.module.type( "structTest" )
|
ti1 = target.module.type( "structTest" )
|
||||||
@ -43,19 +54,6 @@ class TypeInfoTest( unittest.TestCase ):
|
|||||||
self.assertEqual( "structTest", ti1.m_childField3.name() )
|
self.assertEqual( "structTest", ti1.m_childField3.name() )
|
||||||
self.assertEqual( "structTest", target.module.type("g_structTest").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 ):
|
def testOffset( self ):
|
||||||
ti1 = target.module.type( "structTest" )
|
ti1 = target.module.type( "structTest" )
|
||||||
self.assertEqual( 0, ti1.m_field0.offset() )
|
self.assertEqual( 0, ti1.m_field0.offset() )
|
||||||
|
Loading…
Reference in New Issue
Block a user