[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.
|