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