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.
|