[pygccxml-commit] SF.net SVN: pygccxml: [1321] pygccxml_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2008-05-25 20:35:55
|
Revision: 1321 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1321&view=rev Author: roman_yakovenko Date: 2008-05-25 13:36:02 -0700 (Sun, 25 May 2008) Log Message: ----------- another set of changes to PDB reader Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/class_declaration.py pygccxml_dev/pygccxml/declarations/decl_printer.py pygccxml_dev/pygccxml/msvc/pdb/loader.py pygccxml_dev/unittests/data/core_types.hpp pygccxml_dev/unittests/data/msvc_build/all.cpp Modified: pygccxml_dev/pygccxml/declarations/class_declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/class_declaration.py 2008-05-12 18:53:09 UTC (rev 1320) +++ pygccxml_dev/pygccxml/declarations/class_declaration.py 2008-05-25 20:36:02 UTC (rev 1321) @@ -275,7 +275,18 @@ return self._recursive_derived def _get_is_abstract(self): - return self._is_abstract + if self.compiler == compilers.MSVC_PDB_9: + import calldef + import matchers #prevent cyclic dependencies + m = matchers.virtuality_type_matcher_t( calldef.VIRTUALITY_TYPES.PURE_VIRTUAL ) + if self.calldefs( m, recursive=False, allow_empty=True ): + return True + for base in self.recursive_bases: + if base.related_class.calldefs( m, recursive=False, allow_empty=True ): + return True + return False + else: + return self._is_abstract def _set_is_abstract( self, is_abstract ): self._is_abstract = is_abstract is_abstract = property( _get_is_abstract, _set_is_abstract Modified: pygccxml_dev/pygccxml/declarations/decl_printer.py =================================================================== --- pygccxml_dev/pygccxml/declarations/decl_printer.py 2008-05-12 18:53:09 UTC (rev 1320) +++ pygccxml_dev/pygccxml/declarations/decl_printer.py 2008-05-25 20:36:02 UTC (rev 1321) @@ -9,8 +9,9 @@ import os import sys +import calldef +import algorithm import decl_visitor -import algorithm class decl_printer_t( decl_visitor.decl_visitor_t ): @@ -33,7 +34,7 @@ self.__recursive = recursive self.__writer = writer if not self.__writer: - self.__writer = sys.stdout.write + self.__writer = lambda x: sys.stdout.write( x + os.linesep ) def clone(self, increment_level=True): level = self.__level @@ -83,20 +84,27 @@ def print_decl_header(self): header = self.__nice_decl_name( self.__inst ) + ": '%s'" % self.__inst.name - self.writer( ' ' * self.level * self.INDENT_SIZE + header.ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * self.level * self.INDENT_SIZE + header.ljust( self.JUSTIFY )) if self.__print_details: curr_level = self.level + 1 if self.__inst.location: location = 'location: [%s]:%s'%(self.__inst.location.file_name, self.__inst.location.line) - self.writer( ' ' * curr_level * self.INDENT_SIZE + location + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + location) artificial = 'artificial: ' + "'%s'" % str(self.__inst.is_artificial) - self.writer( ' ' * curr_level * self.INDENT_SIZE + artificial.ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + artificial.ljust( self.JUSTIFY )) if self.__inst.attributes: attributes = 'attributes: %s'%(self.__inst.attributes) - self.writer( ' ' * curr_level * self.INDENT_SIZE + attributes + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + attributes) + if self.__inst.demangled: + demangled = 'demangled: %s'%(self.__inst.demangled) + self.writer( ' ' * curr_level * self.INDENT_SIZE + demangled) + if self.__inst.mangled: + mangled = 'mangled: %s'%(self.__inst.mangled) + self.writer( ' ' * curr_level * self.INDENT_SIZE + mangled) - def __get_method_signature(self, decl=None): + + def print_calldef_info(self, decl=None): """ Returns function signature: [retval, [arg1, ..., argN]]. """ if None is decl: decl = self.__inst @@ -106,46 +114,45 @@ retval = decl.return_type.decl_string args = [] for arg in decl.arguments: - args.append(arg.type.decl_string) - return [retval, args] + args.append(arg.type.decl_string + ' ' + arg.name) + indent = ' ' * (self.level+1) * self.INDENT_SIZE + self.writer( indent + "return type: " + str(retval) ) + self.writer( indent + "arguments type: " + ', '.join(args)) + if isinstance( decl, calldef.member_calldef_t ): + self.writer( indent + "virtual: " + str(decl.virtuality)) + self.writer( indent + "is const: " + str(decl.has_const)) + self.writer( indent + "is static: " + str(decl.has_static)) def visit_member_function( self ): self.print_decl_header() - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Signature: " + str( self.__get_method_signature() ) + os.linesep ) + self.print_calldef_info() def visit_constructor( self ): self.print_decl_header() - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Signature: " + str( self.__get_method_signature() ) + os.linesep ) + self.print_calldef_info() if self.__print_details: self.writer( ' ' * ( self.level + 1 ) * self.INDENT_SIZE - + 'copy constructor: ' + str(self.__inst.is_copy_constructor) - + os.linesep ) + + 'copy constructor: ' + str(self.__inst.is_copy_constructor) ) def visit_destructor( self ): self.print_decl_header() def visit_member_operator( self ): self.print_decl_header() - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Signature: " + str( self.__get_method_signature() ) + os.linesep ) + self.print_calldef_info() def visit_casting_operator( self ): self.print_decl_header() - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Signature: " + str( self.__get_method_signature() ) + os.linesep ) + self.print_calldef_info() def visit_free_function( self ): self.print_decl_header() - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Signature: " + str( self.__get_method_signature() ) + os.linesep ) + self.print_calldef_info() def visit_free_operator( self ): self.print_decl_header() - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Signature: " + str( self.__get_method_signature() ) + os.linesep ) + self.print_calldef_info() def visit_class_declaration(self ): self.print_decl_header() @@ -154,35 +161,35 @@ self.print_decl_header() curr_level = self.level + 1 class_type = 'class type: ' + "'%s'" % str(self.__inst.class_type) - self.writer( ' ' * curr_level * self.INDENT_SIZE + class_type.ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + class_type.ljust( self.JUSTIFY )) if self.__print_details: byte_size = 'size: %d'%(self.__inst.byte_size) - self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_size.ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_size.ljust( self.JUSTIFY )) try: byte_align = 'align: %d'%(self.__inst.byte_align) - self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_align.ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_align.ljust( self.JUSTIFY )) except NotImplementedError: - self.writer( ' ' * curr_level * self.INDENT_SIZE + "align: not implemented".ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + "align: not implemented".ljust( self.JUSTIFY )) if self.__inst.aliases: aliases = map( lambda typedef: typedef.name, self.__inst.aliases ) msg = 'aliases: ' + `aliases` - self.writer( ' ' * curr_level * self.INDENT_SIZE + msg.ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + msg.ljust( self.JUSTIFY )) def print_hierarchy(hierarchy_type, classes, curr_level): - self.writer( ' ' * curr_level * self.INDENT_SIZE + hierarchy_type.ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + hierarchy_type.ljust( self.JUSTIFY )) curr_level += 1 for class_ in classes: class_str = 'class: ' + "'%s'" % str(class_.related_class.decl_string) - self.writer( ' ' * curr_level * self.INDENT_SIZE + class_str.ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + class_str.ljust( self.JUSTIFY )) access = 'access type: ' + "'%s'" % str(class_.access) - self.writer( ' ' * (curr_level + 1)* self.INDENT_SIZE + access.ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * (curr_level + 1)* self.INDENT_SIZE + access.ljust( self.JUSTIFY )) if not ( None is class_.is_virtual ): is_virtual = 'virtual inheritance: ' + "'%s'" % str(class_.is_virtual) - self.writer( ' ' * (curr_level + 1)* self.INDENT_SIZE + is_virtual.ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * (curr_level + 1)* self.INDENT_SIZE + is_virtual.ljust( self.JUSTIFY )) def print_members(members_type, members, curr_level): - self.writer( ' ' * curr_level * self.INDENT_SIZE + members_type.ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + members_type.ljust( self.JUSTIFY )) if self.__recursive: curr_level += 1 for member in members: @@ -207,7 +214,7 @@ value_level = ' ' * ( curr_level + 1 )* self.INDENT_SIZE self.writer( os.linesep ) for name, value in self.__inst.values: - self.writer( value_level + "%s : %s"% (name, value) + os.linesep ) + self.writer( value_level + "%s : %s"% (name, value)) def visit_namespace(self ): self.print_decl_header() @@ -220,7 +227,7 @@ def visit_typedef(self ): self.print_decl_header() curr_level = self.level + 1 - self.writer( ' ' * curr_level * self.INDENT_SIZE + 'alias to: ' + self.__inst.type.decl_string + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + 'alias to: ' + self.__inst.type.decl_string) def visit_variable(self ): self.print_decl_header() @@ -228,16 +235,16 @@ self.writer( ' ' * curr_level * self.INDENT_SIZE + 'type: %s value: %s'%(self.__inst.type.decl_string, self.__inst.value) + os.linesep) if self.__print_details: byte_size = 'size: %d'%(self.__inst.type.byte_size) - self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_size.ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_size.ljust( self.JUSTIFY )) try: byte_align = 'align: %d'%(self.__inst.type.byte_align) - self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_align.ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_align.ljust( self.JUSTIFY )) except NotImplementedError: - self.writer( ' ' * curr_level * self.INDENT_SIZE + "align: not implemented".ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + "align: not implemented".ljust( self.JUSTIFY )) byte_offset = 'offset: %d'%(self.__inst.byte_offset) self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_offset + os.linesep) -def print_declarations( decls, detailed=True, recursive=True, writer=sys.stdout.write ): +def print_declarations( decls, detailed=True, recursive=True, writer=lambda x: sys.stdout.write( x + os.linesep ) ): """ Print decl tree rooted at each of the included nodes. decls - either a single decl or a list of decls. """ Modified: pygccxml_dev/pygccxml/msvc/pdb/loader.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-05-12 18:53:09 UTC (rev 1320) +++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-05-25 20:36:02 UTC (rev 1321) @@ -178,6 +178,8 @@ self.logger.debug( 'scanning symbols table - done' ) def __update_decls_tree( self, decl ): + #~ if decl.name == 'money_base' and isinstance( decl, declarations.class_t ): + #~ pdb.set_trace() smbl = decl.dia_symbols[0] if smbl.classParentId in self.__id2decl: self.__adopt_declaration( self.__id2decl[smbl.classParentId], decl ) @@ -208,16 +210,16 @@ self.__id2decl[ smbl.symIndexId ] = decl else: 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 ) - self.__id2decl[ smbl.symIndexId ] = other_decl - return + if self.__is_same_smbls( other_decl, decl ): + other_decl.dia_symbols.append( smbl ) + self.__id2decl[ smbl.symIndexId ] = other_decl + return else: if isinstance( parent, declarations.namespace_t ): parent.adopt_declaration( decl ) else: parent.adopt_declaration( decl, self.__guess_access_type( smbl ) ) + self.__id2decl[ smbl.symIndexId ] = decl def __guess_access_type( self, smbl ): if enums.CV_access_e.CV_private == smbl.access: @@ -327,16 +329,18 @@ def global_ns(self): return self.__global_ns - def __are_symbols_equivalent( self, smbl1, smbl2 ): - result = smbl1.symTag == smbl2.symTag and smbl1.uname == smbl2.uname - if not result: - result = self.__dia_session.symsAreEquiv( smbl1, smbl2 ) - if result: - msg = 'Symbols "%s(%d)" and "%s(%d)" are equivalent.' + def __is_same_smbls( self, decl1, decl2 ): + if not( decl1.__class__ is decl2.__class__ ): + return False + if decl1.name == decl2.name: + if isinstance( decl1, declarations.calldef_t ): + #TODO: well, I will have to fix this someday + return False + else: + return True else: - msg = 'Symbols "%s(%d)" and "%s(%d)" are NOT equivalent.' - self.logger.debug( msg, smbl1.uname, smbl1.symIndexId, smbl2.uname, smbl2.symIndexId ) - return result + return False + #~ return self.__dia_session.symsAreEquiv( decl1.dia_symbols[0], decl2.dia_symbols[0] ) def __find_udt( self, name ): self.logger.debug( 'testing whether name( "%s" ) is UDT symbol' % name ) @@ -530,6 +534,8 @@ def __create_calldef( self, smbl ): self.logger.debug( 'creating calldef "%s"', smbl.uname ) + #~ if smbl.uname == 'some_function': + #~ pdb.set_trace() name_splitter = impl_details.get_name_splitter( smbl.uname ) calldef_type = self.create_type( smbl.type ) #what does happen with constructor? decl = None @@ -542,6 +548,10 @@ decl = self.__guess_constructor( smbl, calldef_type ) if not decl: decl = declarations.member_function_t() + if smbl.virtual: + decl.virtuality = iif( smbl.pure + , declarations.VIRTUALITY_TYPES.PURE_VIRTUAL + , declarations.VIRTUALITY_TYPES.VIRTUAL ) else: decl = self.__guess_operator_type(smbl, calldef_type) if not decl: Modified: pygccxml_dev/unittests/data/core_types.hpp =================================================================== --- pygccxml_dev/unittests/data/core_types.hpp 2008-05-12 18:53:09 UTC (rev 1320) +++ pygccxml_dev/unittests/data/core_types.hpp 2008-05-25 20:36:02 UTC (rev 1321) @@ -51,7 +51,12 @@ struct exception{}; struct members_pointers_t{ - int some_function( double ) const throw( exception ); + int some_function( double hi, int i ){ + return 0; + } + int some_function( double hi) const throw( exception ){ + return 0; + }; int m_some_const_member; int xxx; }; Modified: pygccxml_dev/unittests/data/msvc_build/all.cpp =================================================================== --- pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-05-12 18:53:09 UTC (rev 1320) +++ pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-05-25 20:36:02 UTC (rev 1321) @@ -93,6 +93,10 @@ core::types::function_ptr function_ptr_ = 0; core::types::member_function_ptr_t member_function_ptr_ = 0; + core::types::members_pointers_t members_pointers_inst; + members_pointers_inst.some_function( 0.23 ); + members_pointers_inst.some_function( 0.23, 11 ); + } void use_core_ns_join_3(){ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |