[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