[pygccxml-commit] SF.net SVN: pygccxml: [1308] pygccxml_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2008-04-09 20:52:28
|
Revision: 1308 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1308&view=rev Author: roman_yakovenko Date: 2008-04-09 13:52:33 -0700 (Wed, 09 Apr 2008) Log Message: ----------- adding treatment for variables Modified Paths: -------------- pygccxml_dev/pygccxml/msvc/pdb/__init__.py pygccxml_dev/pygccxml/msvc/pdb/enums.py pygccxml_dev/pygccxml/msvc/pdb/impl_details.py pygccxml_dev/pygccxml/msvc/pdb/loader.py pygccxml_dev/unittests/bsc_tester.py pygccxml_dev/unittests/data/msvc_build/all.cpp pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj pygccxml_dev/unittests/pdb_tester.py Modified: pygccxml_dev/pygccxml/msvc/pdb/__init__.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/__init__.py 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/pygccxml/msvc/pdb/__init__.py 2008-04-09 20:52:33 UTC (rev 1308) @@ -12,12 +12,14 @@ from ... import declarations from .. import config as msvc_cfg -comtypes_client_gen_dir = comtypes.client.gen_dir -try: - comtypes.client.gen_dir = None - msdia = comtypes.client.GetModule( msvc_cfg.msdia_path ) -finally: - comtypes.client.gen_dir = comtypes_client_gen_dir +msdia = comtypes.client.GetModule( msvc_cfg.msdia_path ) +#~ comtypes_client_gen_dir = comtypes.client.gen_dir +#~ try: + #~ comtypes.client.gen_dir = None + #~ msdia = comtypes.client.GetModule( msvc_cfg.msdia_path ) +#~ finally: + #~ comtypes.client.gen_dir = comtypes_client_gen_dir + from loader import decl_loader_t Modified: pygccxml_dev/pygccxml/msvc/pdb/enums.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/enums.py 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/pygccxml/msvc/pdb/enums.py 2008-04-09 20:52:33 UTC (rev 1308) @@ -1,11 +1,35 @@ +from ... import utils #import utils from pygccxml package + +class BasicType(utils.enum): + btNoType = 0 + btVoid = 1 + btChar = 2 + btWChar = 3 + btInt = 6 + btUInt = 7 + btFloat = 8 + btBCD = 9 + btBool = 1 + btLong = 1 + btULong = 1 + btCurrency = 2 + btDate = 2 + btVariant = 2 + btComplex = 2 + btBit = 2 + btBSTR = 3 + btHresult = 31 + + + #Adding code, that was not generated for some reason. -class UdtKind: +class UdtKind(utils.enum): UdtStruct, UdtClass, UdtUnion = (0, 1, 2) -class CV_access_e: +class CV_access_e(utils.enum): CV_private, CV_protected, CV_public = (1, 2, 3) -class NameSearchOptions: +class NameSearchOptions(utils.enum): nsNone = 0 nsfCaseSensitive = 0x1 nsfCaseInsensitive = 0x2 Modified: pygccxml_dev/pygccxml/msvc/pdb/impl_details.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/impl_details.py 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/pygccxml/msvc/pdb/impl_details.py 2008-04-09 20:52:33 UTC (rev 1308) @@ -9,14 +9,6 @@ else: return declarations.CLASS_TYPES.UNION -def guess_access_type( access_type ): - if enums.CV_access_e.CV_private == access_type: - return declarations.ACCESS_TYPES.PRIVATE - elif enums.CV_access_e.CV_protected == access_type: - return declarations.ACCESS_TYPES.PROTECTED - else: - return declarations.ACCESS_TYPES.PUBLIC - class full_name_splitter_t( object ): def __init__( self, full_name ): self.__full_name = full_name Modified: pygccxml_dev/pygccxml/msvc/pdb/loader.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-04-09 20:52:33 UTC (rev 1308) @@ -72,6 +72,49 @@ else: return None + def create_type( self, smbl ): + if msdia.SymTagBaseType == smbl.symTag: + if enums.BasicType.btNoType == smbl.baseType: + return declarations.unknown_t() + elif enums.BasicType.btVoid == smbl.baseType: + return declarations.void_t() + elif enums.BasicType.btChar == smbl.baseType: + return declarations.char_t() + elif enums.BasicType.btWChar == smbl.baseType: + return declarations.wchar_t() + elif enums.BasicType.btInt == smbl.baseType: + return declarations.int_t() + elif enums.BasicType.btUInt == smbl.baseType: + return declarations.unsigned_int_t() + elif enums.BasicType.btFloat == smbl.baseType: + return declarations.float_t() + elif enums.BasicType.btBCD == smbl.baseType: + return declarations.unknown_t() + elif enums.BasicType.btBool == smbl.baseType: + return declarations.bool_t() + elif enums.BasicType.btLong == smbl.baseType: + return declarations.long_int_t() + elif enums.BasicType.btULong == smbl.baseType: + return declarations.long_unsigned_int_t() + elif enums.BasicType.btCurrency == smbl.baseType: + return declarations.unknown_t() + elif enums.BasicType.btDate == smbl.baseType: + return declarations.unknown_t() + elif enums.BasicType.btVariant == smbl.baseType: + return declarations.unknown_t() + elif enums.BasicType.btComplex == smbl.baseType: + return declarations.complex_double_t() + elif enums.BasicType.btBit == smbl.baseType: + return declarations.unknown_t() + elif enums.BasicType.btBSTR == smbl.baseType: + return declarations.unknown_t() + elif enums.BasicType.btHresult == smbl.baseType: + return declarations.unknown_t() + else: + return declarations.unknown_t() + else: + return declarations.unknown_t() + @utils.cached def symbols_table(self): return self.__find_table( "Symbols" ) @@ -81,6 +124,9 @@ smbls = {} for smbl in itertools.imap( as_symbol, as_enum_variant( self.symbols_table._NewEnum ) ): smbl.uname = msvc_utils.undecorate_name( smbl.name, msvc_utils.UNDECORATE_NAME_OPTIONS.UNDNAME_SCOPES_ONLY ) + def smbl_undecorate_name( options = None ): + return msvc_utils.undecorate_name( smbl.name, options ) + smbl.undecorate_name = smbl_undecorate_name smbls[ smbl.symIndexId ] = smbl return smbls @@ -89,24 +135,26 @@ self.logger.debug( '__load_ns.ns_filter, %s', smbl.uname ) tags = ( msdia.SymTagFunction , msdia.SymTagBlock - #I should skipp data, because it requier different treatment - #, msdia.SymTagData - , msdia.SymTagAnnotation - , msdia.SymTagPublicSymbol + , msdia.SymTagData + #~ , msdia.SymTagAnnotation + #~ , msdia.SymTagPublicSymbol , msdia.SymTagUDT , msdia.SymTagEnum - , msdia.SymTagFunctionType - , msdia.SymTagPointerType + #~ , msdia.SymTagFunctionType + #~ , msdia.SymTagPointerType , msdia.SymTagArrayType , msdia.SymTagBaseType , msdia.SymTagTypedef , msdia.SymTagBaseClass , msdia.SymTagFriend - , msdia.SymTagFunctionArgType - , msdia.SymTagUsingNamespace ) + #~ , msdia.SymTagFunctionArgType + #~ , msdia.SymTagUsingNamespace + ) if smbl.symTag not in tags: self.logger.debug( 'smbl.symTag not in tags, %s', smbl.uname ) return False + elif smbl.symTag == msdia.SymTagData and not self.__is_my_var( smbl ): + return False elif not smbl.name: self.logger.debug( 'not smbl.name, %s', smbl.uname ) return False @@ -190,7 +238,7 @@ if isinstance( parent, declarations.namespace_t ): parent.adopt_declaration( decl ) else: - parent.adopt_declaration( decl, declarations.ACCESS_TYPES.PUBLIC ) + parent.adopt_declaration( decl, self.__guess_access_type( smbl ) ) else: for other_decl in already_added: for other_smbl in other_decl.dia_symbols: @@ -201,8 +249,22 @@ if isinstance( parent, declarations.namespace_t ): parent.adopt_declaration( decl ) else: - parent.adopt_declaration( decl, declarations.ACCESS_TYPES.PUBLIC ) + parent.adopt_declaration( decl, self.__guess_access_type( smbl ) ) + def __guess_access_type( self, smbl ): + if enums.CV_access_e.CV_private == smbl.access: + return declarations.ACCESS_TYPES.PRIVATE + elif enums.CV_access_e.CV_protected == smbl.access: + return declarations.ACCESS_TYPES.PROTECTED + else: + fully_undecorated_name = smbl.undecorate_name() + if fully_undecorated_name.startswith( 'private:' ): + declarations.ACCESS_TYPES.PRIVATE + elif fully_undecorated_name.startswith( 'protected:' ): + declarations.ACCESS_TYPES.PROTECTED + else: + return declarations.ACCESS_TYPES.PUBLIC + def __load_classes( self ): classes = {}#unique symbol id : class decl is_udt = lambda smbl: smbl.symTag == msdia.SymTagUDT @@ -233,10 +295,9 @@ 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: + if not ( to_be_integrated - len( classes ) ): for cls in classes.itervalues(): - self.logger.debug( 'unable to integrate class "%s"', cls.dia_symbols[0].uname ) + self.logger.warning( 'unable to integrate class "%s" into declarations tree', cls.dia_symbols[0].uname ) break self.logger.info( 'integrating udt objects with namespaces - done' ) @@ -244,6 +305,7 @@ self.__load_nss() self.__load_classes() self.__load_enums() + self.__load_vars() @property def dia_global_scope(self): @@ -283,6 +345,13 @@ self.logger.debug( 'name( "%s" ) is **NOT** UDT symbol' % name ) return None + def __update_decl( self, decl, smbl ): + decl.dia_symbols = [smbl] + decl.compiler = self.COMPILER + decl.byte_size = smbl.length + decl.mangled = iif( smbl.name, smbl.name, '' ) + decl.demangled = iif( smbl.uname, smbl.uname, '' ) + def __load_enums( self ): is_enum = lambda smbl: smbl.symTag == msdia.SymTagEnum self.logger.info( 'building enum objects' ) @@ -295,17 +364,12 @@ 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.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 ] - enum_decl.byte_size = enum_smbl.length - self.__update_decl_binary_names( enum_decl, enum_smbl ) + self.__update_decl( 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: @@ -319,18 +383,44 @@ #between those cases return None - 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 __create_class( self, class_smbl ): name_splitter = impl_details.get_name_splitter( class_smbl.uname ) class_decl = declarations.class_t( name_splitter.name ) - class_decl.compiler = self.COMPILER - class_decl.dia_symbols = [class_smbl] + self.__update_decl( class_decl, class_smbl ) class_decl.class_type = impl_details.guess_class_type(class_smbl.udtKind) - class_decl.byte_size = class_smbl.length - self.__update_decl_binary_names( class_decl, class_smbl ) return class_decl + + def __is_my_var( self, smbl ): + #I am only interested in global and class variables + if smbl.symTag != msdia.SymTagData: + return False + if smbl.classParentId not in self.symbols: + return True #global scope + parent_smbl = self.symbols[ smbl.classParentId ] + return bool( parent_smbl.symTag == msdia.SymTagUDT ) + + def __load_vars( self ): + self.logger.info( 'building variable objects' ) + vars_count = 0 + for var_smbl in itertools.ifilter( self.__is_my_var, self.symbols.itervalues() ): + var_decl = self.__create_var(var_smbl) + if not var_decl: + continue + vars_count += 1 + self.__update_decls_tree( var_decl ) + self.logger.info( 'building variable objects(%d) - done', vars_count ) + + def __create_var( self, var_smbl ): + self.logger.debug( 'creating variable "%s"', var_smbl.uname ) + name_splitter = impl_details.get_name_splitter( var_smbl.uname ) + if not name_splitter.name: + return None + var_decl = declarations.variable_t( name_splitter.name ) + self.__update_decl( var_decl, var_smbl ) + + var_decl.type = self.create_type( var_smbl.type ) + self.logger.debug( 'creating variable "%s" - done', var_smbl.uname ) + return var_decl + + + Modified: pygccxml_dev/unittests/bsc_tester.py =================================================================== --- pygccxml_dev/unittests/bsc_tester.py 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/unittests/bsc_tester.py 2008-04-09 20:52:33 UTC (rev 1308) @@ -18,13 +18,13 @@ print 'is_case_sensitive', reader.is_case_sensitive reader.load_instances() #reader.files - #reader.print_classes( )#r'c:\dev\produce_pdb\produce_pdb.cpp') - names = [] - for inst in reader.instances: - names.append( '{%s}<=====>{%s}' % ( inst.name, inst.mangled_name ) ) - names.sort() - for name in names: - print name + reader.print_classes( )#r'c:\dev\produce_pdb\produce_pdb.cpp') + #~ names = [] + #~ for inst in reader.instances: + #~ names.append( '{%s}<=====>{%s}' % ( inst.name, inst.mangled_name ) ) + #~ names.sort() + #~ for name in names: + #~ print name def create_suite(): suite = unittest.TestSuite() Modified: pygccxml_dev/unittests/data/msvc_build/all.cpp =================================================================== --- pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-04-09 20:52:33 UTC (rev 1308) @@ -41,7 +41,7 @@ #include "unnamed_ns_bug.hpp" #include "vector_traits.hpp" -void use_decls(){ - declarations::enums::ENumbers enumbers; - declarations::enums::data::EColor ecolor; +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-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj 2008-04-09 20:52:33 UTC (rev 1308) @@ -41,7 +41,7 @@ <Tool Name="VCCLCompilerTool" Optimization="0" - InlineFunctionExpansion="1" + InlineFunctionExpansion="0" AdditionalIncludeDirectories="..\" PreprocessorDefinitions="WIN32;_DEBUG;_LIB" MinimalRebuild="true" @@ -52,7 +52,7 @@ GenerateXMLDocumentationFiles="true" BrowseInformation="1" WarningLevel="3" - DebugInformationFormat="3" + DebugInformationFormat="4" /> <Tool Name="VCManagedResourceCompilerTool" Modified: pygccxml_dev/unittests/pdb_tester.py =================================================================== --- pygccxml_dev/unittests/pdb_tester.py 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/unittests/pdb_tester.py 2008-04-09 20:52:33 UTC (rev 1308) @@ -38,8 +38,12 @@ reader = pdb.decl_loader_t( self.pdb_file ) print reader.symbols_table.name reader.read() - #f = file( 'decls.cpp', 'w+' ) - declarations.print_declarations( reader.global_ns )#, writer=f.write ) + x = [] + declarations.print_declarations( reader.global_ns, writer=x.append ) + x = filter( None, map( lambda l: l.rstrip(), x ) ) + f = file( 'decls.cpp', 'w+' ) + f.write( os.linesep.join( x ) ) + f.close() #~ names = [] #~ for d in reader.global_ns.classes(): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |