From 4f8e5b0a26b33f340ed710f38c24cdbe20b63675 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Fri, 17 Dec 2010 01:15:19 +0100 Subject: [PATCH] fix 'nonlocal' for class scope --- Cython/Compiler/Symtab.py | 11 +++++++++++ tests/run/nonlocal_T490.pyx | 37 +++++++++++++++++++------------------ 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/Cython/Compiler/Symtab.py b/Cython/Compiler/Symtab.py index 5bbad507..40fb6d48 100644 --- a/Cython/Compiler/Symtab.py +++ b/Cython/Compiler/Symtab.py @@ -1450,6 +1450,17 @@ class PyClassScope(ClassScope): entry.is_pyclass_attr = 1 return entry + def declare_nonlocal(self, name, pos): + # Pull entry from outer scope into local scope + if self.lookup_here(name): + warning(pos, "'%s' redeclared" % name, 0) + else: + entry = self.lookup(name) + if entry is None: + error(pos, "no binding for nonlocal '%s' found" % name) + else: + self.entries[name] = entry + def add_default_value(self, type): return self.outer_scope.add_default_value(type) diff --git a/tests/run/nonlocal_T490.pyx b/tests/run/nonlocal_T490.pyx index c80c1808..eb7f6610 100644 --- a/tests/run/nonlocal_T490.pyx +++ b/tests/run/nonlocal_T490.pyx @@ -119,24 +119,25 @@ def methods(): return c() return f -# FIXME: doesn't currently work in class namespace: - -## def class_body(): -## """ -## >>> c = f(0) -## >>> c.get() -## 1 -## >>> c.x #doctest: +ELLIPSIS -## Traceback (most recent call last): -## AttributeError: ... -## """ -## def f(x): -## class c: -## nonlocal x -## x += 1 -## def get(self): -## return x -## return c() +def class_body(int x, y): + """ + >>> c = class_body(2,99) + >>> c.z + (3, 2) + >>> c.x #doctest: +ELLIPSIS + Traceback (most recent call last): + AttributeError: ... + >>> c.y #doctest: +ELLIPSIS + Traceback (most recent call last): + AttributeError: ... + """ + class c(object): + nonlocal x + nonlocal y + y = 2 + x += 1 + z = x,y + return c() def generator(): """ -- 2.26.2