On Sat, Jan 29, 2011 at 2:24 AM, Robert Bradshaw
<rober...@math.washington.edu> wrote:
> On Fri, Jan 28, 2011 at 9:14 PM, Stefan Behnel <stefan...@behnel.de> wrote:
>> Robert Bradshaw, 28.01.2011 22:49:
>>> On Fri, Jan 28, 2011 at 1:01 PM, Stefan Behnel wrote:
>>>> And given that Cython cannot know that the pointer is actually not a
>>>> pointer, it generates the expected code here which only the C compiler can
>>>> detect as invalid.
>>>> This needs fixing in Sage in one way or another.
>>>
>>> Cython didn't used to support tyepdef'd arrays, so that's why it was
>>> declared as a pointer, but yes, that should be fixed. I'll do that in
>>> our copy, and it will go out with the 0.14.1 fixes (even though we
>>> don't need it yet). There's still the case of, say,
>>>
>>>      mpfr_init2(self._args[f(i)], self.domain.prec())
>>>
>>> where f is a cdef int ->  int function. Do we handle that?
>>
>> Sure. The problem isn't (any longer) that we *forget* to put things into a
>> temp, the problem is that we try to put things into a temp now that we
>> cannot store away.
>>
>> I've been dropping some cases in my latest commits where the temp copying
>> mechanism was triggered needlessly. It's basically a matter of properly
>> implementing is_simple() for an ExprNode in order to decide when a non-temp
>> result is side-effect free.
>>
>> I'm still not sure if a coerce_to_owned() method would be worthwhile. As
>> long as SimpleCallNode is the only place where this is actually needed,
>> it's fine to leave the code there. Can anyone think of other places where
>> the order of C value evaluation matters? Tuples and other container
>> literals may qualify, but given that they use only Python values, I don't
>> see it being a problem there.
>
> I'm not sure we handle the optimization of, e.g, "a in (x, y, z)"
> There might be others as well.
>
> Fixing Sage is turning out to be non-trivial...there are many places
> that assume mpz_t is (compatible with) a void*. We also have the
> problem that Cython doesn't let you take the address of an array, as
> it is a non-lvalue, but that's legal in C (and used in Sage).

There's another problem, assigning things to a temporary C++ class or
struct can have side effects (as well as be inefficient).

- Robert
_______________________________________________
Cython-dev mailing list
Cython-dev@codespeak.net
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to