[pygccxml-commit] SF.net SVN: pygccxml: [1286] pygccxml_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2008-03-22 22:14:33
|
Revision: 1286 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1286&view=rev Author: roman_yakovenko Date: 2008-03-22 15:14:36 -0700 (Sat, 22 Mar 2008) Log Message: ----------- adding new functionality Modified Paths: -------------- pygccxml_dev/pygccxml/msvc/pdb/__init__.py pygccxml_dev/pygccxml/msvc/pdb/loader.py pygccxml_dev/unittests/pdb_tester.py Removed Paths: ------------- pygccxml_dev/unittests/pdb_reader.py Modified: pygccxml_dev/pygccxml/msvc/pdb/__init__.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/__init__.py 2008-03-22 22:14:05 UTC (rev 1285) +++ pygccxml_dev/pygccxml/msvc/pdb/__init__.py 2008-03-22 22:14:36 UTC (rev 1286) @@ -19,4 +19,5 @@ finally: comtypes.client.gen_dir = comtypes_client_gen_dir -from loader import decl_loader_t \ No newline at end of file +from loader import decl_loader_t + Modified: pygccxml_dev/pygccxml/msvc/pdb/loader.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-03-22 22:14:05 UTC (rev 1285) +++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-03-22 22:14:36 UTC (rev 1286) @@ -26,8 +26,8 @@ return ctypes.cast( x, ctypes.POINTER( msdia.IDiaTable ) ) def as_enum_symbols( x ): - return ctypes.cast( x, ctypes.POINTER( msdia.IDiaEnumSymbols ) ) - + return ctypes.cast( x, ctypes.POINTER( msdia.IDiaEnumSymbols ) ) + def as_enum_variant( x ): return ctypes.cast( x, ctypes.POINTER( comtypes.automation.IEnumVARIANT ) ) @@ -110,9 +110,9 @@ elif smbl.name.endswith( '__unnamed' ): return False return True - + self.logger.debug( 'scanning symbols table' ) - + self.logger.debug( 'looking for scopes' ) names = set() for index, smbl in enumerate( itertools.ifilter( ns_filter, self.symbols.itervalues() ) ): @@ -120,14 +120,14 @@ self.logger.debug( '%d symbols scanned', index ) if '_Facetptr<std::ctype<char> >' in smbl.name: i = 0 - name_splitter = impl_details.get_name_splitter( smbl.name ) + name_splitter = impl_details.get_name_splitter( smbl.name ) names.update( name_splitter.scope_names ) names = list( names ) names.sort() self.logger.debug( 'looking for scopes - done' ) - + nss = {'': self.__global_ns} - + self.logger.debug( 'building namespace objects' ) for ns_name in itertools.ifilterfalse( self.__find_udt, names ): name_splitter = impl_details.get_name_splitter( ns_name ) @@ -139,11 +139,43 @@ parent_ns.adopt_declaration( ns_decl ) nss[ ns_name ] = ns_decl self.logger.debug( 'building namespace objects - done' ) - + self.logger.debug( 'scanning symbols table - done' ) + + def __load_classes( self ): + classes = {}#unique symbold id : class decl + is_udt = lambda smbl: smbl.symTag == msdia.SymTagUDT + self.logger.info( 'building udt objects' ) + for udt_smbl in itertools.ifilter( is_udt, self.symbols.itervalues() ): + classes[udt_smbl.symIndexId] = self.__create_class(udt_smbl) + self.logger.info( 'building udt objects(%d) - done', len(classes) ) + + does_parent_exist = lambda cls_decl: not classes.has_key( cls_decl.dia_symbols[0].classParentId ) + self.logger.info( 'integrating udt objects with namespaces' ) + while classes: + self.logger.info( 'there are %d classes to go', len( classes ) ) + to_be_deleted = filter( does_parent_exist, classes.itervalues() ) + for ns_class in to_be_deleted: + udt_smbl = ns_class.dia_symbols[0] + name_splitter = impl_details.get_name_splitter( udt_smbl.name ) + if not name_splitter.scope_names: + self.global_ns.adopt_declaration( ns_class ) + else: + parent_name = '::' + name_splitter.scope_names[-1] + parent = self.global_ns.decls( parent_name, allow_empty=True ) + if not parent: + self.logger.debug( 'unable to find parent for class %s', udt_smbl.name ) + continue + if isinstance( parent[0], declarations.namespace_t ): + parent.adopt_declaration( ns_class ) + else: + parent[0].adopt_declaration( ns_class, declarations.ACCESS_TYPES.PUBLIC ) + del classes[ ns_class.dia_symbols[0].symIndexId ] + self.logger.info( 'integrating udt objects with namespaces - done' ) + def read(self): self.__load_nss() - #self.__populate_scopes() + self.__load_classes() @property def dia_global_scope(self): @@ -183,50 +215,7 @@ self.logger.debug( 'name( "%s" ) is **NOT** UDT symbol' % name ) return None - def __list_main_classes( self ): - #in this context main classes, are classes that were defined within a namespace - #as opposite to the classes defined in other classes - classes = [] - dia_classes = self.dia_global_scope.findChildren( msdia.SymTagUDT, None, 0 ) - for dia_class in itertools.imap(as_symbol, dia_classes ): - name_splitter = impl_details.get_name_splitter( dia_class.name ) - for index, scope in enumerate( name_splitter.scope_names ): - if scope in self.__namespaces: - continue - else: - udt = self.__find_udt( scope ) - if udt: - classes.append( udt ) - if index: - self.__namespaces[ name_splitter.scope_names[index-1] ] = None - break - else: - self.__namespaces[ scope ] = None - else: - classes.append( dia_class ) - if name_splitter.scope_names: - self.__namespaces[ name_splitter.scope_names[-1] ] = None - return classes - def __add_inner_classes( self, parent_class ): - self.logger.debug( 'adding inner classes to "%s"' % parent_class.decl_string ) - for symbol_id in parent_class.dia_symbols: - self.logger.debug( '\tdia symbol id: %d' % symbol_id ) - dia_symbol = self.__dia_session.symbolById( symbol_id ) - found = dia_symbol.findChildren( msdia.SymTagUDT, None, 0 ) - for inner_dia_class in itertools.imap(as_symbol, found): - self.logger.debug( '\t\tinner UDT found - %s' % inner_dia_class.name ) - inner_name_splitter = impl_details.get_name_splitter( inner_dia_class.name ) - try: - inner_klass = parent_class.class_( inner_name_splitter.name, recursive=False ) - inner_klass.dia_symbols.add( inner_dia_class.symIndexId ) - except parent_class.declaration_not_found_t: - inner_klass = self.__create_class( inner_dia_class ) - parent_class.adopt_declaration( inner_klass - , impl_details.guess_access_type( inner_dia_class.access ) ) - self.__classes[ inner_dia_class.name ] = inner_klass - self.logger.debug( 'adding inner classes to "%s" - done' % parent_class.decl_string ) - def __create_enum( self, enum_smbl ): name_splitter = impl_details.get_name_splitter( enum_smbl.name ) enum_decl = declarations.enumeration_t( name_splitter.name ) @@ -245,23 +234,6 @@ #between those cases return None - def __load_enums( self, parent_symbol_id ): - parent_symbol = self.__dia_session.symbolById( parent_symbol_id ) - self.logger.debug( 'loading enums to "%s" ' % parent_symbol.name ) - enum_smbls = parent_symbol.findChildren( SymTagEnum, None, 0 ) - for enum_smbl in itertools.imap(as_symbol, enum_smbls ): - enum_decl = self.__create_enum( enum_smbl ) - if enum_decl: - try: - for enum_discovered in self.__enums[ enum_smbl.name ]: - if self.__are_symbols_equivalent( enum_smbl.symIndexId, enum_discovered.dia_symbols[0] ): - continue - else: - self.__enums[ enum_smbl.name ].append( enum_decl ) - except KeyError: - self.__enums[ enum_smbl.name ] = [ enum_decl ] - self.logger.debug( '\tfound %s %s' % ( enum_smbl.name, str(enum_decl) ) ) - self.logger.debug( 'loading enums to "%s" - done' % parent_symbol.name ) def __create_typedef( self, typedef_smbl ): name_splitter = impl_details.get_name_splitter( typedef_smbl.name ) @@ -269,82 +241,10 @@ typedef_decl.dia_symbols = [ typedef_smbl.symIndexId ] return typedef_decl - def __load_typedefs( self, parent_symbol_id ): - parent_symbol = self.__dia_session.symbolById( parent_symbol_id ) - self.logger.debug( 'loading typedefs to "%s" ' % parent_symbol.name ) - typedef_smbls = parent_symbol.findChildren( SymTagTypedef, None, 0 ) - for typedef_smbl in itertools.imap(as_symbol, typedef_smbls ): - typedef_decl = self.__create_typedef( typedef_smbl ) - try: - for typedef_discovered in self.__typedefs[ typedef_smbl.name ]: - if self.__are_symbols_equivalent( typedef_smbl.symIndexId, typedef_discovered.dia_symbols[0] ): - continue - else: - self.__typedefs[ typedef_smbl.name ].append( typedef_decl ) - except KeyError: - self.__typedefs[ typedef_smbl.name ] = [ typedef_decl ] - self.logger.debug( '\tfound %s %s' % ( typedef_smbl.name, str(typedef_decl) ) ) - self.logger.debug( 'loading typedefs to "%s" - done' % parent_symbol.name ) - - def __load_classes( self, parent_symbol_id ): - parent_symbol = self.__dia_session.symbolById( parent_symbol_id ) - self.logger.debug( 'loading classes to "%s" ' % parent_symbol.name ) - class_smbls = parent_symbol.findChildren( msdia.SymTagUDT, None, 0 ) - for class_smbl in itertools.imap(as_symbol, class_smbls ): - class_decl = self.__create_class( class_smbl ) - try: - equivalent_found = False - for class_discovered in self.__classes[ class_smbl.name ]: - for smbl_discovered in class_discovered.dia_symbols: - equivalent_found = self.__are_symbols_equivalent( smbl_discovered, class_smbl.symIndexId ) - if equivalent_found: - class_discovered.dia_symbols.add( class_smbl.symIndexId ) - break - if equivalent_found: - break - if not equivalent_found: - self.__classes[ class_smbl.name ].append( class_decl ) - except KeyError: - self.__classes[ class_smbl.name ] = [ class_decl ] - self.logger.debug( '\tfound %s' % str(class_decl) ) - self.logger.debug( 'loading classes to "%s" - done' % parent_symbol.name ) - def __create_class( self, class_smbl ): name_splitter = impl_details.get_name_splitter( class_smbl.name ) class_decl = declarations.class_t( name_splitter.name ) class_decl.class_type = impl_details.guess_class_type(class_smbl.udtKind) - class_decl.dia_symbols = set([class_smbl.symIndexId]) + class_decl.dia_symbols = [class_smbl] class_decl.byte_size = class_smbl.length return class_decl - - def __populate_scopes(self): - self.__load_enums( self.dia_global_scope.symIndexId ) - self.__load_classes( self.dia_global_scope.symIndexId ) - self.__load_typedefs( self.dia_global_scope.symIndexId ) - #~ main_classes = self.__list_main_classes() - #~ self.__create_nss() - - #~ for dia_class in main_classes: - #~ name_splitter = impl_details.get_name_splitter( dia_class.name ) - #~ if not name_splitter.scope_names: - #~ parent_ns = self.global_ns - #~ else: - #~ parent_ns = self.__namespaces[ name_splitter.scope_names[-1] ] - - #~ try: - #~ klass = parent_ns.class_( name_splitter.name, recursive=False ) - #~ klass.dia_symbols.add( dia_class.symIndexId ) - #~ except parent_ns.declaration_not_found_t: - #~ klass = self.__create_class( dia_class ) - #~ parent_ns.adopt_declaration( klass ) - #~ self.__classes[ dia_class.name ] = klass - - #~ map( self.__add_inner_classes, self.__classes.values() ) - - #~ self.__add_enums( self.dia_global_scope.symIndexId ) - #~ for klass in self.__classes.itervalues(): - #~ map( self.__add_enums, klass.dia_symbols ) - - #declarations.print_declarations( self.global_ns )#.namespace( 'ns1' ) ) - #declarations.print_declarations( self.global_ns.namespace( 'std' ) ) - Deleted: pygccxml_dev/unittests/pdb_reader.py =================================================================== --- pygccxml_dev/unittests/pdb_reader.py 2008-03-22 22:14:05 UTC (rev 1285) +++ pygccxml_dev/unittests/pdb_reader.py 2008-03-22 22:14:36 UTC (rev 1286) @@ -1,22 +0,0 @@ -import os -import sys -import win32com.client -from sets import Set as set - -MODULE_IDENTIFIER = ('{106173A0-0173-4e5c-84E7-E915422BE997}', 0, 2, 0) -MODULE_PATH = r'Lib\site-packages\win32com\gen_py\106173A0-0173-4e5c-84E7-E915422BE997x0x2x0.py' - -try: - full_module_path = os.path.split( sys.executable )[0] - full_module_path = os.path.join( full_module_path, MODULE_PATH ) - if os.path.exists( full_module_path ): - os.remove( full_module_path ) - print full_module_path, " removed successfully" -except Exception, error: - print error - -msdia = win32com.client.gencache.EnsureModule( *MODULE_IDENTIFIER ) -print msdia - -if __name__ == "__main__": - pass Modified: pygccxml_dev/unittests/pdb_tester.py =================================================================== --- pygccxml_dev/unittests/pdb_tester.py 2008-03-22 22:14:05 UTC (rev 1285) +++ pygccxml_dev/unittests/pdb_tester.py 2008-03-22 22:14:36 UTC (rev 1286) @@ -8,11 +8,15 @@ class tester_t( unittest.TestCase ): def __init__(self, *args): unittest.TestCase.__init__(self, *args) + self.pdb_file = os.path.join( autoconfig.data_directory + , 'msvc_build' + , 'Debug' + , 'msvc_build.pdb' ) def __test_splitter_impl( self, name, expected_result ): splitter = pdb.impl_details.full_name_splitter_t( name ) - self.failUnless( len(splitter.scope_names) == len(expected_result) ) - self.failUnless( splitter.scope_names == expected_result ) + self.failUnless( len(splitter.scope_names) == len(expected_result) ) + self.failUnless( splitter.scope_names == expected_result ) def __test_name_splitter(self): name = "std::_Tree<std::_Tmap_traits<engine_objects::ouuid_t,engine_objects::sql_query::parameterized_query::sql_fragment_t,std::less<engine_objects::ouuid_t>,std::allocator<std::pair<engine_objects::ouuid_t const ,engine_objects::sql_query::parameterized_query::sql_fragment_t> >,0> >::const_iterator::operator->" @@ -21,17 +25,16 @@ , 'std::_Tree<std::_Tmap_traits<engine_objects::ouuid_t,engine_objects::sql_query::parameterized_query::sql_fragment_t,std::less<engine_objects::ouuid_t>,std::allocator<std::pair<engine_objects::ouuid_t const ,engine_objects::sql_query::parameterized_query::sql_fragment_t> >,0> >', 'std::_Tree<std::_Tmap_traits<engine_objects::ouuid_t,engine_objects::sql_query::parameterized_query::sql_fragment_t,std::less<engine_objects::ouuid_t>,std::allocator<std::pair<engine_objects::ouuid_t const ,engine_objects::sql_query::parameterized_query::sql_fragment_t> >,0> >::const_iterator' ] self.__test_splitter_impl( name, expected_result ) - + name = 'boost::reference_wrapper<engine_objects::ops::pathable_t const >::operator engine_objects::ops::pathable_t const &' expected_result = [ 'boost' , 'boost::reference_wrapper<engine_objects::ops::pathable_t const >' ] self.__test_splitter_impl( name, expected_result ) - + def test_create_nss(self): - control_pdb = os.path.join( autoconfig.data_directory, r'xxx.pdb' ) - reader = pdb.decl_loader_t( control_pdb ) + reader = pdb.decl_loader_t( self.pdb_file ) print reader.symbols_table.name reader.read() f = file( 'decls.cpp', 'w+' ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |