[pygccxml-commit] SF.net SVN: pygccxml: [1296] pygccxml_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2008-04-05 06:42:02
|
Revision: 1296 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1296&view=rev Author: roman_yakovenko Date: 2008-04-04 23:42:06 -0700 (Fri, 04 Apr 2008) Log Message: ----------- another set of improvements to PDB module Modified Paths: -------------- pygccxml_dev/pygccxml/msvc/common_utils.py pygccxml_dev/pygccxml/msvc/pdb/loader.py pygccxml_dev/unittests/autoconfig.py pygccxml_dev/unittests/data/msvc_build/all.cpp pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj pygccxml_dev/unittests/declarations_tester.py pygccxml_dev/unittests/pdb_tester.py Modified: pygccxml_dev/pygccxml/msvc/common_utils.py =================================================================== --- pygccxml_dev/pygccxml/msvc/common_utils.py 2008-04-04 19:35:03 UTC (rev 1295) +++ pygccxml_dev/pygccxml/msvc/common_utils.py 2008-04-05 06:42:06 UTC (rev 1296) @@ -24,6 +24,17 @@ UNDNAME_NO_IDENT_CHAR_CHECK = 0x10000 #Suppresses check for valid identifier characters. UNDNAME_NO_PTR64 = 0x20000 #Does not include ptr64 in output. + UNDNAME_SCOPES_ONLY = UNDNAME_NO_LEADING_UNDERSCORES \ + | UNDNAME_NO_MS_KEYWORDS \ + | UNDNAME_NO_FUNCTION_RETURNS \ + | UNDNAME_NO_ALLOCATION_MODEL \ + | UNDNAME_NO_ALLOCATION_LANGUAGE \ + | UNDNAME_NO_ACCESS_SPECIFIERS \ + | UNDNAME_NO_THROW_SIGNATURES \ + | UNDNAME_NO_MEMBER_TYPE \ + | UNDNAME_NO_ECSU \ + | UNDNAME_NO_IDENT_CHAR_CHECK + #__unDName definition was taken from: #http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2006-02/msg00754.html msvcrxx = ctypes.CDLL( msvc_cfg.msvcr_path, mode=ctypes.RTLD_GLOBAL) @@ -44,6 +55,8 @@ def undecorate_name( name, options=None ): + if not name: + return '' if options is None: options = UNDECORATE_NAME_OPTIONS.UNDNAME_NO_ECSU buffer_size = 1024 * 32 Modified: pygccxml_dev/pygccxml/msvc/pdb/loader.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-04-04 19:35:03 UTC (rev 1295) +++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-04-05 06:42:06 UTC (rev 1296) @@ -78,20 +78,9 @@ @utils.cached def symbols(self): - def get_name( smbl ): - if not smbl.name: - return - else: - return msvc_utils.undecorate_name( smbl.name ) - #~ for ch in '@?$': - #~ if ch in smbl.name: - #~ return impl_details.undecorate_name( smbl.name ) - #~ else: - #~ return smbl.name - smbls = {} for smbl in itertools.imap( as_symbol, as_enum_variant( self.symbols_table._NewEnum ) ): - smbl.uname = get_name( smbl ) + smbl.uname = msvc_utils.undecorate_name( smbl.name, msvc_utils.UNDECORATE_NAME_OPTIONS.UNDNAME_SCOPES_ONLY ) smbls[ smbl.symIndexId ] = smbl return smbls @@ -148,7 +137,11 @@ if index and ( index % 10000 == 0 ): self.logger.debug( '%d symbols scanned', index ) name_splitter = impl_details.get_name_splitter( smbl.uname ) - names.update( name_splitter.scope_names ) + for sn in name_splitter.scope_names: + if '<' in sn: + break + else: + names.add( sn ) names = list( names ) names.sort() self.logger.debug( 'looking for scopes - done' ) @@ -157,37 +150,58 @@ self.logger.debug( 'building namespace objects' ) for ns_name in itertools.ifilterfalse( self.__find_udt, names ): + self.logger.debug( 'inserting ns "%s" into declarations tree', ns_name ) 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] ] + parent_ns = nss.get( name_splitter.scope_names[-1], None ) + if not parent_ns: + continue #in this case the parent scope is UDT ns_decl = declarations.namespace_t( name_splitter.name ) parent_ns.adopt_declaration( ns_decl ) nss[ ns_name ] = ns_decl + self.logger.debug( 'inserting ns "%s" into declarations tree - done', ns_name ) self.logger.debug( 'building namespace objects - done' ) self.logger.debug( 'scanning symbols table - done' ) - def __add_class( self, parent, class_decl ): - class_smbl = class_decl.dia_symbols[0] - already_added = parent.classes( class_decl.name, recursive=False, allow_empty=True ) + def __update_decls_tree( self, decl ): + smbl = decl.dia_symbols[0] + name_splitter = impl_details.get_name_splitter( smbl.uname ) + if not name_splitter.scope_names: + self.__adopt_declaration( self.global_ns, decl ) + else: + parent_name = '::' + name_splitter.scope_names[-1] + try: + parent = self.global_ns.decl( parent_name ) + except: + declarations.print_declarations( self.global_ns ) + print 'identifiers:' + for index, identifier in enumerate(name_splitter.identifiers): + print index, ':', identifier + raise + self.__adopt_declaration( parent, decl ) + + def __adopt_declaration( self, parent, decl ): + smbl = decl.dia_symbols[0] + already_added = parent.decls( decl.name, decl_type=decl.__class__, recursive=False, allow_empty=True ) if not already_added: if isinstance( parent, declarations.namespace_t ): - parent.adopt_declaration( class_decl ) + parent.adopt_declaration( decl ) else: - parent.adopt_declaration( class_decl, declarations.ACCESS_TYPES.PUBLIC ) + parent.adopt_declaration( decl, declarations.ACCESS_TYPES.PUBLIC ) else: - for decl in already_added: - for smbl in decl.dia_symbols: - if self.__are_symbols_equivalent( smbl, class_smbl ): - decl.dia_symbols.append( class_smbl ) + for other_decl in already_added: + for other_smbl in other_decl.dia_symbols: + if self.__are_symbols_equivalent( other_smbl, smbl ): + other_decl.dia_symbols.append( smbl ) return else: if isinstance( parent, declarations.namespace_t ): - parent.adopt_declaration( class_decl ) + parent.adopt_declaration( decl ) else: - parent.adopt_declaration( class_decl, declarations.ACCESS_TYPES.PUBLIC ) + parent.adopt_declaration( decl, declarations.ACCESS_TYPES.PUBLIC ) def __load_classes( self ): classes = {}#unique symbol id : class decl @@ -211,33 +225,25 @@ , allow_empty=True , recursive=True ) return bool( found ) - self.logger.info( 'integrating udt objects with namespaces' ) while classes: + to_be_integrated = len( classes ) self.logger.info( 'there are %d classes to go', len( classes ) ) to_be_deleted = filter( does_parent_exist_in_decls_tree, 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.uname ) - if not name_splitter.scope_names: - self.__add_class( self.global_ns, ns_class ) - else: - parent_name = '::' + name_splitter.scope_names[-1] - try: - parent = self.global_ns.decl( parent_name ) - except: - declarations.print_declarations( self.global_ns ) - print 'identifiers:' - for index, identifier in enumerate(name_splitter.identifiers): - print index, ':', identifier - raise - self.__add_class( parent, ns_class ) - del classes[ ns_class.dia_symbols[0].symIndexId ] + map( self.__update_decls_tree, to_be_deleted ) + map( lambda decl: classes.pop( decl.dia_symbols[0].symIndexId ) + , to_be_deleted ) + integrated = to_be_integrated - len( classes ) + if not integrated: + for cls in classes.itervalues(): + self.logger.debug( 'unable to integrate class "%s"', cls.dia_symbols[0].uname ) + break self.logger.info( 'integrating udt objects with namespaces - done' ) def read(self): self.__load_nss() self.__load_classes() + self.__load_enums() @property def dia_global_scope(self): @@ -277,12 +283,29 @@ self.logger.debug( 'name( "%s" ) is **NOT** UDT symbol' % name ) return None + def __load_enums( self ): + is_enum = lambda smbl: smbl.symTag == msdia.SymTagEnum + self.logger.info( 'building enum objects' ) + enums_count = 0 + for enum_smbl in itertools.ifilter( is_enum, self.symbols.itervalues() ): + enum_decl = self.__create_enum(enum_smbl) + if not enum_decl: + continue + enums_count += 1 + self.__update_decls_tree( enum_decl ) + self.logger.info( 'building enum objects(%d) - done', enums_count ) + def __update_decl_binary_names( self, decl, smbl ): + decl.mangled = iif( smbl.name, smbl.name, '' ) + decl.demangled = iif( smbl.uname, smbl.uname, '' ) + def __create_enum( self, enum_smbl ): - name_splitter = impl_details.get_name_splitter( enum_smbl.name ) + name_splitter = impl_details.get_name_splitter( enum_smbl.uname ) + self.logger.debug( 'working on enum %s', enum_smbl.uname ) enum_decl = declarations.enumeration_t( name_splitter.name ) - enum_decl.dia_symbols = [ enum_smbl.symIndexId ] + enum_decl.dia_symbols = [ enum_smbl ] enum_decl.byte_size = enum_smbl.length + self.__update_decl_binary_names( enum_decl, enum_smbl ) values = enum_smbl.findChildren( msdia.SymTagData, None, 0 ) for v in itertools.imap(as_symbol, values): if v.classParent.symIndexId != enum_smbl.symIndexId: @@ -309,6 +332,5 @@ class_decl.dia_symbols = [class_smbl] class_decl.class_type = impl_details.guess_class_type(class_smbl.udtKind) class_decl.byte_size = class_smbl.length - class_decl.mangled = iif( class_smbl.name, class_smbl.name, '' ) - class_decl.demangled = iif( class_smbl.uname, class_smbl.uname, '' ) + self.__update_decl_binary_names( class_decl, class_smbl ) return class_decl Modified: pygccxml_dev/unittests/autoconfig.py =================================================================== --- pygccxml_dev/unittests/autoconfig.py 2008-04-04 19:35:03 UTC (rev 1295) +++ pygccxml_dev/unittests/autoconfig.py 2008-04-05 06:42:06 UTC (rev 1296) @@ -46,6 +46,22 @@ , define_symbols=[ gccxml_version ] , compiler=compiler ) + pdb_loader = None + + @staticmethod + def get_pdb_loader(): + if not cxx_parsers_cfg.pdb_loader: + from pygccxml.msvc import pdb + pdb_file = os.path.join( data_directory, 'msvc_build', 'Debug', 'msvc_build.pdb' ) + cxx_parsers_cfg.pdb_loader = pdb.decl_loader_t( pdb_file ) + cxx_parsers_cfg.pdb_loader.read() + return cxx_parsers_cfg.pdb_loader + + +def get_pdb_global_ns(): + return cxx_parsers_cfg.get_pdb_loader().global_ns + + #~ try: #~ import pydsc #~ pydsc.include( r'D:\pygccxml_sources\sources\pygccxml_dev' ) Modified: pygccxml_dev/unittests/data/msvc_build/all.cpp =================================================================== --- pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-04-04 19:35:03 UTC (rev 1295) +++ pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-04-05 06:42:06 UTC (rev 1296) @@ -41,3 +41,7 @@ #include "unnamed_ns_bug.hpp" #include "vector_traits.hpp" +void use_decls(){ + declarations::enums::ENumbers enumbers; + declarations::enums::data::EColor ecolor; +} \ No newline at end of file Modified: pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj =================================================================== --- pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj 2008-04-04 19:35:03 UTC (rev 1295) +++ pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj 2008-04-05 06:42:06 UTC (rev 1296) @@ -20,7 +20,7 @@ Name="Debug|Win32" OutputDirectory="$(SolutionDir)$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="4" + ConfigurationType="2" CharacterSet="1" > <Tool @@ -41,6 +41,7 @@ <Tool Name="VCCLCompilerTool" Optimization="0" + InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\" PreprocessorDefinitions="WIN32;_DEBUG;_LIB" MinimalRebuild="true" @@ -63,12 +64,18 @@ Name="VCPreLinkEventTool" /> <Tool - Name="VCLibrarianTool" + Name="VCLinkerTool" + GenerateDebugInformation="true" + GenerateMapFile="true" + MapExports="true" /> <Tool Name="VCALinkTool" /> <Tool + Name="VCManifestTool" + /> + <Tool Name="VCXDCMakeTool" ValidateIntelliSense="true" /> @@ -79,6 +86,9 @@ Name="VCFxCopTool" /> <Tool + Name="VCAppVerifierTool" + /> + <Tool Name="VCPostBuildEventTool" /> </Configuration> Modified: pygccxml_dev/unittests/declarations_tester.py =================================================================== --- pygccxml_dev/unittests/declarations_tester.py 2008-04-04 19:35:03 UTC (rev 1295) +++ pygccxml_dev/unittests/declarations_tester.py 2008-04-05 06:42:06 UTC (rev 1296) @@ -3,7 +3,7 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -import pprint +import pprint import unittest import autoconfig import parser_test_case @@ -13,22 +13,11 @@ from pygccxml.parser import * from pygccxml.declarations import * + class declarations_t( parser_test_case.parser_test_case_t ): - global_ns = None def __init__(self, *args ): parser_test_case.parser_test_case_t.__init__( self, *args ) - self.test_files = [ 'declarations_enums.hpp' - , 'declarations_variables.hpp' - , 'declarations_calldef.hpp' - ] self.global_ns = None - - def setUp(self): - if not declarations_t.global_ns: - decls = parse( self.test_files, self.config, self.COMPILATION_MODE ) - declarations_t.global_ns = get_global_namespace( decls ) - if not self.global_ns: - self.global_ns = declarations_t.global_ns def test_enumeration_t(self): enum = self.global_ns.enum( 'ENumbers' ) @@ -47,13 +36,13 @@ def test_variables(self): variables = self.global_ns.namespace( 'variables' ) initialized = self.global_ns.variable( name='initialized' ) - + expected_value = None if '0.9' in initialized.compiler: expected_value = '10122004ul' else: expected_value = '10122004' - + self.failUnless( initialized.value == expected_value , "there is a difference between expected value( %s ) and real value(%s) of 'initialized' variable" \ % ( expected_value, initialized.value ) ) @@ -147,7 +136,7 @@ #there is nothing to check about constructors - I know the implementation of parser #In this case it doesn't different from any other function - def test_operator_symbol(self): + def test_operator_symbol(self): calldefs_operators = ['=', '==' ] calldefs_cast_operators = ['char *', 'double'] struct_calldefs = self.global_ns.class_( 'calldefs_t') @@ -168,22 +157,45 @@ self.failUnless( do_smth.has_ellipsis ) do_smth_else = ns.free_fun( 'do_smth_else' ) self.failUnless( do_smth_else.has_ellipsis ) - -class all_at_once_tester_t( declarations_t ): +class gccxml_declarations_t( declarations_t ): + global_ns = None + def __init__(self, *args ): + declarations_t.__init__( self, *args ) + self.test_files = [ 'declarations_enums.hpp' + , 'declarations_variables.hpp' + , 'declarations_calldef.hpp' + ] + self.global_ns = None + + def setUp(self): + if not gccxml_declarations_t.global_ns: + decls = parse( self.test_files, self.config, self.COMPILATION_MODE ) + gccxml_declarations_t.global_ns = get_global_namespace( decls ) + if not self.global_ns: + self.global_ns = gccxml_declarations_t.global_ns + +class all_at_once_tester_t( gccxml_declarations_t ): COMPILATION_MODE = COMPILATION_MODE.ALL_AT_ONCE def __init__(self, *args): - declarations_t.__init__(self, *args) + gccxml_declarations_t.__init__(self, *args) -class file_by_file_tester_t( declarations_t ): +class file_by_file_tester_t( gccxml_declarations_t ): COMPILATION_MODE = COMPILATION_MODE.FILE_BY_FILE def __init__(self, *args): - declarations_t.__init__(self, *args) + gccxml_declarations_t.__init__(self, *args) +class pdb_based_tester_t( declarations_t ): + def __init__(self, *args ): + declarations_t.__init__( self, *args ) + self.global_ns = autoconfig.get_pdb_global_ns() + def create_suite(): - suite = unittest.TestSuite() - suite.addTest( unittest.makeSuite(file_by_file_tester_t)) - suite.addTest( unittest.makeSuite(all_at_once_tester_t)) + suite = unittest.TestSuite() + #~ suite.addTest( unittest.makeSuite(file_by_file_tester_t)) + #~ suite.addTest( unittest.makeSuite(all_at_once_tester_t)) + suite.addTest( unittest.makeSuite(pdb_based_tester_t)) + return suite def run_suite(): Modified: pygccxml_dev/unittests/pdb_tester.py =================================================================== --- pygccxml_dev/unittests/pdb_tester.py 2008-04-04 19:35:03 UTC (rev 1295) +++ pygccxml_dev/unittests/pdb_tester.py 2008-04-05 06:42:06 UTC (rev 1296) @@ -4,6 +4,7 @@ from pygccxml.msvc import pdb from pygccxml import declarations +from pygccxml.msvc import common_utils as msvc_utils class tester_t( unittest.TestCase ): def __init__(self, *args): @@ -38,13 +39,14 @@ print reader.symbols_table.name reader.read() #f = file( 'decls.cpp', 'w+' ) - #declarations.print_declarations( reader.global_ns )#, writer=f.write ) - names = [] - for d in reader.global_ns.classes(): - names.append( '{%s}<=====>{%s}' %( d.demangled, d.mangled ) ) - names.sort() - for name in names: - print name + declarations.print_declarations( reader.global_ns )#, writer=f.write ) + + #~ names = [] + #~ for d in reader.global_ns.classes(): + #~ names.append( '{%s}<=====>{%s}' %( d.demangled, d.mangled ) ) + #~ names.sort() + #~ f6or name in names: + #~ print name #f.close() def test_undecorate_name(self): @@ -62,7 +64,7 @@ for decorated, undecorated in data: #~ print '\n', pdb.impl_details.undecorate_name( decorated ) #~ print undecorated - self.failUnless( pdb.impl_details.undecorate_name( decorated ) == undecorated ) + self.failUnless( msvc_utils.undecorate_name( decorated ) == undecorated ) def create_suite(): suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |