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