summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Hylton <jeremy@alum.mit.edu>2001-08-27 21:06:35 (GMT)
committerJeremy Hylton <jeremy@alum.mit.edu>2001-08-27 21:06:35 (GMT)
commitcd8a127e1a0dac4a4cd4b12bdffe8a17dd75cef9 (patch)
tree3deddca983f0d924cf174d2ef21dc1a84967972e
parent7e30c9bb5a6a44829d1df01354523f5c3467583d (diff)
downloadcpython-cd8a127e1a0dac4a4cd4b12bdffe8a17dd75cef9.zip
cpython-cd8a127e1a0dac4a4cd4b12bdffe8a17dd75cef9.tar.gz
cpython-cd8a127e1a0dac4a4cd4b12bdffe8a17dd75cef9.tar.bz2
Fix for sibling nodes that define the same free variable
Evan Simpson's fix. And his explanation: If you defined two nested functions in a row that refer to the same non-global variable, the second one will be generated as though the variable were global.
-rw-r--r--Lib/compiler/symbols.py16
-rw-r--r--Tools/compiler/compiler/symbols.py16
2 files changed, 20 insertions, 12 deletions
diff --git a/Lib/compiler/symbols.py b/Lib/compiler/symbols.py
index 6d834e0..0ef0d12 100644
--- a/Lib/compiler/symbols.py
+++ b/Lib/compiler/symbols.py
@@ -79,7 +79,6 @@ class Scope:
return self.children
def DEBUG(self):
- return
print >> sys.stderr, self.name, self.nested and "nested" or ""
print >> sys.stderr, "\tglobals: ", self.globals
print >> sys.stderr, "\tcells: ", self.cells
@@ -162,12 +161,12 @@ class Scope:
child_globals.append(name)
elif isinstance(self, FunctionScope) and sc == SC_LOCAL:
self.cells[name] = 1
- else:
+ elif sc != SC_CELL:
child_globals.append(name)
else:
if sc == SC_LOCAL:
self.cells[name] = 1
- else:
+ elif sc != SC_CELL:
child_globals.append(name)
return child_globals
@@ -221,7 +220,6 @@ class SymbolVisitor:
self._do_args(scope, node.argnames)
self.visit(node.code, scope)
self.handle_free_vars(scope, parent)
- scope.DEBUG()
def visitLambda(self, node, parent):
for n in node.defaults:
@@ -243,8 +241,6 @@ class SymbolVisitor:
def handle_free_vars(self, scope, parent):
parent.add_child(scope)
- if scope.children:
- scope.DEBUG()
scope.handle_children()
def visitClass(self, node, parent):
@@ -298,6 +294,14 @@ class SymbolVisitor:
def visitAssName(self, node, scope, assign=1):
scope.add_def(node.name)
+ def visitAssAttr(self, node, scope, assign=0):
+ self.visit(node.expr, scope, 0)
+
+ def visitSubscript(self, node, scope, assign=0):
+ self.visit(node.expr, scope, 0)
+ for n in node.subs:
+ self.visit(n, scope, 0)
+
def visitAugAssign(self, node, scope):
# If the LHS is a name, then this counts as assignment.
# Otherwise, it's just use.
diff --git a/Tools/compiler/compiler/symbols.py b/Tools/compiler/compiler/symbols.py
index 6d834e0..0ef0d12 100644
--- a/Tools/compiler/compiler/symbols.py
+++ b/Tools/compiler/compiler/symbols.py
@@ -79,7 +79,6 @@ class Scope:
return self.children
def DEBUG(self):
- return
print >> sys.stderr, self.name, self.nested and "nested" or ""
print >> sys.stderr, "\tglobals: ", self.globals
print >> sys.stderr, "\tcells: ", self.cells
@@ -162,12 +161,12 @@ class Scope:
child_globals.append(name)
elif isinstance(self, FunctionScope) and sc == SC_LOCAL:
self.cells[name] = 1
- else:
+ elif sc != SC_CELL:
child_globals.append(name)
else:
if sc == SC_LOCAL:
self.cells[name] = 1
- else:
+ elif sc != SC_CELL:
child_globals.append(name)
return child_globals
@@ -221,7 +220,6 @@ class SymbolVisitor:
self._do_args(scope, node.argnames)
self.visit(node.code, scope)
self.handle_free_vars(scope, parent)
- scope.DEBUG()
def visitLambda(self, node, parent):
for n in node.defaults:
@@ -243,8 +241,6 @@ class SymbolVisitor:
def handle_free_vars(self, scope, parent):
parent.add_child(scope)
- if scope.children:
- scope.DEBUG()
scope.handle_children()
def visitClass(self, node, parent):
@@ -298,6 +294,14 @@ class SymbolVisitor:
def visitAssName(self, node, scope, assign=1):
scope.add_def(node.name)
+ def visitAssAttr(self, node, scope, assign=0):
+ self.visit(node.expr, scope, 0)
+
+ def visitSubscript(self, node, scope, assign=0):
+ self.visit(node.expr, scope, 0)
+ for n in node.subs:
+ self.visit(n, scope, 0)
+
def visitAugAssign(self, node, scope):
# If the LHS is a name, then this counts as assignment.
# Otherwise, it's just use.