[pypy-svn] r16695 - in pypy/release/0.7.x: lib-python/modified-2.4.1/test lib-python/modified-2.4.1/test/output pypy/interpreter/stablecompiler pypy/lib/_stablecompiler pypy/objspace

ludal at codespeak.net ludal at codespeak.net
Fri Aug 26 22:13:50 CEST 2005


Author: ludal
Date: Fri Aug 26 22:13:46 2005
New Revision: 16695

Added:
   pypy/release/0.7.x/lib-python/modified-2.4.1/test/test_compile.py
      - copied, changed from r16671, pypy/release/0.7.x/lib-python/2.4.1/test/test_compile.py
Modified:
   pypy/release/0.7.x/lib-python/modified-2.4.1/test/output/test_extcall
   pypy/release/0.7.x/lib-python/modified-2.4.1/test/test_unpack.py
   pypy/release/0.7.x/pypy/interpreter/stablecompiler/transformer.py
   pypy/release/0.7.x/pypy/lib/_stablecompiler/transformer.py
   pypy/release/0.7.x/pypy/objspace/descroperation.py
Log:
 + more work on compliance tests
   - adding/changing error messages
   - checking None and __debug__ assignments
   - from xxx import a,b,c, syntax checks
   - duplicate arguments in function/lambda defs
   - non-default after default arguments
   - 'iteration over non-sequence' error message 


Modified: pypy/release/0.7.x/lib-python/modified-2.4.1/test/output/test_extcall
==============================================================================
--- pypy/release/0.7.x/lib-python/modified-2.4.1/test/output/test_extcall	(original)
+++ pypy/release/0.7.x/lib-python/modified-2.4.1/test/output/test_extcall	Fri Aug 26 22:13:46 2005
@@ -25,8 +25,8 @@
 got multiple values for keyword argument 'a'
 keywords must be strings
 h() got an unexpected keyword argument 'e'
-object is not iter()-able
-object is not iter()-able
+iteration over non-sequence
+iteration over non-sequence
 object None is not callable
 argument after ** must be a dictionary
 argument after ** must be a dictionary

Modified: pypy/release/0.7.x/lib-python/modified-2.4.1/test/test_unpack.py
==============================================================================
--- pypy/release/0.7.x/lib-python/modified-2.4.1/test/test_unpack.py	(original)
+++ pypy/release/0.7.x/lib-python/modified-2.4.1/test/test_unpack.py	Fri Aug 26 22:13:46 2005
@@ -55,7 +55,7 @@
     >>> a, b, c = 7
     Traceback (most recent call last):
       ...
-    TypeError: object is not iter()-able
+    TypeError: iteration over non-sequence
 
 Unpacking tuple of wrong size
 

Modified: pypy/release/0.7.x/pypy/interpreter/stablecompiler/transformer.py
==============================================================================
--- pypy/release/0.7.x/pypy/interpreter/stablecompiler/transformer.py	(original)
+++ pypy/release/0.7.x/pypy/interpreter/stablecompiler/transformer.py	Fri Aug 26 22:13:46 2005
@@ -126,13 +126,19 @@
                                }
         self.encoding = None
 
-    def syntaxerror( self, msg, node ):
+    def syntaxerror(self, msg, node):
         offset = 0
-        text = "return x!"
+        text = ""
         lineno = extractLineNo( node )
         args = ( self.filename, lineno, offset, text )
         raise SyntaxError( msg, args )
 
+    def none_assignment_error(self, assigning, node):
+        if assigning==OP_DELETE:
+            self.syntaxerror( "deleting None", node )
+        else:
+            self.syntaxerror( "assignment to None", node )
+
     def transform(self, tree):
         """Transform an AST into a modified parse tree."""
         if not (isinstance(tree, tuple) or isinstance(tree, list)):
@@ -280,6 +286,8 @@
             assert isinstance(code, Stmt)
             assert isinstance(code.nodes[0], Discard)
             del code.nodes[0]
+        if name == "None":
+            self.none_assignment_error( OP_ASSIGN, nodelist[-4] )
         return Function(decorators, name, names, defaults, flags, doc, code,
                      lineno=lineno)
 
@@ -315,6 +323,8 @@
             assert isinstance(code.nodes[0], Discard)
             del code.nodes[0]
 
+        if name == "None":
+            self.none_assignment_error(OP_ASSIGN, nodelist[1])
         return Class(name, bases, doc, code, lineno=nodelist[1][2])
 
     def stmt(self, nodelist):
@@ -458,7 +468,12 @@
             return From(fromname, [('*', None)],
                         lineno=nodelist[0][2])
         else:
-            node = nodelist[3 + (nodelist[3][0] == token.LPAR)]
+            if nodelist[3][0] == token.LPAR:
+                node = nodelist[4]
+            else:
+                node = nodelist[3]
+                if node[-1][0] == token.COMMA:
+                    self.syntaxerror("trailing comma not allowed without surrounding parentheses", node)
             return From(fromname, self.com_import_as_names(node),
                         lineno=nodelist[0][2])
 
@@ -801,7 +816,11 @@
                 if node[0] == token.STAR:
                     node = nodelist[i+1]
                     if node[0] == token.NAME:
-                        names.append(node[1])
+                        name = node[1]
+                        if name in names:
+                            self.syntaxerror("duplicate argument '%s' in function definition" %
+                                             name, node)
+                        names.append(name)
                         flags = flags | CO_VARARGS
                         i = i + 3
 
@@ -812,28 +831,38 @@
                         node = nodelist[i+1]
                     else:
                         raise ValueError, "unexpected token: %s" % t
-                    names.append(node[1])
+                    name = node[1]
+                    if name in names:
+                        self.syntaxerror("duplicate argument '%s' in function definition" %
+                                         name, node)
+                    names.append(name)
                     flags = flags | CO_VARKEYWORDS
 
                 break
 
             # fpdef: NAME | '(' fplist ')'
-            names.append(self.com_fpdef(node))
+            name = self.com_fpdef(node)
+            if name in names:
+                self.syntaxerror("duplicate argument '%s' in function definition" %
+                                         name, node)
+            names.append(name)
 
             i = i + 1
             if i >= len(nodelist):
+                if len(defaults):
+                    self.syntaxerror("non-default argument follows default argument",node)
                 break
-
+            
             if nodelist[i][0] == token.EQUAL:
                 defaults.append(self.com_node(nodelist[i + 1]))
                 i = i + 2
             elif len(defaults):
-                # XXX This should be a syntax error.
-                # Treat "(a=1, b)" as "(a=1, b=None)"
-                defaults.append(Const(None))
+                self.syntaxerror("non-default argument follows default argument",node)
 
             i = i + 1
 
+        if "None" in names:
+            self.syntaxerror( "Invalid syntax.  Assignment to None.", node)
         return names, defaults, flags
 
     def com_fpdef(self, node):
@@ -942,6 +971,11 @@
         Names, slices, and attributes are the only allowable nodes.
         """
         l = self.com_node(node)
+        if isinstance(l, Name):
+            if l.name == "__debug__":
+                self.syntaxerror( "can not assign to __debug__", node )
+            if l.name == "None":
+                self.none_assignment_error( OP_ASSIGN, node )
         if l.__class__ in (Name, Slice, Subscript, Getattr):
             return l
         self.syntaxerror( "can't assign to %s" % l.__class__.__name__, node)
@@ -984,6 +1018,10 @@
                         self.syntaxerror( "can't assign to []", node)
                     return self.com_assign_list(node, assigning)
                 elif t == token.NAME:
+                    if node[1][1] == "__debug__":
+                        self.syntaxerror( "can not assign to __debug__", node )
+                    if node[1][1] == "None":
+                        self.none_assignment_error(assigning, node)
                     return self.com_assign_name(node[1], assigning)
                 else:
                     self.syntaxerror( "can't assign to literal", node)
@@ -1026,6 +1064,8 @@
         self.syntaxerror( "unknown trailer type: %s" % t, node)
 
     def com_assign_attr(self, primary, node, assigning):
+        if node[1]=="None":
+            self.none_assignment_error(assigning, node)
         return AssAttr(primary, node[1], assigning, lineno=node[-1])
 
     def com_binary(self, constructor, nodelist):

Modified: pypy/release/0.7.x/pypy/lib/_stablecompiler/transformer.py
==============================================================================
--- pypy/release/0.7.x/pypy/lib/_stablecompiler/transformer.py	(original)
+++ pypy/release/0.7.x/pypy/lib/_stablecompiler/transformer.py	Fri Aug 26 22:13:46 2005
@@ -123,13 +123,19 @@
                                }
         self.encoding = None
 
-    def syntaxerror( self, msg, node ):
+    def syntaxerror(self, msg, node):
         offset = 0
-        text = "return x!"
+        text = ""
         lineno = extractLineNo( node )
         args = ( self.filename, lineno, offset, text )
         raise SyntaxError( msg, args )
 
+    def none_assignment_error(self, assigning, node):
+        if assigning==OP_DELETE:
+            self.syntaxerror( "deleting None", node )
+        else:
+            self.syntaxerror( "assignment to None", node )
+
     def transform(self, tree):
         """Transform an AST into a modified parse tree."""
         if not (isinstance(tree, tuple) or isinstance(tree, list)):
@@ -277,6 +283,8 @@
             assert isinstance(code, Stmt)
             assert isinstance(code.nodes[0], Discard)
             del code.nodes[0]
+        if name == "None":
+            self.none_assignment_error( OP_ASSIGN, nodelist[-4] )
         return Function(decorators, name, names, defaults, flags, doc, code,
                      lineno=lineno)
 
@@ -312,6 +320,8 @@
             assert isinstance(code.nodes[0], Discard)
             del code.nodes[0]
 
+        if name == "None":
+            self.none_assignment_error(OP_ASSIGN, nodelist[1])
         return Class(name, bases, doc, code, lineno=nodelist[1][2])
 
     def stmt(self, nodelist):
@@ -455,7 +465,12 @@
             return From(fromname, [('*', None)],
                         lineno=nodelist[0][2])
         else:
-            node = nodelist[3 + (nodelist[3][0] == token.LPAR)]
+            if nodelist[3][0] == token.LPAR:
+                node = nodelist[4]
+            else:
+                node = nodelist[3]
+                if node[-1][0] == token.COMMA:
+                    self.syntaxerror("trailing comma not allowed without surrounding parentheses", node)
             return From(fromname, self.com_import_as_names(node),
                         lineno=nodelist[0][2])
 
@@ -797,7 +812,11 @@
                 if node[0] == token.STAR:
                     node = nodelist[i+1]
                     if node[0] == token.NAME:
-                        names.append(node[1])
+                        name = node[1]
+                        if name in names:
+                            self.syntaxerror("duplicate argument '%s' in function definition" %
+                                             name, node)
+                        names.append(name)
                         flags = flags | CO_VARARGS
                         i = i + 3
 
@@ -808,28 +827,38 @@
                         node = nodelist[i+1]
                     else:
                         raise ValueError, "unexpected token: %s" % t
-                    names.append(node[1])
+                    name = node[1]
+                    if name in names:
+                        self.syntaxerror("duplicate argument '%s' in function definition" %
+                                         name, node)
+                    names.append(name)
                     flags = flags | CO_VARKEYWORDS
 
                 break
 
             # fpdef: NAME | '(' fplist ')'
-            names.append(self.com_fpdef(node))
+            name = self.com_fpdef(node)
+            if name in names:
+                self.syntaxerror("duplicate argument '%s' in function definition" %
+                                         name, node)
+            names.append(name)
 
             i = i + 1
             if i >= len(nodelist):
+                if len(defaults):
+                    self.syntaxerror("non-default argument follows default argument",node)
                 break
-
+            
             if nodelist[i][0] == token.EQUAL:
                 defaults.append(self.com_node(nodelist[i + 1]))
                 i = i + 2
             elif len(defaults):
-                # XXX This should be a syntax error.
-                # Treat "(a=1, b)" as "(a=1, b=None)"
-                defaults.append(Const(None))
+                self.syntaxerror("non-default argument follows default argument",node)
 
             i = i + 1
 
+        if "None" in names:
+            self.syntaxerror( "Invalid syntax.  Assignment to None.", node)
         return names, defaults, flags
 
     def com_fpdef(self, node):
@@ -938,6 +967,11 @@
         Names, slices, and attributes are the only allowable nodes.
         """
         l = self.com_node(node)
+        if isinstance(l, Name):
+            if l.name == "__debug__":
+                self.syntaxerror( "can not assign to __debug__", node )
+            if l.name == "None":
+                self.none_assignment_error( OP_ASSIGN, node )
         if l.__class__ in (Name, Slice, Subscript, Getattr):
             return l
         self.syntaxerror( "can't assign to %s" % l.__class__.__name__, node)
@@ -980,6 +1014,10 @@
                         self.syntaxerror( "can't assign to []", node)
                     return self.com_assign_list(node, assigning)
                 elif t == token.NAME:
+                    if node[1][1] == "__debug__":
+                        self.syntaxerror( "can not assign to __debug__", node )
+                    if node[1][1] == "None":
+                        self.none_assignment_error(assigning, node)
                     return self.com_assign_name(node[1], assigning)
                 else:
                     self.syntaxerror( "can't assign to literal", node)
@@ -1022,6 +1060,8 @@
         self.syntaxerror( "unknown trailer type: %s" % t, node)
 
     def com_assign_attr(self, primary, node, assigning):
+        if node[1]=="None":
+            self.none_assignment_error(assigning, node)
         return AssAttr(primary, node[1], assigning, lineno=node[-1])
 
     def com_binary(self, constructor, nodelist):

Modified: pypy/release/0.7.x/pypy/objspace/descroperation.py
==============================================================================
--- pypy/release/0.7.x/pypy/objspace/descroperation.py	(original)
+++ pypy/release/0.7.x/pypy/objspace/descroperation.py	Fri Aug 26 22:13:46 2005
@@ -177,7 +177,7 @@
             w_descr = space.lookup(w_obj, '__getitem__')
             if w_descr is None:
                 raise OperationError(space.w_TypeError,
-                                     space.wrap("object is not iter()-able"))
+                                     space.wrap("iteration over non-sequence"))
             return space.newseqiter(w_obj)
         return space.get_and_call_function(w_descr, w_obj)
 



More information about the Pypy-commit mailing list