Robert Bradshaw wrote:
> Very good point. I've forwarded this onto Danilo who's working on C++  
> support.
> 
> On Jul 23, 2009, at 12:56 PM, Martin Albrecht wrote:
> 
>>> 1) Do you have any priorities for features you'd like to see sooner
>>> rather than later?
>> While debugging and fixing an issue in the current PolyBoRi wrapper  
>> with
>> Alexander Dreyer we noticed the following behaviour in Cython which  
>> doesn't
>> mix well with C++:
>>
>> Consider the following code:
>>
>> cdef BoolePolyRing ring = pbenv_ring()
>>
>> where pbenv_ring() returns a reference to the currently active  
>> PolyBoRi ring.
>>
>> This is fine because Cython doesn't care whether a variable or a  
>> reference is
>> returned. However, Cython re-arranges the code as follows internally:
>>
>> cdef BoolePolyRing ring
>> ring  = pbenv_ring()
>>
>> This is fine if BoolePolyRing is a C data structure because in C  
>> declaration
>> is never code execution. However, this is not fine in C++ where  
>> declaration
>> may be code execution: the default constructor.
>>
>> (In our case the default constructor for BoolePolyRing would define  
>> a new ring
>> and mark it as active and thus render the later assignment useless)
>>
>> So my nr.1 feature request is to not re-arrange declarations if C++  
>> is the
>> language Cython compiles to.

Note that this alone will not solve very much -- it will still only work 
for classes with constructors without arguments. Just doing this would 
just waste time IMO.

This particular problem has been discussed to great length on the Cython 
list several times -- to recap quickly:

1) At first, one should probably disallow code like that (all C++ 
classes must only be used through pointers -- so "cdef BoolePolyRing* 
ring").

Note that without further definition of how this should work,

ring = pbenv_ring()

is nonsense anyway ("cdef BoolePolyRing ring" means stack allocated 
memory, not reference counted or similar).

2) In time, call constructors and destructors manually even for 
stack-allocated variables. (One way is a somewhat complicated hack 
involving "placement new" and an additional flag variable for "has the 
variable been assigned to" that I won't recap, it's in the Cython archives.)


-- 
Dag Sverre

--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-devel@googlegroups.com
To unsubscribe from this group, send email to 
sage-devel-unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URLs: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---

Reply via email to