On 25 July 2012 07:29, Stefan Behnel <stefan...@behnel.de> wrote:
> Stefan Behnel, 25.07.2012 07:40:
>> Mike Zaletel, 25.07.2012 00:40:
>>> --------bug.pyx----------
>>>
>>> def foo():
>>>        cdef int i
>>>        cdef int* p1 = [4, 4]
>>>        cdef int* p2 = [5, 5]
>>>
>>>        print "p1:",
>>>        for i in range(2):
>>>                print p1[i],
>>>        print "\np2:",
>>>        for i in range(2):
>>>                print p2[i],
>>>
>>> -----------------------------
>>>
>>> which in Cython 0.17beta1 gives me
>>>
>>> >>> import bug
>>> >>> bug.foo()
>>> p1: 5 5
>>> p2: 5 5
>>>
>>>
>>> while in Cython 0.16 I get
>>>
>>> >>> import bug
>>> >>> bug.foo()
>>> p1: 4 4
>>> p2: 5 5
>>
>> The problem is that the same (temporary) local array variable is used in
>> both cases to build the array, and then only a pointer is assigned, i.e. p1
>> and p2 then point to the same array, which gets overwritten with the new
>> values in the second assignment.
>
> Looking into this some more, the problem arises from the pointer
> assignment, because the left side is a pointer variable whereas the right
> side is a temp value. Temps aren't really made for an enduring life. Here,
> the array temp variable is being freed after the assignment and then
> reused. We could fix it by not freeing the temp, or at least by not reusing
> it, but the problem is really in the syntax. The LHS should be an array,
> not a pointer.
>
> It broke (and I broke it) when I fixed pointer type comparisons and made
> pointer and array types properly hashable. I think it was already subtly
> broken before in Py2 and just didn't show because it's sufficiently
> unlikely that two equal array types that use the default hash by object
> id() end up in the same dict bucket. Only then would the __eq__()
> comparison strike to reuse the same temp for both types.
>
> Stefan
>
> _______________________________________________
> cython-devel mailing list
> cython-devel@python.org
> http://mail.python.org/mailman/listinfo/cython-devel

I'm wondering, what was the original motivation to reuse temporaries?
I think it leads to more problems than benefits in most cases, all you
really care about is clearing up references. Do we ever have C++
stack-allocated object temporaries? Or does it save some stack space
(always, or when you take a pointer to the temporary)?
_______________________________________________
cython-devel mailing list
cython-devel@python.org
http://mail.python.org/mailman/listinfo/cython-devel

Reply via email to