[pygccxml-commit] SF.net SVN: pygccxml:[1741] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2009-08-05 20:13:09
|
Revision: 1741 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1741&view=rev Author: roman_yakovenko Date: 2009-08-05 20:12:45 +0000 (Wed, 05 Aug 2009) Log Message: ----------- adding adaptor for member and free functions Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py pyplusplus_dev/unittests/autoconfig.py pyplusplus_dev/unittests/fundamental_tester_base.py Added Paths: ----------- pyplusplus_dev/unittests/data/function_adaptor_to_be_exported.hpp pyplusplus_dev/unittests/function_adaptor_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2009-06-14 04:42:38 UTC (rev 1740) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2009-08-05 20:12:45 UTC (rev 1741) @@ -199,12 +199,16 @@ def create_function_ref_code(self, use_function_alias=False): fname = declarations.full_name( self.declaration, with_defaults=False ) + result = '' if use_function_alias: - return '%s( &%s )' % ( self.function_type_alias, fname ) + result = '%s( &%s )' % ( self.function_type_alias, fname ) elif self.declaration.create_with_signature: - return '(%s)( &%s )' % ( self.declaration.function_type().partial_decl_string, fname ) + result = '(%s)( &%s )' % ( self.declaration.function_type().partial_decl_string, fname ) else: - return '&%s' % fname + result = '&%s' % fname + if self.declaration.adaptor: + result = "%s( %s )" % ( self.declaration.adaptor, result ) + return result class mem_fun_t( calldef_t ): def __init__( self, function ): @@ -216,12 +220,16 @@ def create_function_ref_code(self, use_function_alias=False): fname = declarations.full_name( self.declaration, with_defaults=False ) + result = '' if use_function_alias: - return '%s( &%s )' % ( self.function_type_alias, fname ) + result = '%s( &%s )' % ( self.function_type_alias, fname ) elif self.declaration.create_with_signature: - return '(%s)( &%s )' % ( self.declaration.function_type().partial_decl_string, fname ) + result = '(%s)( &%s )' % ( self.declaration.function_type().partial_decl_string, fname ) else: - return '&%s' % fname + result = '&%s' % fname + if hasattr( self.declaration, 'adaptor' ) and self.declaration.adaptor: + result = "%s( %s )" % ( self.declaration.adaptor, result ) + return result class make_constructor_t( calldef_t ): def __init__( self, function ): Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2009-06-14 04:42:38 UTC (rev 1740) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2009-08-05 20:12:45 UTC (rev 1741) @@ -247,7 +247,18 @@ self._use_overload_macro = False self._override_precall_code = [] self._default_precall_code = [] + self._adaptor = None + def _get_adaptor(self): + return self._adaptor + def _set_adaptor(self, adaptor): + self._adaptor = adaptor + adaptor = property( _get_adaptor, _set_adaptor + , doc="string, if contains value `Py++` will generate code the following code: " \ + +".def(<name>, <adaptor>(<function reference>), <other args> ) " \ + +". The property is relevant for public, non virtual member functions." ) + + def add_override_precall_code(self, code): """add code, which should be executed, before overridden member function call""" self._override_precall_code.append( code ) @@ -563,7 +574,16 @@ calldef_t.__init__( self ) self._use_overload_macro = False self._declaration_code = [] + self._adaptor = None + def _get_adaptor(self): + return self._adaptor + def _set_adaptor(self, adaptor): + self._adaptor = adaptor + adaptor = property( _get_adaptor, _set_adaptor + , doc="string, if contains value `Py++` will generate code the following code: " \ + +"def(<name>, <adaptor>(<function reference>), <other args> ) " ) + def add_declaration_code( self, code ): """adds the code to the declaration section""" self.declaration_code.append( user_text.user_text_t( code ) ) Modified: pyplusplus_dev/unittests/autoconfig.py =================================================================== --- pyplusplus_dev/unittests/autoconfig.py 2009-06-14 04:42:38 UTC (rev 1740) +++ pyplusplus_dev/unittests/autoconfig.py 2009-08-05 20:12:45 UTC (rev 1741) @@ -92,9 +92,11 @@ while process.poll() is None: line = process.stdout.readline() - print line.rstrip() + if line.strip(): + print line.rstrip() for line in process.stdout.readlines(): - print line.rstrip() + if line.strip(): + print line.rstrip() if process.returncode: raise RuntimeError( "unable to compile extension. See output for the errors." ) Added: pyplusplus_dev/unittests/data/function_adaptor_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/function_adaptor_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/function_adaptor_to_be_exported.hpp 2009-08-05 20:12:45 UTC (rev 1741) @@ -0,0 +1,21 @@ +// Copyright 2004-2008 Roman Yakovenko. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef __function_adaptor_to_be_exported_hpp__ +#define __function_adaptor_to_be_exported_hpp__ + +//#include <boost/preprocessor/facilities/identity.hpp> +//I need it for BOOST_PP_IDENTITY macro + +#define PYPP_IDENTITY( X ) X + +struct foo_t{ + int get_zero() const{ return 0; } + static int get_two(){ return 2; } +}; + +inline int get_one(){ return 1; } + +#endif//__function_adaptor_to_be_exported_hpp__ Added: pyplusplus_dev/unittests/function_adaptor_tester.py =================================================================== --- pyplusplus_dev/unittests/function_adaptor_tester.py (rev 0) +++ pyplusplus_dev/unittests/function_adaptor_tester.py 2009-08-05 20:12:45 UTC (rev 1741) @@ -0,0 +1,41 @@ +# Copyright 2004-2008 Roman Yakovenko. +# Distributed under the Boost Software License, Version 1.0. (See +# accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +import os +import sys +import unittest +import fundamental_tester_base +from pyplusplus import code_creators + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'function_adaptor' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize(self, mb ): + for suffix in [ 'zero', 'one', 'two' ]: + mb.calldef( 'get_' + suffix ).adaptor = 'PYPP_IDENTITY' + mb.calldef( 'get_' + suffix ).create_with_signature = False + def run_tests( self, module): + foo = module.foo_t() + self.failUnless( foo.get_zero() == 0 ) + self.failUnless( foo.get_two() == 2 ) + self.failUnless( module.foo_t.get_two() == 2 ) + self.failUnless( module.get_one() == 1 ) + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() Modified: pyplusplus_dev/unittests/fundamental_tester_base.py =================================================================== --- pyplusplus_dev/unittests/fundamental_tester_base.py 2009-06-14 04:42:38 UTC (rev 1740) +++ pyplusplus_dev/unittests/fundamental_tester_base.py 2009-08-05 20:12:45 UTC (rev 1741) @@ -137,6 +137,7 @@ break exit_status = output.close() scons_msg = ''.join(scons_reports) + scons_msg = scons_msg.strip() if exit_status: raise RuntimeError( "unable to clean extension. error: %s" % scons_msg ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |