From: <rom...@us...> - 2008-02-21 08:05:25
|
Revision: 1252 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1252&view=rev Author: roman_yakovenko Date: 2008-02-21 00:05:30 -0800 (Thu, 21 Feb 2008) Log Message: ----------- Added Paths: ----------- pygccxml_dev/pygccxml/pdb_parser/details.py pygccxml_dev/pygccxml/pdb_parser/reader.py Removed Paths: ------------- pygccxml_dev/pygccxml/pdb_parser/pdb_reader.py Added: pygccxml_dev/pygccxml/pdb_parser/details.py =================================================================== --- pygccxml_dev/pygccxml/pdb_parser/details.py (rev 0) +++ pygccxml_dev/pygccxml/pdb_parser/details.py 2008-02-21 08:05:30 UTC (rev 1252) @@ -0,0 +1,58 @@ +def guess_class_type( udt_kind ): + if msdia.UdtKind.UdtStruct == udt_kind: + return declarations.CLASS_TYPES.STRUCT + elif msdia.UdtKind.UdtClass == udt_kind: + return declarations.CLASS_TYPES.CLASS + else: + return declarations.CLASS_TYPES.UNION + + +class full_name_splitter_t( object ): + def __init__( self, full_name ): + self.__full_name = full_name + self.__identifiers = self.__split_scope_identifiers() + self.__scope_identifiers = None + + @property + def name( self ): + return self.__identifiers[-1] + + @property + def scope_names( self ): + if None is self.__scope_identifiers: + self.__scope_identifiers = ['::'] + for i in range( len(self.__identifiers) - 1): + self.__scope_identifiers.append( '::'.join( self.__identifiers[0:i+1] ) ) + return self.__scope_identifiers + + @property + def identifiers( self ): + return self.__identifiers + + def __split_scope_identifiers( self ): + result = [] + tmp = self.__full_name.split( '::' ) + tmp.reverse() + while tmp: + token = tmp.pop() + less_count = token.count( '<' ) + greater_count = token.count( '>' ) + if less_count != greater_count: + while less_count != greater_count: + next_token = tmp.pop() + token = token + '::' + next_token + less_count += next_token.count( '<' ) + greater_count += next_token.count( '>' ) + result.append( token ) + return result + + +if '__main__' == __name__: + name = "boost::detail::is_base_and_derived_impl2<engine_objects::universal_base_t,engine_objects::erroneous_transactions_file_configuration_t>::Host" + fnsp = full_name_splitter_t( name ) + for x in fnsp.scope_names: + print x + + fnsp = full_name_splitter_t( 'x' ) + for x in fnsp.scope_names: + print x Deleted: pygccxml_dev/pygccxml/pdb_parser/pdb_reader.py =================================================================== --- pygccxml_dev/pygccxml/pdb_parser/pdb_reader.py 2008-02-21 06:50:59 UTC (rev 1251) +++ pygccxml_dev/pygccxml/pdb_parser/pdb_reader.py 2008-02-21 08:05:30 UTC (rev 1252) @@ -1,164 +0,0 @@ -import os -import sys -import ctypes -import comtypes -import comtypes.client -from msdia_details import msdia - -sys.path.append( r'../..' ) -#sys.path.append( r'C:\dev\language-binding\pygccxml_dev' ) - -from pygccxml import utils -from pygccxml import declarations - - - -SymTagEnum = 12 - -def AsDiaSymbol( x ): - return ctypes.cast( x, ctypes.POINTER( msdia.IDiaSymbol ) ) - -def print_enums( smb ): - enums = smb.findChildren( SymTagEnum, None, 0 ) - for enum in iter( enums ): - enum = AsDiaSymbol( enum ) - print 'name: ', enum.name - if enum.container: - print 'container: ', enum.container.name - if enum.classParent: - print 'parent: ', enum.classParent.name - if enum.lexicalParent: - print 'lexical parent: ', enum.lexicalParent.Name - - values = enum.findChildren( msdia.SymTagData, None, 0 ) - for v in iter(values): - v = AsDiaSymbol(v) - if v.classParent.symIndexId != enum.symIndexId: - continue - print ' value %s(%d): ' % ( v.name, v.value ) - -def print_files( session ): - files = iter( session.findFile( None, '', 0 ) ) - for f in files: - f = ctypes.cast( f, ctypes.POINTER(msdia.IDiaSourceFile) ) - print 'File: ', f.fileName - -#~ print_files( session ) -#print_enums( root_symbol ) -def guess_class_type( udt_kind ): - if msdia.UdtKind.UdtStruct == udt_kind: - return declarations.CLASS_TYPES.STRUCT - elif msdia.UdtKind.UdtClass == udt_kind: - return declarations.CLASS_TYPES.CLASS - else: - return declarations.CLASS_TYPES.UNION - -class pdb_reader_t(object): - def __init__(self, pdb_file_path ): - self.logger = utils.loggers.gccxml - self.logger.debug( 'creating DiaSource object' ) - self.__dia_source = comtypes.client.CreateObject( msdia.DiaSource ) - self.logger.debug( 'loading pdb file: %s' % pdb_file_path ) - self.__dia_source.loadDataFromPdb(pdb_file_path) - self.logger.debug( 'opening session' ) - self.__dia_session = self.__dia_source.openSession() - self.__global_ns = declarations.namespace_t( '::' ) - self.__id2decl = {} #hash table unique symbol id : pygccxml declaration - - def read(self): - self.__populate_scopes() - - files = iter( self.__dia_session.findFile( None, '', 0 ) ) - for f in files: - f = ctypes.cast( f, ctypes.POINTER(msdia.IDiaSourceFile) ) - print 'File: ', f.fileName - - @property - def dia_global_scope(self): - return self.__dia_session.globalScope - - @property - def global_ns(self): - return self.__global_ns - - def __split_scope_identifiers( self, name ): - result = [] - tmp = name.split( '::' ) - tmp.reverse() - while tmp: - token = tmp.pop() - less_count = token.count( '<' ) - greater_count = token.count( '>' ) - if less_count != greater_count: - while less_count != greater_count: - next_token = tmp.pop() - token = token + '::' + next_token - less_count += next_token.count( '<' ) - greater_count += next_token.count( '>' ) - result.append( token ) - return result - - def __scope_identifie - - def __found_udt( self, name ): - self.logger.debug( 'testing whether name( "%s" ) is UDT symbol' % name ) - flags = msdia.NameSearchOptions.nsfCaseSensitive - found = self.dia_global_scope.findChildren( msdia.SymTagUDT, name, flags ) - if found.Count == 1: - self.logger.debug( 'name( "%s" ) is UDT symbol' % name ) - return AsDiaSymbol( fount.Item[0] ) - elif 1 < found.Count: - raise RuntimeError( "duplicated UDTs with name '%s', were found" % name ) - #~ self.logger.debug( 'name( "%s" ) is UDT symbol' % name ) - #~ return [AsDiaSymbol( s ) for s in iter(found)] - #~ for s in iter(found): - #~ s = - #~ print s.name - #~ print guess_class_type(s.udtKind) - else: - self.logger.debug( 'name( "%s" ) is **NOT** UDT symbol' % name ) - return False - - def __populate_scopes(self): - classes = {} #full name to list of symbols - dia_classes = self.dia_global_scope.findChildren( msdia.SymTagUDT, None, 0 ) - for dia_class in iter( dia_classes ): - dia_class = AsDiaSymbol( dia_class ) - if not classes.has_key( dia_class.name ): - classes[ dia_class.name ] = [ dia_class ] - else: - classes[ dia_class.name ].append( dia_class ) - for name, class_list in classes.iteritems(): - if len( class_list ) != 1: - print len( class_list ), name - - #~ klass = declarations.class_t(dia_class.name) - #~ klass.class_type = guess_class_type( dia_class.udtKind ) - #~ scope_identifiers = self.__split_scope_identifiers( dia_class.name ) - #~ if 1 == len(scope_identifiers): - #~ classes.append( klass ) - #~ else: - #~ ns_ref = self.global_ns - #~ for i in range( len(scope_identifiers) - 1): - #~ full_identifier = '::'.join( scope_identifiers[0:i+1] ) - #~ if not self.__is_udt( full_identifier ): - #~ #we have namespace - #~ try: - #~ ns_ref = ns_ref.namespace( scope_identifiers[i], recursive=False) - #~ except ns_ref.declaration_not_found_t: - #~ new_ns = declarations.namespace_t( scope_identifiers[i] ) - #~ ns_ref.adopt_declaration( new_ns ) - #~ ns_ref = new_ns - #~ else: - #~ classes.append( klass ) - #~ break - #~ classes.sort( lambda klass1, klass2: cmp( klass1.name, klass2.name ) ) - #~ for i in classes: - #~ print str(i) - #~ declarations.print_declarations( self.global_ns ) - -if __name__ == '__main__': - control_pdb = r'C:\dev\produce_pdb\Debug\produce_pdb.pdb' - control_pdb = r'xxx.pdb' - reader = pdb_reader_t( control_pdb ) - reader.read() Copied: pygccxml_dev/pygccxml/pdb_parser/reader.py (from rev 1251, pygccxml_dev/pygccxml/pdb_parser/pdb_reader.py) =================================================================== --- pygccxml_dev/pygccxml/pdb_parser/reader.py (rev 0) +++ pygccxml_dev/pygccxml/pdb_parser/reader.py 2008-02-21 08:05:30 UTC (rev 1252) @@ -0,0 +1,141 @@ +import os +import sys +import ctypes +import comtypes +import comtypes.client +from msdia_details import msdia + +sys.path.append( r'../..' ) +#sys.path.append( r'C:\dev\language-binding\pygccxml_dev' ) + +from pygccxml import utils +from pygccxml import declarations + +import details + + +SymTagEnum = 12 + +def AsDiaSymbol( x ): + return ctypes.cast( x, ctypes.POINTER( msdia.IDiaSymbol ) ) + +def print_enums( smb ): + enums = smb.findChildren( SymTagEnum, None, 0 ) + for enum in iter( enums ): + enum = AsDiaSymbol( enum ) + print 'name: ', enum.name + if enum.container: + print 'container: ', enum.container.name + if enum.classParent: + print 'parent: ', enum.classParent.name + if enum.lexicalParent: + print 'lexical parent: ', enum.lexicalParent.Name + + values = enum.findChildren( msdia.SymTagData, None, 0 ) + for v in iter(values): + v = AsDiaSymbol(v) + if v.classParent.symIndexId != enum.symIndexId: + continue + print ' value %s(%d): ' % ( v.name, v.value ) + +def print_files( session ): + files = iter( session.findFile( None, '', 0 ) ) + for f in files: + f = ctypes.cast( f, ctypes.POINTER(msdia.IDiaSourceFile) ) + print 'File: ', f.fileName + + +class pdb_reader_t(object): + def __init__(self, pdb_file_path ): + self.logger = utils.loggers.gccxml + self.logger.debug( 'creating DiaSource object' ) + self.__dia_source = comtypes.client.CreateObject( msdia.DiaSource ) + self.logger.debug( 'loading pdb file: %s' % pdb_file_path ) + self.__dia_source.loadDataFromPdb(pdb_file_path) + self.logger.debug( 'opening session' ) + self.__dia_session = self.__dia_source.openSession() + self.__global_ns = declarations.namespace_t( '::' ) + self.__id2decl = {} #hash table unique symbol id : pygccxml declaration + + def read(self): + self.__populate_scopes() + + files = iter( self.__dia_session.findFile( None, '', 0 ) ) + for f in files: + f = ctypes.cast( f, ctypes.POINTER(msdia.IDiaSourceFile) ) + print 'File: ', f.fileName + + @property + def dia_global_scope(self): + return self.__dia_session.globalScope + + @property + def global_ns(self): + return self.__global_ns + + + def __found_udt( self, name ): + self.logger.debug( 'testing whether name( "%s" ) is UDT symbol' % name ) + flags = msdia.NameSearchOptions.nsfCaseSensitive + found = self.dia_global_scope.findChildren( msdia.SymTagUDT, name, flags ) + if found.Count == 1: + self.logger.debug( 'name( "%s" ) is UDT symbol' % name ) + return AsDiaSymbol( fount.Item[0] ) + elif 1 < found.Count: + raise RuntimeError( "duplicated UDTs with name '%s', were found" % name ) + #~ self.logger.debug( 'name( "%s" ) is UDT symbol' % name ) + #~ return [AsDiaSymbol( s ) for s in iter(found)] + #~ for s in iter(found): + #~ s = + #~ print s.name + #~ print details.guess_class_type(s.udtKind) + else: + self.logger.debug( 'name( "%s" ) is **NOT** UDT symbol' % name ) + return False + + def __populate_scopes(self): + classes = {} #full name to list of symbols + dia_classes = self.dia_global_scope.findChildren( msdia.SymTagUDT, None, 0 ) + for dia_class in iter( dia_classes ): + dia_class = AsDiaSymbol( dia_class ) + if not classes.has_key( dia_class.name ): + classes[ dia_class.name ] = [ dia_class ] + else: + classes[ dia_class.name ].append( dia_class ) + + for name, class_list in classes.iteritems(): + fname_splitter = details.full_name_splitter_t( name ) + klass = declarations.class_t(fname_splitter.name) + klass.class_type = details.guess_class_type( dia_class.udtKind ) + klass.dia_symbols = class_list + + for index, scope in enumerate( fname_splitter.scope_names ): + + + if not fname_splitter.scope_name: + classes.append( klass ) + else: + ns_ref = self.global_ns + for i in range( len(scope_identifiers) - 1): + full_identifier = '::'.join( scope_identifiers[0:i+1] ) + if not self.__is_udt( full_identifier ): + #we have namespace + try: + ns_ref = ns_ref.namespace( scope_identifiers[i], recursive=False) + except ns_ref.declaration_not_found_t: + new_ns = declarations.namespace_t( scope_identifiers[i] ) + ns_ref.adopt_declaration( new_ns ) + ns_ref = new_ns + else: + classes.append( klass ) + break + #~ classes.sort( lambda klass1, klass2: cmp( klass1.name, klass2.name ) ) + #~ for i in classes: + #~ print str(i) + #~ declarations.print_declarations( self.global_ns ) + +if __name__ == '__main__': + control_pdb = r'C:\dev\produce_pdb\Debug\produce_pdb.pdb' + control_pdb = r'xxx.pdb' + reader = pdb_reader_t( control_pdb ) + reader.read() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |