[pypy-svn] r17336 - in pypy/dist/pypy/interpreter: astcompiler pyparser

pedronis at codespeak.net pedronis at codespeak.net
Wed Sep 7 19:41:14 CEST 2005


Author: pedronis
Date: Wed Sep  7 19:41:12 2005
New Revision: 17336

Modified:
   pypy/dist/pypy/interpreter/astcompiler/future.py
   pypy/dist/pypy/interpreter/astcompiler/pyassem.py
   pypy/dist/pypy/interpreter/astcompiler/pycodegen.py
   pypy/dist/pypy/interpreter/astcompiler/symbols.py
   pypy/dist/pypy/interpreter/astcompiler/transformer.py
   pypy/dist/pypy/interpreter/astcompiler/visitor.py
   pypy/dist/pypy/interpreter/pyparser/error.py
Log:
has_key -> in

solved some other cases of mixed None and ints

don't use hasattr on valid_future



Modified: pypy/dist/pypy/interpreter/astcompiler/future.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/future.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/future.py	Wed Sep  7 19:41:12 2005
@@ -22,25 +22,33 @@
 
     def visitModule(self, node):
         stmt = node.node
+        invalid = False
         for s in stmt.nodes:
-            if not self.check_stmt(s):
-                break
+            if not self.check_stmt(s, invalid):
+                invalid = True
 
-    def check_stmt(self, stmt):
-        if is_future(stmt):
-            for name, asname in stmt.names:
-                if name in self.features:
-                    self.found[name] = 1
-                elif name=="*":
-                    raise SyntaxError(
-                        "future statement does not support import *",
-                        ( stmt.filename, stmt.lineno, 0, "" ) )
-                else:
-                    raise SyntaxError(
-                        "future feature %s is not defined" % name,
-                        ( stmt.filename, stmt.lineno, 0, "" ) )
-            stmt.valid_future = 1
-            return 1
+    def check_stmt(self, stmt, invalid):
+        if isinstance(stmt, ast.From):
+            stmt.valid_future = 0
+            if invalid:
+                return 0
+            if is_future(stmt):
+                assert isinstance(stmt, ast.From)
+                for name, asname in stmt.names:
+                    if name in self.features:
+                        self.found[name] = 1
+                    elif name=="*":
+                        raise SyntaxError(
+                            "future statement does not support import *",
+                            filename = stmt.filename,
+                            lineno = stmt.lineno)
+                    else:
+                        raise SyntaxError(
+                            "future feature %s is not defined" % name,
+                            filename = stmt.filename,
+                            lineno = stmt.lineno)                        
+                stmt.valid_future = 1
+                return 1
         return 0
 
     def get_features(self):
@@ -52,13 +60,22 @@
     Those not marked valid are appearing after other statements
     """
 
+    def visitModule(self, node):
+        stmt = node.node
+        for s in stmt.nodes:
+            if isinstance(s, ast.From):
+                if s.valid_future:
+                    continue
+                if s.modname != "__future__":
+                    continue
+                self.visitFrom(s)
+            else:
+                self.default(s)
+
     def visitFrom(self, node):
-        if hasattr(node, 'valid_future'):
-            return
-        if node.modname != "__future__":
-            return
         raise SyntaxError( "from __future__ imports must occur at the beginning of the file",
-                           ( node.filename, node.lineno, 0, "" ) )
+                           filename=node.filename,
+                           lineno=node.lineno)
 
 def find_futures(node):
     p1 = FutureParser()

Modified: pypy/dist/pypy/interpreter/astcompiler/pyassem.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/pyassem.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/pyassem.py	Wed Sep  7 19:41:12 2005
@@ -305,7 +305,7 @@
     order = []
     seen[b] = b
     for c in b.get_children():
-        if seen.has_key(c):
+        if c in seen:
             continue
         order = order + dfs_postorder(c, seen)
     order.append(b)
@@ -512,7 +512,7 @@
             sys.stdout = save
 
     def _max_depth(self, depth, seen, b, d):
-        if seen.has_key(b):
+        if b in seen:
             return d
         seen[b] = 1
         d = d + depth[b]
@@ -641,7 +641,7 @@
         for name in self.cellvars:
             cells[name] = 1
         self.cellvars = [name for name in self.varnames
-                         if cells.has_key(name)]
+                         if name in cells]
         for name in self.cellvars:
             del cells[name]
         self.cellvars = self.cellvars + cells.keys()

Modified: pypy/dist/pypy/interpreter/astcompiler/pycodegen.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/pycodegen.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/pycodegen.py	Wed Sep  7 19:41:12 2005
@@ -1242,6 +1242,7 @@
             name = "<lambda.%d>" % klass.lambdaCount
             klass.lambdaCount = klass.lambdaCount + 1
         else:
+            assert isinstance(func, ast.Function)
             name = func.name
 
         args, hasTupleArg = generateArgList(func.argnames)

Modified: pypy/dist/pypy/interpreter/astcompiler/symbols.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/symbols.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/symbols.py	Wed Sep  7 19:41:12 2005
@@ -26,8 +26,8 @@
         self.children = []
         # nested is true if the class could contain free variables,
         # i.e. if it is nested within another function.
-        self.nested = None
-        self.generator = None
+        self.nested = 0
+        self.generator = 0
         self.klass = None
         if klass is not None:
             for i in range(len(klass)):
@@ -51,9 +51,9 @@
 
     def add_global(self, name):
         name = self.mangle(name)
-        if self.uses.has_key(name) or self.defs.has_key(name):
+        if name in self.uses or name in self.defs:
             pass # XXX warn about global following def/use
-        if self.params.has_key(name):
+        if name in self.params:
             raise SyntaxError, "%s in %s is global and parameter" % \
                   (name, self.name)
         self.globals[name] = 1
@@ -90,14 +90,14 @@
 
         The scope of a name could be LOCAL, GLOBAL, FREE, or CELL.
         """
-        if self.globals.has_key(name):
+        if name in self.globals:
             return SC_REALLY_GLOBAL
-        if self.cells.has_key(name):
+        if name in self.cells:
             return SC_CELL
-        if self.defs.has_key(name):
+        if name in self.defs:
             return SC_LOCAL
-        if self.nested and (self.frees.has_key(name) or
-                            self.uses.has_key(name)):
+        if self.nested and (name in self.frees or
+                            name in self.uses):
             return SC_FREE
         if self.nested:
             return SC_UNKNOWN
@@ -110,8 +110,8 @@
         free = {}
         free.update(self.frees)
         for name in self.uses.keys():
-            if not (self.defs.has_key(name) or
-                    self.globals.has_key(name)):
+            if not (name in self.defs or
+                    name in self.globals):
                 free[name] = 1
         return free.keys()
 
@@ -136,7 +136,7 @@
         free.
         """
         self.globals[name] = 1
-        if self.frees.has_key(name):
+        if name in self.frees:
             del self.frees[name]
         for child in self.children:
             if child.check_name(name) == SC_FREE:

Modified: pypy/dist/pypy/interpreter/astcompiler/transformer.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/transformer.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/transformer.py	Wed Sep  7 19:41:12 2005
@@ -86,7 +86,7 @@
 
 def Node(*args):
     kind = args[0]
-    if nodes.has_key(kind):
+    if kind in nodes:
         try:
             return nodes[kind](*args[1:])
         except TypeError:

Modified: pypy/dist/pypy/interpreter/astcompiler/visitor.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/visitor.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/visitor.py	Wed Sep  7 19:41:12 2005
@@ -84,7 +84,7 @@
             meth(node, *args)
         elif self.VERBOSE > 0:
             klass = node.__class__
-            if not self.examples.has_key(klass):
+            if klass not in self.examples:
                 self.examples[klass] = klass
                 print
                 print self.visitor

Modified: pypy/dist/pypy/interpreter/pyparser/error.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/error.py	(original)
+++ pypy/dist/pypy/interpreter/pyparser/error.py	Wed Sep  7 19:41:12 2005
@@ -27,12 +27,12 @@
 class SyntaxError(Exception):
     """Base class for exceptions raised by the parser."""
 
-    def __init__(self, msg, lineno=0, offset=0, text=0):
+    def __init__(self, msg, lineno=0, offset=0, text="", filename=""):
         self.msg = msg
         self.lineno = lineno
         self.offset = offset
         self.text = text
-        self.filename = ""
+        self.filename = filename
         self.print_file_and_line = False
 
     def wrap_info(self, space, filename):



More information about the Pypy-commit mailing list