[pygccxml-commit] SF.net SVN: pygccxml: [1309] pygccxml_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2008-04-12 07:52:28
|
Revision: 1309 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1309&view=rev Author: roman_yakovenko Date: 2008-04-12 00:52:34 -0700 (Sat, 12 Apr 2008) Log Message: ----------- adding support for basic types Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/container_traits.py pygccxml_dev/pygccxml/msvc/pdb/enums.py pygccxml_dev/pygccxml/msvc/pdb/loader.py pygccxml_dev/unittests/data/declarations_variables.hpp pygccxml_dev/unittests/data/msvc_build/all.cpp pygccxml_dev/unittests/declarations_tester.py Modified: pygccxml_dev/pygccxml/declarations/container_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/container_traits.py 2008-04-09 20:52:33 UTC (rev 1308) +++ pygccxml_dev/pygccxml/declarations/container_traits.py 2008-04-12 07:52:34 UTC (rev 1309) @@ -18,19 +18,19 @@ std_namespaces = ( 'std', 'stdext', '__gnu_cxx' ) -class defaults_eraser: +class defaults_eraser: @staticmethod def normalize( type_str ): return type_str.replace( ' ', '' ) @staticmethod def replace_basic_string( cls_name ): - strings = { + strings = { 'std::string' : ( 'std::basic_string<char,std::char_traits<char>,std::allocator<char> >' , 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >' ) , 'std::wstring' : ( 'std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >' , 'std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >' ) } - + new_name = cls_name for short_name, long_names in strings.iteritems(): for lname in long_names: @@ -59,13 +59,13 @@ return answer @staticmethod - def erase_call( cls_name ): - global find_container_traits + def erase_call( cls_name ): + global find_container_traits c_traits = find_container_traits( cls_name ) - if not c_traits: + if not c_traits: return cls_name return c_traits.remove_defaults( cls_name ) - + @staticmethod def erase_recursive( cls_name ): ri = defaults_eraser.recursive_impl @@ -85,7 +85,7 @@ cls_name = defaults_eraser.replace_basic_string( cls_name ) c_name, c_args = templates.split( cls_name ) if 2 != len( c_args ): - return + return value_type = c_args[0] tmpl = string.Template( "$container< $value_type, $allocator<$value_type> >" ) tmpl = tmpl.substitute( container=c_name, value_type=value_type, allocator=default_allocator ) @@ -97,37 +97,37 @@ cls_name = defaults_eraser.replace_basic_string( cls_name ) c_name, c_args = templates.split( cls_name ) if 2 != len( c_args ): - return + return value_type = c_args[0] - dc_no_defaults = defaults_eraser.erase_recursive( c_args[1] ) + dc_no_defaults = defaults_eraser.erase_recursive( c_args[1] ) if defaults_eraser.normalize( dc_no_defaults ) \ != defaults_eraser.normalize( templates.join( default_container_name, [value_type] ) ): - return - return templates.join( c_name, [defaults_eraser.erase_recursive( value_type )] ) + return + return templates.join( c_name, [defaults_eraser.erase_recursive( value_type )] ) @staticmethod def erase_container_compare( cls_name, default_container_name='std::vector', default_compare='std::less' ): cls_name = defaults_eraser.replace_basic_string( cls_name ) c_name, c_args = templates.split( cls_name ) if 3 != len( c_args ): - return - dc_no_defaults = defaults_eraser.erase_recursive( c_args[1] ) + return + dc_no_defaults = defaults_eraser.erase_recursive( c_args[1] ) if defaults_eraser.normalize( dc_no_defaults ) \ != defaults_eraser.normalize( templates.join( default_container_name, [c_args[0]] ) ): - return - dcomp_no_defaults = defaults_eraser.erase_recursive( c_args[2] ) + return + dcomp_no_defaults = defaults_eraser.erase_recursive( c_args[2] ) if defaults_eraser.normalize( dcomp_no_defaults ) \ != defaults_eraser.normalize( templates.join( default_compare, [c_args[0]] ) ): - return + return value_type = defaults_eraser.erase_recursive( c_args[0] ) - return templates.join( c_name, [value_type] ) + return templates.join( c_name, [value_type] ) @staticmethod def erase_compare_allocator( cls_name, default_compare='std::less', default_allocator='std::allocator' ): cls_name = defaults_eraser.replace_basic_string( cls_name ) c_name, c_args = templates.split( cls_name ) if 3 != len( c_args ): - return + return value_type = c_args[0] tmpl = string.Template( "$container< $value_type, $compare<$value_type>, $allocator<$value_type> >" ) tmpl = tmpl.substitute( container=c_name @@ -142,10 +142,10 @@ cls_name = defaults_eraser.replace_basic_string( cls_name ) c_name, c_args = templates.split( cls_name ) if 4 != len( c_args ): - return - key_type = c_args[0] + return + key_type = c_args[0] mapped_type = c_args[1] - tmpls = [ + tmpls = [ string.Template( "$container< $key_type, $mapped_type, $compare<$key_type>, $allocator< std::pair< const $key_type, $mapped_type> > >" ) , string.Template( "$container< $key_type, $mapped_type, $compare<$key_type>, $allocator< std::pair< $key_type const, $mapped_type> > >" ) , string.Template( "$container< $key_type, $mapped_type, $compare<$key_type>, $allocator< std::pair< $key_type, $mapped_type> > >" )] @@ -166,7 +166,7 @@ cls_name = defaults_eraser.replace_basic_string( cls_name ) c_name, c_args = templates.split( cls_name ) if len( c_args ) < 3: - return + return default_hash=None default_less='std::less' @@ -181,8 +181,8 @@ default_hash='hash' tmpl = "$container< $value_type, $hash<$value_type >, $equal_to<$value_type >, $allocator<$value_type> >" else: - return - + return + value_type = c_args[0] tmpl = string.Template( tmpl ) for ns in std_namespaces: @@ -205,16 +205,16 @@ default_less='std::less' default_allocator='std::allocator' default_equal_to = 'std::equal_to' - - tmpl = None + + tmpl = None key_type = None mapped_type = None if 2 < len( c_args ): - key_type = c_args[0] + key_type = c_args[0] mapped_type = c_args[1] else: return - + if 4 == len( c_args ): default_hash = 'hash_compare' tmpl = string.Template( "$container< $key_type, $mapped_type, $hash<$key_type, $less<$key_type> >, $allocator< std::pair< const $key_type, $mapped_type> > >" ) @@ -312,23 +312,25 @@ % ( self.name, cls.decl_string ) ) return ref - + def create_traits_class( container_name , element_type_index , element_type_typedef , remove_defaults_=None ): """ creates concrete container traits class """ + impl_tmp = container_traits_impl_t( container_name, element_type_index, element_type_typedef ) + class xxx_traits: """extract information from the container""" - impl = container_traits_impl_t( container_name, element_type_index, element_type_typedef ) - + impl = None + @staticmethod def name(): return xxx_traits.impl.name - + @staticmethod def is_my_case( type ): """returns True if type is the container class, otherwise False""" @@ -345,19 +347,22 @@ return xxx_traits.impl.element_type( type ) @staticmethod - def remove_defaults( type_or_string ): - name = None + def remove_defaults( type_or_string ): + name = None if not isinstance( type_or_string, types.StringTypes ): name = xxx_traits.class_declaration( type_or_string ).name else: name = type_or_string if not remove_defaults_: - return name + return name no_defaults = remove_defaults_( name ) if not no_defaults: return name else: return no_defaults + + xxx_traits.impl = impl_tmp + return xxx_traits list_traits = create_traits_class( 'list', 0, 'value_type', defaults_eraser.erase_allocator ) @@ -394,25 +399,25 @@ , map_traits , multimap_traits , hash_map_traits - , hash_multimap_traits + , hash_multimap_traits , set_traits - , hash_set_traits + , hash_set_traits , multiset_traits , hash_multiset_traits ) -"""tuple of all STD container traits classes""" - +"""tuple of all STD container traits classes""" + def find_container_traits( cls_or_string ): if isinstance( cls_or_string, types.StringTypes ): if not templates.is_instantiation( cls_or_string ): - return None + return None name = templates.name( cls_or_string ) if name.startswith( 'std::' ): name = name[ len( 'std::' ): ] - for cls_traits in container_traits: + for cls_traits in container_traits: if cls_traits.name() == name: - return cls_traits + return cls_traits else: - for cls_traits in container_traits: + for cls_traits in container_traits: if cls_traits.is_my_case( cls_or_string ): return cls_traits Modified: pygccxml_dev/pygccxml/msvc/pdb/enums.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/enums.py 2008-04-09 20:52:33 UTC (rev 1308) +++ pygccxml_dev/pygccxml/msvc/pdb/enums.py 2008-04-12 07:52:34 UTC (rev 1309) @@ -9,19 +9,20 @@ btUInt = 7 btFloat = 8 btBCD = 9 - btBool = 1 - btLong = 1 - btULong = 1 - btCurrency = 2 - btDate = 2 - btVariant = 2 - btComplex = 2 - btBit = 2 - btBSTR = 3 + btBool = 10 + btLong = 13 + btULong = 14 + btCurrency = 25 + btDate = 26 + btVariant = 27 + btComplex = 28 + btBit = 29 + btBSTR = 30 btHresult = 31 + #Adding code, that was not generated for some reason. class UdtKind(utils.enum): UdtStruct, UdtClass, UdtUnion = (0, 1, 2) Modified: pygccxml_dev/pygccxml/msvc/pdb/loader.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-04-09 20:52:33 UTC (rev 1308) +++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-04-12 07:52:34 UTC (rev 1309) @@ -1,4 +1,5 @@ import os +import pdb import sys import ctypes import pprint @@ -57,11 +58,8 @@ self.__dia_session = self.__dia_source.openSession() self.logger.debug( 'opening session - done' ) self.__global_ns = declarations.namespace_t( '::' ) + self.__global_ns.compiler = self.COMPILER - self.__enums = {} - self.__classes = {} - self.__typedefs = {} - def __find_table(self, name): valid_names = ( 'Symbols', 'SourceFiles', 'Sections' , 'SegmentMap', 'InjectedSource', 'FrameData' ) @@ -72,55 +70,13 @@ 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" ) @utils.cached def symbols(self): + self.logger.info( 'loading symbols from the file' ) 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 ) @@ -128,6 +84,7 @@ return msvc_utils.undecorate_name( smbl.name, options ) smbl.undecorate_name = smbl_undecorate_name smbls[ smbl.symIndexId ] = smbl + self.logger.info( 'loading symbols(%d) from the file - done', len( smbls ) ) return smbls def __load_nss(self): @@ -301,7 +258,19 @@ break self.logger.info( 'integrating udt objects with namespaces - done' ) + def __clear_symbols(self): + self.logger.info( 'clearing symbols' ) + to_be_deleted = [] + for smbl_id, smbl in self.symbols.iteritems(): + if ( smbl.symTag == msdia.SymTagData and not self.__is_my_var( smbl ) ) \ + or smbl.symTag in ( msdia.SymTagAnnotation, msdia.SymTagPublicSymbol ): + to_be_deleted.append( smbl_id ) + + map( lambda smbl_id: self.symbols.pop( smbl_id ), to_be_deleted ) + self.logger.info( 'clearing symbols(%d) - done', len( to_be_deleted ) ) + def read(self): + self.__clear_symbols() self.__load_nss() self.__load_classes() self.__load_enums() @@ -351,6 +320,7 @@ decl.byte_size = smbl.length decl.mangled = iif( smbl.name, smbl.name, '' ) decl.demangled = iif( smbl.uname, smbl.uname, '' ) + decl.is_artificial = bool( smbl.compilerGenerated ) def __load_enums( self ): is_enum = lambda smbl: smbl.symTag == msdia.SymTagEnum @@ -394,6 +364,8 @@ #I am only interested in global and class variables if smbl.symTag != msdia.SymTagData: return False + if not smbl.uname: + return False if smbl.classParentId not in self.symbols: return True #global scope parent_smbl = self.symbols[ smbl.classParentId ] @@ -410,17 +382,71 @@ 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 ) + def __create_var( self, smbl ): + self.logger.debug( 'creating variable "%s"', smbl.uname ) + name_splitter = impl_details.get_name_splitter( smbl.uname ) + decl = declarations.variable_t( name_splitter.name ) + self.__update_decl( decl, smbl ) + #~ if decl.name == 'initialized': + #~ pdb.set_trace() + decl.type = self.create_type( smbl.type ) + decl.value = str(smbl.value) + self.logger.debug( 'creating variable "%s" - done', smbl.uname ) + return decl - var_decl.type = self.create_type( var_smbl.type ) - self.logger.debug( 'creating variable "%s" - done', var_smbl.uname ) - return var_decl - - - + def create_type( self, smbl ): + my_type = None + if msdia.SymTagBaseType == smbl.symTag: + if enums.BasicType.btNoType == smbl.baseType: + my_type = declarations.unknown_t() + elif enums.BasicType.btVoid == smbl.baseType: + my_type = declarations.void_t() + elif enums.BasicType.btChar == smbl.baseType: + my_type = declarations.char_t() + elif enums.BasicType.btWChar == smbl.baseType: + my_type = declarations.wchar_t() + elif enums.BasicType.btInt == smbl.baseType: + my_type = declarations.int_t() + elif enums.BasicType.btUInt == smbl.baseType: + my_type = declarations.unsigned_int_t() + elif enums.BasicType.btFloat == smbl.baseType: + my_type = declarations.float_t() + elif enums.BasicType.btBCD == smbl.baseType: + my_type = declarations.unknown_t() + elif enums.BasicType.btBool == smbl.baseType: + my_type = declarations.bool_t() + elif enums.BasicType.btLong == smbl.baseType: + my_type = declarations.long_int_t() + elif enums.BasicType.btULong == smbl.baseType: + my_type = declarations.long_unsigned_int_t() + elif enums.BasicType.btCurrency == smbl.baseType: + my_type = declarations.unknown_t() + elif enums.BasicType.btDate == smbl.baseType: + my_type = declarations.unknown_t() + elif enums.BasicType.btVariant == smbl.baseType: + my_type = declarations.unknown_t() + elif enums.BasicType.btComplex == smbl.baseType: + my_type = declarations.complex_double_t() + elif enums.BasicType.btBit == smbl.baseType: + my_type = declarations.unknown_t() + elif enums.BasicType.btBSTR == smbl.baseType: + my_type = declarations.unknown_t() + elif enums.BasicType.btHresult == smbl.baseType: + my_type = declarations.unknown_t() + else: + my_type = declarations.unknown_t() + elif msdia.SymTagArrayType == smbl.symTag: + bytes = smbl.length + element_type = self.create_type( smbl.arrayIndexType ) + size = declarations.array_t.SIZE_UNKNOWN + if bytes and element_type.byte_size: + size = bytes / element_type.byte_size + my_type = declarations.array_t( element_type, size ) + else: + my_type = declarations.unknown_t() + my_type.byte_size = smbl.length + if smbl.constType: + my_type = declarations.const_t( my_type ) + if smbl.volatileType: + my_type = declarations.volatile_t( my_type ) + return my_type Modified: pygccxml_dev/unittests/data/declarations_variables.hpp =================================================================== --- pygccxml_dev/unittests/data/declarations_variables.hpp 2008-04-09 20:52:33 UTC (rev 1308) +++ pygccxml_dev/unittests/data/declarations_variables.hpp 2008-04-12 07:52:34 UTC (rev 1309) @@ -10,6 +10,8 @@ const long unsigned int initialized = 10122004; int array[255]; + +//TODO: explain why such variables is not peeked extern int static_var; struct struct_variables_t{ Modified: pygccxml_dev/unittests/data/msvc_build/all.cpp =================================================================== --- pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-04-09 20:52:33 UTC (rev 1308) +++ pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-04-12 07:52:34 UTC (rev 1309) @@ -41,6 +41,11 @@ #include "unnamed_ns_bug.hpp" #include "vector_traits.hpp" +namespace declarations{ namespace variables{ + +int static_var = 0; +}} + void use_decls(){ declarations::enums::ENumbers enumbers; declarations::enums::data::EColor ecolor; Modified: pygccxml_dev/unittests/declarations_tester.py =================================================================== --- pygccxml_dev/unittests/declarations_tester.py 2008-04-09 20:52:33 UTC (rev 1308) +++ pygccxml_dev/unittests/declarations_tester.py 2008-04-12 07:52:34 UTC (rev 1309) @@ -49,6 +49,8 @@ % ( expected_value, initialized.value ) ) self._test_type_composition( initialized.type, const_t, long_unsigned_int_t ) + if 'PDB' in self.global_ns.compiler: + return #TODO find out work around static_var = initialized = self.global_ns.variable( name='static_var' ) self.failUnless( static_var.type_qualifiers.has_static , "static_var must have static type qualifier" ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |