[pygccxml-commit] SF.net SVN: pygccxml: [692] pyplusplus_dev/pyplusplus
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-10-28 12:38:56
|
Revision: 692 http://svn.sourceforge.net/pygccxml/?rev=692&view=rev Author: roman_yakovenko Date: 2006-10-28 05:38:46 -0700 (Sat, 28 Oct 2006) Log Message: ----------- introducing call_traits( http://boost.org/libs/utility/call_traits.htm ) and making small refactoring to use it Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/pyplusplus/decl_wrappers/python_traits.py pyplusplus_dev/pyplusplus/function_transformers/code_manager.py pyplusplus_dev/pyplusplus/function_transformers/substitution_manager.py Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2006-10-27 23:03:19 UTC (rev 691) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2006-10-28 12:38:46 UTC (rev 692) @@ -198,24 +198,8 @@ def function_call_args( self ): params = [] - for index in range( len( self.declaration.arguments ) ): - arg_type = declarations.remove_alias( self.declaration.arguments[index].type ) - if decl_wrappers.python_traits.is_immutable( arg_type ): - params.append( self.argument_name( index ) ) - elif declarations.is_reference( arg_type ): - no_ref = declarations.remove_reference( arg_type ) - if decl_wrappers.python_traits.is_immutable( no_ref ): - #pass by value - params.append( self.argument_name( index ) ) - else: - #pass by ref - params.append( 'boost::ref(%s)' % self.argument_name( index ) ) - elif declarations.is_pointer( arg_type ) \ - and not declarations.is_pointer( arg_type.base ) \ - and not decl_wrappers.python_traits.is_immutable( arg_type.base ): - params.append( 'boost::python::ptr(%s)' % self.argument_name( index ) ) - else: - params.append( self.argument_name( index ) ) + for index, arg in enumerate( self.declaration.arguments ): + params.append( decl_wrappers.python_traits.call_traits( arg.type ) % self.argument_name( index ) ) return ', '.join( params ) def wrapped_class_identifier( self ): Modified: pyplusplus_dev/pyplusplus/decl_wrappers/python_traits.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/python_traits.py 2006-10-27 23:03:19 UTC (rev 691) +++ pyplusplus_dev/pyplusplus/decl_wrappers/python_traits.py 2006-10-28 12:38:46 UTC (rev 692) @@ -16,4 +16,20 @@ or declarations.smart_pointer_traits.is_smart_pointer( type_ ) #todo is_complex, ... - +def call_traits( type_ ): + """http://boost.org/libs/utility/call_traits.htm""" + type_ = declarations.remove_alias( type_ ) + if is_immutable( type_ ): + return "%s" #pass by value + elif declarations.is_reference( type_ ): + no_ref = declarations.remove_reference( type_ ) + if is_immutable( no_ref ): + return "%s" #pass by value + else: + return "boost::ref(%s)" #pass by ref + elif declarations.is_pointer( type_ ) \ + and not is_immutable( type_.base ) \ + and not declarations.is_pointer( type_.base ): + return "boost::python::ptr(%s)" #pass by ptr + else: + return "%s" #pass by value Modified: pyplusplus_dev/pyplusplus/function_transformers/code_manager.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/code_manager.py 2006-10-27 23:03:19 UTC (rev 691) +++ pyplusplus_dev/pyplusplus/function_transformers/code_manager.py 2006-10-28 12:38:46 UTC (rev 692) @@ -358,4 +358,3 @@ # Invoke the inherited method that sets the actual variables code_manager_t.init_variables(self) - Modified: pyplusplus_dev/pyplusplus/function_transformers/substitution_manager.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/substitution_manager.py 2006-10-27 23:03:19 UTC (rev 691) +++ pyplusplus_dev/pyplusplus/function_transformers/substitution_manager.py 2006-10-28 12:38:46 UTC (rev 692) @@ -176,7 +176,8 @@ @param transformers: Function transformer objects @type transformers: list of transformer_t """ - + #prevent recursive import + from pyplusplus import decl_wrappers # Code manager for the virtual function self.virtual_func = code_manager_t() # Code manager for the wrapper function @@ -202,7 +203,9 @@ self.virtual_func.class_name = wrapper_class self.virtual_func.FUNC_NAME = decl.name self.virtual_func.CALL_FUNC_NAME = decl.name - self.virtual_func.input_params = map(lambda a: self._function_call_arg(a), decl.arguments) + self.virtual_func.input_params \ + = map( lambda arg: decl_wrappers.python_traits.call_traits( arg.type ) % arg.name + , decl.arguments ) self.wrapper_func.arg_list = decl.arguments[:] self.wrapper_func.class_name = wrapper_class @@ -488,42 +491,7 @@ decl = parent return None - # _function_call_arg - def _function_call_arg(self, arg): - """Return the C++ expression that represents arg in the actual function call. - This helper method returns a string that contains a C++ expression - that references the argument arg. This expression is supposed to - be used in the function invocation of which this is one input - parameter. The return value is one of three variants: - - - <name> - - boost::ref(<name>) - - boost::python::ptr(<name>) - - @rtype: str - """ - arg_type = declarations.remove_alias( arg.type ) - #prevent recursive import - from pyplusplus import decl_wrappers - if decl_wrappers.python_traits.is_immutable( arg_type ): - return arg.name - elif declarations.is_reference( arg_type ): - no_ref = declarations.remove_reference( arg_type ) - if decl_wrappers.python_traits.is_immutable( no_ref ): - #pass by value - return arg.name - else: - #pass by ref - return 'boost::ref(%s)' % arg.name - elif declarations.is_pointer( arg_type ) \ - and not declarations.is_pointer( arg_type.base ) \ - and not decl_wrappers.python_traits.is_immutable( arg_type.base ): - return 'boost::python::ptr(%s)' % arg.name - else: - return arg.name - - # return_virtual_result_t class return_virtual_result_t(transformer_t): """Extract and return the result value of the virtual function. @@ -609,4 +577,4 @@ print wm.subst_wrapper(template) print wm.get_includes() print wm.get_includes("virtual") - print wm.get_includes("wrapper") + print wm.get_includes("wrapper") \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |