[pygccxml-commit] SF.net SVN: pygccxml:[1373] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2008-07-17 04:30:55
|
Revision: 1373 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1373&view=rev Author: roman_yakovenko Date: 2008-07-17 04:31:02 +0000 (Thu, 17 Jul 2008) Log Message: ----------- adding ability to expose "this" pointer to python as integer Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/classes_tester.py Added Paths: ----------- pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-07-14 18:58:40 UTC (rev 1372) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-07-17 04:31:02 UTC (rev 1373) @@ -135,3 +135,5 @@ from opaque_type_registrator import opaque_type_registrator_t from properties import property_t + +from ctypes_integration_creators import expose_this_t Added: pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py 2008-07-17 04:31:02 UTC (rev 1373) @@ -0,0 +1,39 @@ +# Copyright 2004 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 algorithm +import code_creator +import declaration_based +import registration_based +from pygccxml import declarations +from pyplusplus import decl_wrappers +from pyplusplus import code_repository + +class expose_this_t( registration_based.registration_based_t + , declaration_based.declaration_based_t ): + """ + creates code that expose address of the object to Python + """ + + def __init__(self, class_ ): + registration_based.registration_based_t.__init__( self ) + declaration_based.declaration_based_t.__init__( self, declaration=class_) + + def _create_impl(self): + answer = [ 'add_property' ] + answer.append( '( ' ) + answer.append('"this"') + answer.append( self.PARAM_SEPARATOR ) + answer.append( 'pyplus_conv::make_addressof_inst_getter< %s >()' % self.decl_identifier ) + if self.documentation: + answer.append( self.PARAM_SEPARATOR ) + answer.append( self.documentation ) + answer.append( ' ) ' ) + + return ''.join( answer ) + + def _get_system_headers_impl( self ): + return [code_repository.ctypes_integration.file_name] Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2008-07-14 18:58:40 UTC (rev 1372) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2008-07-17 04:31:02 UTC (rev 1373) @@ -669,8 +669,11 @@ answer.append('"%s"' % self.alias) answer.append( self.PARAM_SEPARATOR ) - answer.append( 'pyplus_conv::make_addressof_getter(&%s)' - % self.decl_identifier ) + if self.declaration.type_qualifiers.has_static: + answer.append( 'not implemented' ) + else: + answer.append( 'pyplus_conv::make_addressof_getter(&%s)' + % self.decl_identifier ) if doc: answer.append( self.PARAM_SEPARATOR ) answer.append( doc ) Modified: pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py 2008-07-14 18:58:40 UTC (rev 1372) +++ pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py 2008-07-17 04:31:02 UTC (rev 1373) @@ -37,6 +37,13 @@ return boost::uintmax_t( boost::addressof( inst.*offset ) ); } +template< typename TType > +boost::uintmax_t +addressof_inst( const TType &inst){ + return boost::uintmax_t( boost::addressof( inst ) ); +} + + template< typename TType, typename TMemVarType > boost::python::object make_addressof_getter( const TMemVarType TType::* offset ){ @@ -47,6 +54,16 @@ , boost::mpl::vector< boost::uintmax_t, const TType& >() ); } +template< typename TType > +boost::python::object +make_addressof_inst_getter(){ + namespace bpl = boost::python; + namespace pyppc = pyplusplus::convenience; + return bpl::make_function( boost::bind( &pyppc::addressof_inst< TType >, _1 ) + , bpl::default_call_policies() + , boost::mpl::vector< boost::uintmax_t, const TType& >() ); +} + } /*pyplusplus*/ } /*convenience*/ namespace pyplus_conv = pyplusplus::convenience; Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-07-14 18:58:40 UTC (rev 1372) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-07-17 04:31:02 UTC (rev 1373) @@ -190,6 +190,7 @@ self._redefined_funcs = None self._require_self_reference = False self._exposed_class_type = self.EXPOSED_CLASS_TYPE.DECLARED + self._expose_this = None def _get_redefine_operators( self ): return self._redefine_operators @@ -628,3 +629,10 @@ self._require_self_reference = require_self_reference require_self_reference = property( _get_require_self_reference, _set_require_self_reference , doc="boolean, if True the first argument to the constructor will be reference to self object" ) + + def _get_expose_this( self ): + return self._expose_this + def _set_expose_this( self, new_value ): + self._expose_this = new_value + expose_this = property( _get_expose_this, _set_expose_this + , doc="boolean, if True an object address( this pointer ) will be exposed to Python as integer.") Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-07-14 18:58:40 UTC (rev 1372) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-07-17 04:31:02 UTC (rev 1373) @@ -593,6 +593,10 @@ cls_parent_cc.adopt_creator( cls_cc ) self.curr_code_creator = cls_cc + + if cls_decl.expose_this: + cls_cc.adopt_creator( code_creators.expose_this_t( cls_decl ) ) + for decl in exportable_members: if decl in exposed: continue Modified: pyplusplus_dev/unittests/classes_tester.py =================================================================== --- pyplusplus_dev/unittests/classes_tester.py 2008-07-14 18:58:40 UTC (rev 1372) +++ pyplusplus_dev/unittests/classes_tester.py 2008-07-17 04:31:02 UTC (rev 1373) @@ -10,14 +10,15 @@ class tester_t(fundamental_tester_base.fundamental_tester_base_t): EXTENSION_NAME = 'classes' - + def __init__( self, *args ): - fundamental_tester_base.fundamental_tester_base_t.__init__( + fundamental_tester_base.fundamental_tester_base_t.__init__( self , tester_t.EXTENSION_NAME , *args ) - + def customize(self, mb ): + mb.classes().expose_this = True mb.class_( 'fundamental2' ).alias = 'FUNDAMENTAL2' apple = mb.class_( 'apple' ) self.failUnless( apple.alias == 'the_tastest_fruit' ) @@ -29,7 +30,7 @@ self.failUnless( 'PROTECTED_STATIC' in protected_static_t.alias) protected_static_t.alias = 'protected_static_t' - def run_tests(self, module): + def run_tests(self, module): self.failIfRaisesAny( module.fundamental1 ) self.failIfRaisesAny( module.FUNDAMENTAL2 ) @@ -39,21 +40,22 @@ self.failIfRaisesAny( module.noncopyable1 ) self.failIfRaisesAny( module.abstract ) - + self.failIfRaisesAny( module.constructor1 ) self.failIfRaisesAny( module.constructor1, 1, 2 ) self.failIfRaisesAny( module.constructor1, 3, module.constructor1() ) - + self.failIfRaisesAny( module.scope_based_exposer ) self.failIfRaisesAny( lambda: module.scope_based_exposer.EColor.red ) - + self.failUnless( 24 == module.protected_static_t.identity(24) ) self.failUnless( 29 == module.protected_static_t.identity(29) ) self.failUnless( -24 == module.protected_static_t().invert_sign(24) ) self.failUnless( 67 == module.protected_static_t().invert_sign(-67) ) - + self.failUnless( module.protected_static_t().this ) + def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |