[Cython] Bug in Cython producing incorrect C code

Vitja Makarov vitja.makarov at gmail.com
Fri Feb 3 21:27:21 CET 2012

2012/1/26 mark florisson <markflorisson88 at gmail.com>:
> On 26 January 2012 19:27, Stefan Behnel <stefan_ml at behnel.de> wrote:
>> mark florisson, 26.01.2012 20:15:
>>> On 26 January 2012 18:53, Stefan Behnel wrote:
>>>> mark florisson, 26.01.2012 16:20:
>>>>> I think this problem can trivially be solved by creating a ProxyNode
>>>>> that should never be replaced by any transform, but it's argument may
>>>>> be replaced. So you wrap self.rhs in a ProxyNode and use that to
>>>>> create your CloneNodes.
>>>> I can't see what a ProxyNode would do that a CloneNode shouldn't do anyway.
>>> It wouldn't be a replacement, merely an addition (an extra indirection).
>> What I was trying to say was that a ProxyNode would always be required by a
>> CloneNode, but I don't see where a ProxyNode would be needed outside of a
>> CloneNode. So it seems rather redundant and I don't know if we need a
>> separate node for it.
> Yes it would be needed only for that, but I think the only real
> alternative is to not use CloneNode at all, i.e. make the
> transformation Dag mentioned, where you create new rhs (NameNode?)
> references to the temporary result.

Now it seems to be the only case when we got problem like this. It
means that clones may be safely created at very late stage.
So transforming CascadeAssignment into SingleAssignments doesn't solve
generic problem.

I tried to implement conditional inlining the same problem may happen
there (ConditionalCallNode owns arguments and replaces
SimpleCallNode's args with clones). Splitting analyse_expressions()
would help. On the other hand moving this optimization after
OptimizeBuiltinCalls() would help too.


More information about the cython-devel mailing list