[Python-checkins] CVS: python/dist/src/Tools/compiler/compiler symbols.py,1.5,1.6

Jeremy Hylton jhylton@users.sourceforge.net
2001年8月27日 14:06:37 -0700


Update of /cvsroot/python/python/dist/src/Tools/compiler/compiler
In directory usw-pr-cvs1:/tmp/cvs-serv23621
Modified Files:
	symbols.py 
Log Message:
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.
Index: symbols.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/compiler/compiler/symbols.py,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** symbols.py	2001年04月12日 07:06:25	1.5
--- symbols.py	2001年08月27日 21:06:35	1.6
***************
*** 80,84 ****
 
 def DEBUG(self):
- return
 print >> sys.stderr, self.name, self.nested and "nested" or ""
 print >> sys.stderr, "\tglobals: ", self.globals
--- 80,83 ----
***************
*** 163,172 ****
 elif isinstance(self, FunctionScope) and sc == SC_LOCAL:
 self.cells[name] = 1
! else:
 child_globals.append(name)
 else:
 if sc == SC_LOCAL:
 self.cells[name] = 1
! else:
 child_globals.append(name)
 return child_globals
--- 162,171 ----
 elif isinstance(self, FunctionScope) and sc == SC_LOCAL:
 self.cells[name] = 1
! elif sc != SC_CELL:
 child_globals.append(name)
 else:
 if sc == SC_LOCAL:
 self.cells[name] = 1
! elif sc != SC_CELL:
 child_globals.append(name)
 return child_globals
***************
*** 222,226 ****
 self.visit(node.code, scope)
 self.handle_free_vars(scope, parent)
- scope.DEBUG()
 
 def visitLambda(self, node, parent):
--- 221,224 ----
***************
*** 244,249 ****
 def handle_free_vars(self, scope, parent):
 parent.add_child(scope)
- if scope.children:
- scope.DEBUG()
 scope.handle_children()
 
--- 242,245 ----
***************
*** 299,302 ****
--- 295,306 ----
 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.

AltStyle によって変換されたページ (->オリジナル) /