diff --git a/pykd/module.cpp b/pykd/module.cpp index 9f9dfcc..0c9bad4 100644 --- a/pykd/module.cpp +++ b/pykd/module.cpp @@ -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 diff --git a/pykd/module.h b/pykd/module.h index 18884fa..81d22ca 100644 --- a/pykd/module.h +++ b/pykd/module.h @@ -105,6 +105,8 @@ public: python::list enumSymbols( const std::string &mask = "*" ); + python::list enumTypes( const std::string &mask = "*" ); + std::string print(); private: diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index cfa2640..1bcb720 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -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_MEMBER_FUNCTION_OVERLOADS( Module_enumSymbols, Module::enumSymbols, 0, 1 ); +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( Module_enumTypes, Module::enumTypes, 0, 1 ); + 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" ) .def("enumSymbols", &Module::enumSymbols, Module_enumSymbols( python::args("mask"), "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, "Return a image file checksum: IMAGE_OPTIONAL_HEADER.CheckSum" ) .def("timestamp",&Module::getTimeDataStamp, diff --git a/test/scripts/moduletest.py b/test/scripts/moduletest.py index 47b4347..155fe31 100644 --- a/test/scripts/moduletest.py +++ b/test/scripts/moduletest.py @@ -70,11 +70,26 @@ class ModuleTest( unittest.TestCase ): self.assertEqual( 624, lineNo ) def testEnumSymbols( self ): + lst = target.module.enumSymbols() + self.assertNotEqual( 0, len(lst) ) lst = target.module.enumSymbols("hello*Str") self.assertEqual( 2, len(lst) ) lst = target.module.enumSymbols( "g_const*Value") self.assertEqual( 2, len(lst) ) lst = target.module.enumSymbols( "*FuncWithName*") 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) )