[pypy-svn] r66243 - pypy/branch/parser-compiler/pypy/interpreter/astcompiler

benjamin at codespeak.net benjamin at codespeak.net
Wed Jul 15 19:37:22 CEST 2009


Author: benjamin
Date: Wed Jul 15 19:37:21 2009
New Revision: 66243

Modified:
   pypy/branch/parser-compiler/pypy/interpreter/astcompiler/symtable.py
Log:
add warnings for misplaced global statements

Modified: pypy/branch/parser-compiler/pypy/interpreter/astcompiler/symtable.py
==============================================================================
--- pypy/branch/parser-compiler/pypy/interpreter/astcompiler/symtable.py	(original)
+++ pypy/branch/parser-compiler/pypy/interpreter/astcompiler/symtable.py	Wed Jul 15 19:37:21 2009
@@ -40,11 +40,14 @@
     def lookup(self, name):
         return self.symbols.get(self.mangle(name), SCOPE_UNKNOWN)
 
+    def lookup_role(self, name):
+        return self.roles.get(self.mangle(name), SYM_BLANK)
+
     def note_symbol(self, identifier, role):
         mangled = self.mangle(identifier)
         new_role = role
-        if identifier in self.roles:
-            old_role = self.roles[identifier]
+        if mangled in self.roles:
+            old_role = self.roles[mangled]
             if old_role & SYM_PARAM and role & SYM_PARAM:
                 err = "duplicate argument '%s' in function definition" % \
                     (identifier,)
@@ -256,6 +259,7 @@
     def __init__(self, space, module, compile_info):
         self.space = space
         self.module = module
+        self.compile_info = compile_info
         self.scopes = {}
         self.scope = None
         self.stack = []
@@ -301,7 +305,7 @@
     def note_symbol(self, identifier, role):
         mangled = self.scope.note_symbol(identifier, role)
         if role & SYM_GLOBAL:
-            if identifier in self.globs:
+            if mangled in self.globs:
                 role |= self.globs[mangled]
             self.globs[mangled] = role
 
@@ -356,6 +360,14 @@
 
     def visit_Global(self, glob):
         for name in glob.names:
+            old_role = self.scope.lookup_role(name)
+            if old_role & (SYM_USED | SYM_ASSIGNED):
+                if old_role & SYM_ASSIGNED:
+                    msg = "name '%s' is assigned to before global declaration"
+                else:
+                    msg = "name '%s' is used prior to global declaration"
+                misc.syntax_warning(self.space, msg, self.compile_info.filename,
+                                    glob.lineno, glob.col_offset)
             self.note_symbol(name, SYM_GLOBAL)
 
     def visit_Lambda(self, lamb):



More information about the Pypy-commit mailing list