[pygccxml-commit] SF.net SVN: pygccxml: [1280] pygccxml_dev
Brought to you by:
mbaas,
roman_yakovenko
|
From: <rom...@us...> - 2008-03-15 19:18:31
|
Revision: 1280
http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1280&view=rev
Author: roman_yakovenko
Date: 2008-03-15 12:18:36 -0700 (Sat, 15 Mar 2008)
Log Message:
-----------
Modified Paths:
--------------
pygccxml_dev/pygccxml/msvc/pdb/__init__.py
pygccxml_dev/pygccxml/msvc/pdb/impl_details.py
pygccxml_dev/unittests/pdb_tester.py
Added Paths:
-----------
pygccxml_dev/pygccxml/msvc/pdb/loader.py
Modified: pygccxml_dev/pygccxml/msvc/pdb/__init__.py
===================================================================
--- pygccxml_dev/pygccxml/msvc/pdb/__init__.py 2008-03-12 21:11:19 UTC (rev 1279)
+++ pygccxml_dev/pygccxml/msvc/pdb/__init__.py 2008-03-15 19:18:36 UTC (rev 1280)
@@ -19,266 +19,4 @@
finally:
comtypes.client.gen_dir = comtypes_client_gen_dir
-
-
-SymTagEnum = 12
-
-def AsDiaSymbol( x ):
- return ctypes.cast( x, ctypes.POINTER( msdia.IDiaSymbol ) )
-
-
-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 reader_t(object):
- def __init__(self, pdb_file_path ):
- self.logger = utils.loggers.pdb_reader
- self.logger.setLevel(logging.DEBUG)
- 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.logger.debug( 'opening session - done' )
- self.__global_ns = declarations.namespace_t( '::' )
-
- self.__enums = {}
- self.__classes = {}
- self.__typedefs = {}
- self.__namespaces = {'': self.__global_ns}
-
- def read(self):
- self.__populate_scopes()
-
- @property
- def dia_global_scope(self):
- return self.__dia_session.globalScope
-
- @property
- def global_ns(self):
- return self.__global_ns
-
- def __are_symbols_equivalent( self, smbl1_id, smbl2_id ):
- smbl1 = self.__dia_session.symbolById(smbl1_id)
- smbl2 = self.__dia_session.symbolById(smbl2_id)
- result = self.__dia_session.symsAreEquiv( smbl1, smbl2 )
- if result:
- msg = 'Symbols "%s(%d)" and "%s(%d)" are equivalent.'
- else:
- msg = 'Symbols "%s(%d)" and "%s(%d)" are NOT equivalent.'
- self.logger.debug( msg, smbl1.name, smbl1_id, smbl2.name, smbl2_id )
- return result
-
- def __find_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( found.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 impl_details.guess_class_type(s.udtKind)
- else:
- 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 iter( dia_classes ):
- dia_class = AsDiaSymbol( dia_class )
- 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 iter(found):
- inner_dia_class = AsDiaSymbol( inner_dia_class )
- 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 )
- enum_decl.dia_symbols = [ enum_smbl.symIndexId ]
- enum_decl.byte_size = enum_smbl.length
- values = enum_smbl.findChildren( msdia.SymTagData, None, 0 )
- for v in iter(values):
- v = AsDiaSymbol(v)
- if v.classParent.symIndexId != enum_smbl.symIndexId:
- continue
- enum_decl.append_value( v.name, v.value )
- if enum_decl.values:
- return enum_decl
- else:
- #for some reason same enum could appear under global namespace and
- #under the class, it was defined in. This is a criteria I use to distinguish
- #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 )
- for enum_smbl in iter( parent_symbol.findChildren( SymTagEnum, None, 0 ) ):
- enum_smbl = AsDiaSymbol( enum_smbl )
- 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 )
- typedef_decl = declarations.typedef_t( name_splitter.name )
- 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 )
- for typedef_smbl in iter( parent_symbol.findChildren( SymTagEnum, None, 0 ) ):
- typedef_smbl = AsDiaSymbol( typedef_smbl )
- 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 )
- for class_smbl in iter( parent_symbol.findChildren( msdia.SymTagUDT, None, 0 ) ):
- class_smbl = AsDiaSymbol( class_smbl )
- 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_nss( self ):
- nss = self.__namespaces.keys()
- nss.sort()
- for ns_name in nss:
- name_splitter = impl_details.get_name_splitter( ns_name )
- if not name_splitter.scope_names:
- parent_ns = self.global_ns
- else:
- parent_ns = self.__namespaces[ name_splitter.scope_names[-1] ]
- ns_decl = declarations.namespace_t( name_splitter.name )
- parent_ns.adopt_declaration( ns_decl )
- self.__namespaces[ ns_name ] = ns_decl
-
- 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.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' ) )
-
-if __name__ == '__main__':
- control_pdb = r'C:\dev\produce_pdb\Debug\produce_pdb.pdb'
- control_pdb = r'xxx.pdb'
- reader = scanner_t( control_pdb )
- reader.read()
- f = file( 'decls.cpp', 'w+' )
- declarations.print_declarations( reader.global_ns, writer=f.write )
- f.close()
+from loader import decl_loader_t
\ No newline at end of file
Modified: pygccxml_dev/pygccxml/msvc/pdb/impl_details.py
===================================================================
--- pygccxml_dev/pygccxml/msvc/pdb/impl_details.py 2008-03-12 21:11:19 UTC (rev 1279)
+++ pygccxml_dev/pygccxml/msvc/pdb/impl_details.py 2008-03-15 19:18:36 UTC (rev 1280)
@@ -41,22 +41,27 @@
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
-
+ try:
+ 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 and tmp:
+ next_token = tmp.pop()
+ token = token + '::' + next_token
+ less_count += next_token.count( '<' )
+ greater_count += next_token.count( '>' )
+ result.append( token )
+ return result
+ except Exception, err:
+ msg = 'Unable to split scope for identifiers. The full scope name is: "%s". Error: %s'
+ msg = msg % ( self.__full_name, str(err) )
+ raise RuntimeError( msg )
+
__name_splitters = {}
def get_name_splitter( full_name ):
try:
Added: pygccxml_dev/pygccxml/msvc/pdb/loader.py
===================================================================
--- pygccxml_dev/pygccxml/msvc/pdb/loader.py (rev 0)
+++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-03-15 19:18:36 UTC (rev 1280)
@@ -0,0 +1,343 @@
+import os
+import sys
+import ctypes
+import pprint
+import logging
+import comtypes
+import itertools
+import comtypes.client
+
+from . import enums
+from . import impl_details
+
+from ... import utils
+from ... import declarations
+from .. import config as msvc_cfg
+
+msdia = comtypes.client.GetModule( msvc_cfg.msdia_path )
+
+SymTagEnum = 12
+msdia.SymTagEnum = 12
+
+def as_symbol( x ):
+ return ctypes.cast( x, ctypes.POINTER( msdia.IDiaSymbol ) )
+
+def as_table( x ):
+ return ctypes.cast( x, ctypes.POINTER( msdia.IDiaTable ) )
+
+def as_enum_symbols( x ):
+ return ctypes.cast( x, ctypes.POINTER( msdia.IDiaEnumSymbols ) )
+
+def as_enum_variant( x ):
+ return ctypes.cast( x, ctypes.POINTER( comtypes.automation.IEnumVARIANT ) )
+
+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 decl_loader_t(object):
+ def __init__(self, pdb_file_path ):
+ self.logger = utils.loggers.pdb_reader
+ self.logger.setLevel(logging.DEBUG)
+ 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.logger.debug( 'opening session - done' )
+ self.__global_ns = declarations.namespace_t( '::' )
+
+ self.__enums = {}
+ self.__classes = {}
+ self.__typedefs = {}
+
+ def __find_table(self, name):
+ valid_names = ( 'Symbols', 'SourceFiles', 'Sections'
+ , 'SegmentMap', 'InjectedSource', 'FrameData' )
+ tables = self.__dia_session.getEnumTables()
+ for table in itertools.imap(as_table, tables):
+ if name == table.name:
+ return table
+ else:
+ return None
+
+ @utils.cached
+ def symbols_table(self):
+ return self.__find_table( "Symbols" )
+
+ @utils.cached
+ def symbols(self):
+ smbls = {}
+ for smbl in itertools.imap( as_symbol, as_enum_variant( self.symbols_table._NewEnum ) ):
+ smbls[ smbl.symIndexId ] = smbl
+ return smbls
+
+ def __load_nss(self):
+ def ns_filter( smbl ):
+ tags = ( msdia.SymTagFunction
+ , msdia.SymTagBlock
+ , msdia.SymTagData
+ , msdia.SymTagAnnotation
+ , msdia.SymTagPublicSymbol
+ , msdia.SymTagUDT
+ , msdia.SymTagEnum
+ , msdia.SymTagFunctionType
+ , msdia.SymTagPointerType
+ , msdia.SymTagArrayType
+ , msdia.SymTagBaseType
+ , msdia.SymTagTypedef
+ , msdia.SymTagBaseClass
+ , msdia.SymTagFriend
+ , msdia.SymTagFunctionArgType
+ , msdia.SymTagUsingNamespace )
+ if smbl.symTag not in tags:
+ return False
+ elif not smbl.name:
+ return False
+ elif smbl.classParent:
+ if smbl.classParent.name:
+ return False
+ elif smbl.classParent.symTag == msdia.SymTagUDT:
+ return False
+ 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() ) ):
+ if index and ( index % 10000 == 0 ):
+ self.logger.debug( '%d symbols scanned', index )
+ 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 )
+ if not name_splitter.scope_names:
+ parent_ns = self.global_ns
+ else:
+ parent_ns = nss[ name_splitter.scope_names[-1] ]
+ ns_decl = declarations.namespace_t( name_splitter.name )
+ 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 read(self):
+ self.__load_nss()
+ #self.__populate_scopes()
+
+ @property
+ def dia_global_scope(self):
+ return self.__dia_session.globalScope
+
+ @property
+ def global_ns(self):
+ return self.__global_ns
+
+ def __are_symbols_equivalent( self, smbl1_id, smbl2_id ):
+ smbl1 = self.__dia_session.symbolById(smbl1_id)
+ smbl2 = self.__dia_session.symbolById(smbl2_id)
+ result = self.__dia_session.symsAreEquiv( smbl1, smbl2 )
+ if result:
+ msg = 'Symbols "%s(%d)" and "%s(%d)" are equivalent.'
+ else:
+ msg = 'Symbols "%s(%d)" and "%s(%d)" are NOT equivalent.'
+ self.logger.debug( msg, smbl1.name, smbl1_id, smbl2.name, smbl2_id )
+ return result
+
+ def __find_udt( self, name ):
+ self.logger.debug( 'testing whether name( "%s" ) is UDT symbol' % name )
+ flags = enums.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 as_symbol( found.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 [as_symbol( s ) for s in iter(found)]
+ #~ for s in iter(found):
+ #~ s =
+ #~ print s.name
+ #~ print impl_details.guess_class_type(s.udtKind)
+ else:
+ 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 )
+ enum_decl.dia_symbols = [ enum_smbl.symIndexId ]
+ enum_decl.byte_size = enum_smbl.length
+ values = enum_smbl.findChildren( msdia.SymTagData, None, 0 )
+ for v in itertools.imap(as_symbol, values):
+ if v.classParent.symIndexId != enum_smbl.symIndexId:
+ continue
+ enum_decl.append_value( v.name, v.value )
+ if enum_decl.values:
+ return enum_decl
+ else:
+ #for some reason same enum could appear under global namespace and
+ #under the class, it was defined in. This is a criteria I use to distinguish
+ #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 )
+ typedef_decl = declarations.typedef_t( name_splitter.name )
+ 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.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' ) )
+
Modified: pygccxml_dev/unittests/pdb_tester.py
===================================================================
--- pygccxml_dev/unittests/pdb_tester.py 2008-03-12 21:11:19 UTC (rev 1279)
+++ pygccxml_dev/unittests/pdb_tester.py 2008-03-15 19:18:36 UTC (rev 1280)
@@ -9,16 +9,37 @@
def __init__(self, *args):
unittest.TestCase.__init__(self, *args)
- def test(self):
+ 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 )
+
+ 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->"
+ expected_result = [
+ 'std'
+ , '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.reader_t( control_pdb )
+ reader = pdb.decl_loader_t( control_pdb )
+ print reader.symbols_table.name
reader.read()
f = file( 'decls.cpp', 'w+' )
- declarations.print_declarations( reader.global_ns, writer=f.write )
+ declarations.print_declarations( reader.global_ns )#, writer=f.write )
f.close()
def create_suite():
- suite = unittest.TestSuite()
+ suite = unittest.TestSuite()
suite.addTest( unittest.makeSuite(tester_t))
return suite
@@ -26,4 +47,4 @@
unittest.TextTestRunner(verbosity=2).run( create_suite() )
if __name__ == "__main__":
- run_suite()
\ No newline at end of file
+ run_suite()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|