[C++-sig] Convert C++ Class to exposed class and back

Marcus Jannes jannes80 at hotmail.de
Thu Feb 14 17:07:48 CET 2008


I got it working with my previous C API approach, there were just some bugs like not passing a tuple to the PyEval_CallObject function. Indeed the function pointer does not need to be stored for further use. I might try your suggestion at a later point too, thanks for your help, much appreciated. I think the Boost Python FAQ could be extended in this matter, it isn't that clear or its my lack of english ;-)

> Again, it can't be done any less (or more) in boost.python than it can 
> be done with the C API. You still face the same question (which David 
> points out in the FAQ, as you noted): you need to pass some state that 
> needs to be remembered, close to the function (pointer).
> 
> If the execution of that function is synchronous, i.e. if your C++ 
> library does not intend to store the function pointer and call it later, 
> you may get away by setting some static data during the upcall.
> 
> However, this won't work if the execution is deferred, as you may call 
> fEval from within python multiple times, each time overriding the 
> closure data set in the previous call.
> 
> Here is how it *might* work:
> 
> 
> // remember the current python function
> bp::object current_callable;
> 
> // implement suitable ddf_FctPtr that executes
> // the current python function
> DerivType call(DerivType const &argument)
> {
>    bp::object retn = current_callable(argument);
>    return bp::extract(retn);
> }
> 
> // The function to be called in Python. The return value is returned 
> directly, not passed back by-reference.
> DerivType py_fEval(bp::object function, DerivType const &argument)
> {
>    DerivType retn;
>    current_callable = function;
>    // assume 'call' won't be stored beyond this call, and so we can
>    // be sure 'current_callable' doesn't change its value.
>    fEval(call, argument, retn);
>    return retn;
> }
> 
> 
> Now you only need to export 'py_fEval' as 'fEval' to python and you 
> should be all set. Remember: this trick only works if the function 
> pointer won't be retained and called asynchronously, as then 
> 'current_callable' may long have assumed a different value.
> 
> HTH,
> 		Stefan
> 
> -- 
> 
>        ...ich hab' noch einen Koffer in Berlin...
> _______________________________________________
> C++-sig mailing list
> C++-sig at python.org
> http://mail.python.org/mailman/listinfo/c++-sig

_________________________________________________________________
Neu: Internet Explorer 7 optimiert für MSN!
http://optimize.de.msn.com/default.aspx?mkt=de-de


More information about the Cplusplus-sig mailing list