[pygccxml-commit] SF.net SVN: pygccxml: [1319] pygccxml_dev/pygccxml
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2008-05-11 20:22:54
|
Revision: 1319 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1319&view=rev Author: roman_yakovenko Date: 2008-05-11 13:23:01 -0700 (Sun, 11 May 2008) Log Message: ----------- adding basic support for functions Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/decl_printer.py pygccxml_dev/pygccxml/msvc/pdb/enums.py pygccxml_dev/pygccxml/msvc/pdb/loader.py Modified: pygccxml_dev/pygccxml/declarations/decl_printer.py =================================================================== --- pygccxml_dev/pygccxml/declarations/decl_printer.py 2008-05-08 20:05:35 UTC (rev 1318) +++ pygccxml_dev/pygccxml/declarations/decl_printer.py 2008-05-11 20:23:01 UTC (rev 1319) @@ -97,15 +97,18 @@ def __get_method_signature(self, decl=None): - """ Returns function signature: [retval, [arg1, ..., argN]]. """ - if None is decl: - decl = self.__inst - retval = decl.return_type.decl_string - args = [] - for arg in decl.arguments: - args.append(arg.type.decl_string) - return [retval, args] + """ Returns function signature: [retval, [arg1, ..., argN]]. """ + if None is decl: + decl = self.__inst + retval = None + if decl.return_type: + retval = decl.return_type.decl_string + args = [] + for arg in decl.arguments: + args.append(arg.type.decl_string) + return [retval, args] + def visit_member_function( self ): self.print_decl_header() self.writer( ' ' * (self.level+1) * self.INDENT_SIZE @@ -113,6 +116,9 @@ def visit_constructor( self ): self.print_decl_header() + self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + + "Signature: " + str( self.__get_method_signature() ) + os.linesep ) + if self.__print_details: self.writer( ' ' * ( self.level + 1 ) * self.INDENT_SIZE + 'copy constructor: ' + str(self.__inst.is_copy_constructor) @@ -123,15 +129,23 @@ 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 ) 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 ) 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 ) 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 ) def visit_class_declaration(self ): self.print_decl_header() @@ -148,7 +162,7 @@ byte_align = 'align: %d'%(self.__inst.byte_align) self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_align.ljust( self.JUSTIFY ) + os.linesep ) except NotImplementedError: - self.writer( ' ' * curr_level * self.INDENT_SIZE + "not implemented".ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + "align: not implemented".ljust( self.JUSTIFY ) + os.linesep ) if self.__inst.aliases: aliases = map( lambda typedef: typedef.name, self.__inst.aliases ) @@ -219,7 +233,7 @@ byte_align = 'align: %d'%(self.__inst.type.byte_align) self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_align.ljust( self.JUSTIFY ) + os.linesep ) except NotImplementedError: - self.writer( ' ' * curr_level * self.INDENT_SIZE + "not implemented".ljust( self.JUSTIFY ) + os.linesep ) + self.writer( ' ' * curr_level * self.INDENT_SIZE + "align: not implemented".ljust( self.JUSTIFY ) + os.linesep ) byte_offset = 'offset: %d'%(self.__inst.byte_offset) self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_offset + os.linesep) Modified: pygccxml_dev/pygccxml/msvc/pdb/enums.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/enums.py 2008-05-08 20:05:35 UTC (rev 1318) +++ pygccxml_dev/pygccxml/msvc/pdb/enums.py 2008-05-11 20:23:01 UTC (rev 1319) @@ -45,3 +45,16 @@ nsRegularExpression = nsfRegularExpression | nsfCaseSensitive nsCaseInRegularExpression = nsfRegularExpression | nsfCaseInsensitive + +class DataKind( utils.enum ): + DataIsUnknown = 0 + DataIsLocal = 1 + DataIsStaticLocal = 2 + DataIsParam = 3 + DataIsObjectPtr = 4 + DataIsFileStatic = 5 + DataIsGlobal = 6 + DataIsMember = 7 + DataIsStaticMember = 8 + DataIsConstant = 9 + Modified: pygccxml_dev/pygccxml/msvc/pdb/loader.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-05-08 20:05:35 UTC (rev 1318) +++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-05-11 20:23:01 UTC (rev 1319) @@ -1,4 +1,5 @@ import os +import re import pdb import sys import ctypes @@ -502,23 +503,62 @@ self.__update_decls_tree( function_decl ) self.logger.info( 'building function objects(%d) - done', functions_count ) + def __guess_operator_type( self, smbl, operator_type ): + #assumption: the code deals with correct code + if not smbl.uname.startswith( 'operator' ) or smbl.uname == 'operator': + return None + oper_smbls = ('!', ' ', '*', '%', '&', '(', '+', '-', ',', '/', '|', '~', '[', '^', '=', '<') + if smbl.uname[ len( 'operator' ) ] not in oper_smbls: + return None + if smbl.uname[ len( 'operator' ) ] == ' ' \ + and smbl.uname not in ['operator new', 'operator delete']: + #we have casting operator + return declarations.casting_operator_t() + if isinstance( operator_type, declarations.member_function_type_t ): + return declarations.member_operator_t() + else: + return declarations.free_operator_t() + + def __guess_constructor( self, smbl, calldef_type ): + tmpls = declarations.templates + class_ = declarations.remove_declarated( calldef_type.class_inst ) + if class_.name == smbl.uname \ + or ( tmpls.is_instantiation( class_.name ) + and tmpls.name( class_.name ) == smbl.uname ): + calldef_type.return_type = None + return declarations.constructor_t() + def __create_calldef( self, smbl ): self.logger.debug( 'creating calldef "%s"', smbl.uname ) name_splitter = impl_details.get_name_splitter( smbl.uname ) calldef_type = self.create_type( smbl.type ) #what does happen with constructor? + decl = None if isinstance( calldef_type, declarations.member_function_type_t ): - decl = declarations.member_function_t() + if smbl.uname.startswith( '~' ): + decl = declarations.destructor_t() + if not decl: #may be operator + decl = self.__guess_operator_type(smbl, calldef_type) + if not decl: #may be constructor + decl = self.__guess_constructor( smbl, calldef_type ) + if not decl: + decl = declarations.member_function_t() else: - decl = declarations.free_function_t() + decl = self.__guess_operator_type(smbl, calldef_type) + if not decl: + decl = declarations.free_function_t() decl.name = smbl.uname decl.arguments = map( lambda t: declarations.argument_t( type=t ) , calldef_type.arguments_types ) + + args_smbls = map( as_symbol, smbl.findChildren( msdia.SymTagData, None, 0 ) ) + args_smbls = filter( lambda smbl: smbl.dataKind == enums.DataKind.DataIsParam, args_smbls ) + + for index, arg_smbl in enumerate( args_smbls ): + arg_decl = decl.arguments[index] + arg_decl.name = arg_smbl.name + arg_decl.default_value = arg_smbl.value decl.return_type = calldef_type.return_type - #~ args_smbls = smbl.findChildren( msdia.SymTagFunctionArgType, None, 0 ) - #~ args = map( create_arg, itertools.imap(as_symbol, args_smbls) ) - #~ if 'some_function' in smbl.name: - #~ pdb.set_trace() self.__update_decl( decl, smbl ) self.logger.debug( 'creating calldef "%s" - done', smbl.uname ) return decl This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |