[Cython] Out of order side effects of argument evaluation in function calls (ticket #654)

Stefan Behnel stefan_ml at behnel.de
Fri Mar 11 13:45:11 CET 2011


ticket 654 describes a code generation problem where the arguments to a 
cdef function are not being evaluated in the order they are written down in 
the code.


This introduces problems when the arguments have side effects or are not 
simple, e.g. they are function calls themselves or are taken from object 
attributes or live in a closure. For example,

     f(g(a), a.x, h(a))

will produce different results depending on the evaluation order if g or h 
change the value of a.x.

However, apparently, the order of evaluation is only guaranteed by Python, 
not by C. Now, the question is: what are the right semantics for Cython 
here: follow Python or C?

Personally, I think it would be nice to keep up Python's semantics, but 
when I implemented this I broke quite some code in Sage (you may have 
noticed that the sage-build project in Hudson has been red for a while). 
There are things in C and especially in C++ that cannot be easily copied 
into a temporary variable in order to make sure they are evaluated before 
the following arguments. This is not a problem for Python function calls 
where all arguments end up being copied (and often converted) anyway. It is 
a problem for C function calls, though.

What do you think about this?


More information about the cython-devel mailing list