2012/8/24 Vitja Makarov <vitja.maka...@gmail.com>: > 2012/8/23 Vitja Makarov <vitja.maka...@gmail.com>: >> 2012/8/23 Stefan Behnel <stefan...@behnel.de>: >>> Vitja Makarov, 23.08.2012 07:42: >>>> 2012/8/23 Vitja Makarov: >>>>> 2012/8/23 Vitja Makarov: >>>>>> 2012/8/23 Stefan Behnel: >>>>>>> Vitja Makarov, 23.08.2012 07:03: >>>>>>>> 2012/8/23 Stefan Behnel: >>>>>>>>> Vitja Makarov, 22.08.2012 22:34: >>>>>>>>>> 2012/8/23 Stefan Behnel: >>>>>>>>>>> Vitja Makarov, 22.08.2012 22:11: >>>>>>>>>>>> I've found regression: >>>>>>>>>>>> >>>>>>>>>>>> https://sage.math.washington.edu:8091/hudson/job/cython-devel-tests-pyregr/ >>>>>>>>>>> >>>>>>>>>>> Interesting. It's a Py2 list comprehension in a class body that's >>>>>>>>>>> failing here: >>>>>>>>>>> >>>>>>>>>>> """ >>>>>>>>>>> class TestHelpSubparsersOrdering(HelpTestCase): >>>>>>>>>>> subparsers_signatures = [Sig(name=name) >>>>>>>>>>> for name in ('a', 'b', 'c', 'd', 'e')] >>>>>>>>>>> """ >>>>>>>>>>> >>>>>>>>>>> I wonder why "name" isn't declared as a variable yet at the point >>>>>>>>>>> where it >>>>>>>>>>> is being looked up in the function call. >>>>>>>>>> >>>>>>>>>> def lookup_relative(self, name, pos): >>>>>>>>>> if name == "name": >>>>>>>>>> print name >>>>>>>>>> from ipdb import set_trace; set_trace() >>>>>>>>>> entry = self.lookup_here(name) >>>>>>>>>> if entry is not None and entry.pos[1:] <= pos[1:]: # Lookup >>>>>>>>>> fails here >>>>>>>>>> return entry >>>>>>>>>> if self.outer_scope: >>>>>>>>>> return self.outer_scope.lookup_relative(name, pos) >>>>>>>>>> return None >>>>>>>>>> >>>>>>>>>> What is that comparison for? >>>>>>>>> >>>>>>>>> Ah, yes, it is wrong in this context. It was meant to prevent names >>>>>>>>> defined >>>>>>>>> further down in the class body from being considered assignments to >>>>>>>>> the >>>>>>>>> name being looked up. Class bodies are not function bodies, >>>>>>>>> assignments in >>>>>>>>> them do not make a name "local". As long as it's not assigned, it's >>>>>>>>> not >>>>>>>>> defined and must be looked up in the outer scope. >>>>>>>> >>>>>>>> Do you remember this ticket #671 >>>>>>>> >>>>>>>> If there is assignment in the class body we first lookup in the class >>>>>>>> dict and then in globals. >>>>>>>> >>>>>>>> B = 0 >>>>>>>> def foo(): >>>>>>>> B = 1 >>>>>>>> class Foo(): >>>>>>>> A = B >>>>>>>> B = B >>>>>>>> class Bar(): >>>>>>>> A = B >>>>>>>> print Foo.A, Foo.B, Bar.A >>>>>>>> foo() >>>>>>>> >>>>>>>> prints "0 0 1" >>>>>>> >>>>>>> In the case at hand, it's not an assignment but a method declaration. >>>>>>> Maybe >>>>>>> that makes a difference. >>>>>>> >>>>>>> In any case, this needs some more investigation than I did for my >>>>>>> change. I >>>>>>> think it can be rolled back completely. >>>>> >>>>> I've reverted your commit and here is my fix: >>>>> https://github.com/vitek/cython/commit/198f254f62360b61c895ba68be0f4dbe07444449 >>>>> >>>>> Cause of different class scope lookup rules I think we can't fully >>>>> trust CF here. >>>> >>>> Another (maybe better) solution is to fix CF. It mustn't set >>>> cf_maybe_null to False at class scope based on reference success. >>> >>> I've pushed these changes to the master for now. They are correct, even if >>> we decide to improve the control flow decisions here (which would only lead >>> to the same effect anyway). >>> >> >> Ok, I'll take a look later. >> > > Here is fix from CF point of view: > https://github.com/vitek/cython/commit/cbd676c598a7ea0ba61262d46c1c733d362c68da > > Let's wait for jenkins now. >
Jenkins still is not happy about upstream/master. It shows 49.2K instead of previous 50.5K -- vitja. _______________________________________________ cython-devel mailing list cython-devel@python.org http://mail.python.org/mailman/listinfo/cython-devel