On Fri, May 21, 2010 at 1:26 AM, Lisandro Dalcin <[email protected]> wrote:
> On 20 May 2010 13:54, Haoyu Bai <[email protected]> wrote:
>> Hi,
>>
>> While I get the the nonlocal keyword implemented, now the inner
>> function is able to write to the closure. This cause refnanny lost
>> tracking on the closure variables when following the refcounting rules
>> described at http://wiki.cython.org/refcounting . For example:
>>
>> def foo():
>>    x=0 # INCREF(0), 0 get traced by refnanny
>>    def bar():
>>        # DECREF(x)  refnanny complains since x is not got tracked yet
>>        # INCREF(1)
>>        x=1
>>        # refnanny complains since there is no giveref for 1
>>    bar()
>>    # refnanny complains since 0 is not giveref-ed and 1 got giveref-ed 
>> instead
>>
>>
>> For the inner function bar() it is easy to fix. But for the outer
>> function, since the thing x referenced to can be changed at every
>> point now, it will not work correctly to giveref at the end of
>> function.
>>
>> Since the rule is that closure variables are owned by scope object and
>> not managed by refnanny. So my idea to fix this is to wrap every
>> assignment to closure object by a pair of GOTREF and GIVEREF. So when
>> you do x=1, these will happen:
>>
>> GOTREF(x)
>> DECREF(x)
>> INCREF(1)
>> x=1
>> GIVEREF(x)
>>
>> Then refnanny will be happy.
>>
>
> Looks good ...
>
>> I implemented this, and got all the closure related tests passed
>> without refnanny complaining.
>>
>> This generate a bit more codes but I think should be ok. Since
>> refnanny is for debug so performance at here would not be a concern.
>>
>
> Of course, never mind about these extra lines...
>
>
>
> --
> Lisandro Dalcin

Thanks! :)

BTW, just spotted a closure bug, this won't compile (reports
'__pyx_outer_scope' redeclared):

def nested1():
    def f():
        def g1():
            pass

def nested2():
    def f():
        def g2():
            pass

Seems some name mangling problem. I traced to
CreateClosureClasses.create_class_from_scope() in
ParseTreeTransform.py then didn't get the idea yet.

Anyone want to look into it? Should I file it to issue tracker?

-- 
Haoyu BAI
School of Computing,
National University of Singapore.
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to