[Cython] Out of order side effects of argument evaluation in function calls (ticket #654)
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
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