[0.2.x] added : module::enumTypes method ( return list of types names )

git-svn-id: https://pykd.svn.codeplex.com/svn@80753 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2012-11-01 11:03:01 +00:00 committed by Mikhail I. Izmestev
parent a2ea430be4
commit 2a54a81ca7
4 changed files with 41 additions and 1 deletions

View File

@ -311,4 +311,23 @@ python::list Module::enumSymbols( const std::string &mask)
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
python::list Module::enumTypes( const std::string &mask )
{
python::list lst;
int tags[] = { SymTagUDT, SymTagEnum };
for ( size_t i = 0; i < sizeof(tags)/sizeof(tags[0]); ++i )
{
SymbolPtrList symlst = getSymScope()->findChildren( tags[i], mask, true );
for ( SymbolPtrList::iterator it = symlst.begin(); it != symlst.end(); ++it )
{
lst.append( (*it)->getName() );
}
}
return lst;
}
///////////////////////////////////////////////////////////////////////////////////
}; // end of namespace pykd }; // end of namespace pykd

View File

@ -105,6 +105,8 @@ public:
python::list enumSymbols( const std::string &mask = "*" ); python::list enumSymbols( const std::string &mask = "*" );
python::list enumTypes( const std::string &mask = "*" );
std::string print(); std::string print();
private: private:

View File

@ -65,6 +65,8 @@ BOOST_PYTHON_FUNCTION_OVERLOADS( CustomStruct_create, CustomStruct::create, 1, 2
BOOST_PYTHON_FUNCTION_OVERLOADS( findSymbol_, TypeInfo::findSymbol, 1, 2 ); BOOST_PYTHON_FUNCTION_OVERLOADS( findSymbol_, TypeInfo::findSymbol, 1, 2 );
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( Module_enumSymbols, Module::enumSymbols, 0, 1 ); BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( Module_enumSymbols, Module::enumSymbols, 0, 1 );
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( Module_enumTypes, Module::enumTypes, 0, 1 );
BOOST_PYTHON_MODULE( pykd ) BOOST_PYTHON_MODULE( pykd )
{ {
@ -363,6 +365,8 @@ BOOST_PYTHON_MODULE( pykd )
"The start address is calculated by the same method as the standard macro CONTAINING_RECORD does" ) "The start address is calculated by the same method as the standard macro CONTAINING_RECORD does" )
.def("enumSymbols", &Module::enumSymbols, Module_enumSymbols( python::args("mask"), .def("enumSymbols", &Module::enumSymbols, Module_enumSymbols( python::args("mask"),
"Return list of tuple ( symbolname, offset )" ) ) "Return list of tuple ( symbolname, offset )" ) )
.def("enumTypes", &Module::enumTypes, Module_enumTypes( python::args("mask"),
"Return list of type's names" ))
.def("checksum",&Module::getCheckSum, .def("checksum",&Module::getCheckSum,
"Return a image file checksum: IMAGE_OPTIONAL_HEADER.CheckSum" ) "Return a image file checksum: IMAGE_OPTIONAL_HEADER.CheckSum" )
.def("timestamp",&Module::getTimeDataStamp, .def("timestamp",&Module::getTimeDataStamp,

View File

@ -70,11 +70,26 @@ class ModuleTest( unittest.TestCase ):
self.assertEqual( 624, lineNo ) self.assertEqual( 624, lineNo )
def testEnumSymbols( self ): def testEnumSymbols( self ):
lst = target.module.enumSymbols()
self.assertNotEqual( 0, len(lst) )
lst = target.module.enumSymbols("hello*Str") lst = target.module.enumSymbols("hello*Str")
self.assertEqual( 2, len(lst) ) self.assertEqual( 2, len(lst) )
lst = target.module.enumSymbols( "g_const*Value") lst = target.module.enumSymbols( "g_const*Value")
self.assertEqual( 2, len(lst) ) self.assertEqual( 2, len(lst) )
lst = target.module.enumSymbols( "*FuncWithName*") lst = target.module.enumSymbols( "*FuncWithName*")
self.assertEqual( 3, len(lst) ) self.assertEqual( 3, len(lst) )
self.assertNotEqual( 0, len(target.module.enumSymbols( "*virtFunc*") ) ) lst = target.module.enumSymbols( "*virtFunc*")
self.assertNotEqual( 0, len(lst) )
lst = target.module.enumSymbols( "classChild" )
self.assertEqual( 0, len(lst) )
def testEnumTypes( self ):
lst = target.module.enumTypes()
self.assertNotEqual( 0, len(lst) )
lst = target.module.enumTypes("*class*")
self.assertEqual( 2, len(lst) )
self.assertTrue( "classChild" in lst )
self.assertTrue( "classBase" in lst )
lst = target.module.enumTypes("hello*Str")
self.assertEqual( 0, len(lst) )