[C++-sig] Pyste suggestion: handling void * arguments

Nicodemus nicodemus at esss.com.br
Sat Nov 1 19:49:11 CET 2003


Niall Douglas wrote:

>On 28 Oct 2003 at 19:05, Nicodemus wrote:
>
>  
>
>>>You're nearly there. I foresee two options here - either make void *
>>>a container where python can access the pointer or make it an opaque
>>>type. Mixing the two creates confusion IMHO.
>>>      
>>>
>>Acess void* in Python? What for? You won't be able to do anything with
>>it, except pass it to other C++ functions that accept void* too. And
>>then the code above would take care of that, creating automatic
>>wrappers for this functions too.
>>    
>>
>
>You can alter it like an long integer - add and subtract offsets, set 
>to fixed locations etc. I'm not saying it's all that common, but it 
>would offer the ability for python to use pointers*
>
>(*: Many would consider adding pointers to python a real retrograde 
>step. I'm not saying it's a good idea, but it is useful in selected 
>instances)
>  
>

Hmm... I don't think that supporting pointer arithmetic in Python is a 
compelling reason the let the user access the void* in Python... I think 
the user-cases for this are very limited, and not very Pythonic at all... 8/

>>>If you're going for opaque, you don't define void_ptr at all. This
>>>lets you catch when you're returning void * but have forgotten to
>>>specify return_opaque_pointer. Even better if pyste does this for you
>>>automagically.
>>>      
>>>
>>Sorry, I didn't understand you. You mean that when a function returns
>>void*, Pyste could automatically set its default policy for
>>return_opaque_pointer? That would be the optimal solution, but
>>return_opaque_pointer doesn't work with void*, or am I wrong?
>>    
>>
>
>Sorry, I wasn't being clear. If you declare a type (can't be void *) 
>to be opaque under BPL, then you don't define it. You just do:
>
>struct void_ptr;
>
>... and that's it. Best to leave it undefined because then failing to 
>set return_opaque_pointer policy causes a compile-time error and 
>until you add the array-indexed policy setting, we need errors where 
>at least one overload returns void *.
>

I still don't understand you, sorry. 8(

You said (in the quote above) that if you declare a type to be opaque 
under BPL, it's better that you don't define it, because if you forget 
to set return_opaque_pointer it will cause compile-time errors. What I 
don't understand is how can you declare it "to be opaque under BPL" 
*without* setting its policy...

>>>Your problem with generating wrappers is passing parameters in a
>>>fashion which doesn't cause problems. Most specifically, you must
>>>avoid copy construction when parameters are entering any C++ code.
>>>I've found call_traits::param_type to be useful here, but I'd imagine
>>>pyste would know when it can pass by reference and when not without
>>>that.
>>>      
>>>
>>Hmm, I see. But what's the problem with extra copy construction? You
>>mean performance, or some other problem?
>>    
>>
>
>More that some classes either (a) don't implement copying and worse 
>(b) their copy constructor does a destructive copy. Especially in the 
>latter case a copy construction is *fatal* to continued program 
>operation as it alters the semantics of the C++ ABI.
>  
>

You're right about that...

>See the multithreading patch to invoke.hpp I posted here a week or so 
>ago. You'll note the care I went to to avoid copy construction in the 
>parameters (returns may need it too, though that's rare).
>

Hmm, can you help then with the implementation of this wrappers then? 8) 
It would be greatly appreciated.

Regards,
Nicodemus.





More information about the Cplusplus-sig mailing list