[pypy-svn] r16642 - in pypy/release/0.7.x/pypy: interpreter interpreter/stablecompiler lib/_stablecompiler

ludal at codespeak.net ludal at codespeak.net
Fri Aug 26 17:28:05 CEST 2005


Author: ludal
Date: Fri Aug 26 17:28:01 2005
New Revision: 16642

Modified:
   pypy/release/0.7.x/pypy/interpreter/pycompiler.py
   pypy/release/0.7.x/pypy/interpreter/stablecompiler/transformer.py
   pypy/release/0.7.x/pypy/lib/_stablecompiler/apphook.py
   pypy/release/0.7.x/pypy/lib/_stablecompiler/transformer.py
Log:
 - hopefully fix (or include) some line numbers in error reporting
 - better translate syntax errors from the parser
 - fixes both stable and _stable compilers


Modified: pypy/release/0.7.x/pypy/interpreter/pycompiler.py
==============================================================================
--- pypy/release/0.7.x/pypy/interpreter/pycompiler.py	(original)
+++ pypy/release/0.7.x/pypy/interpreter/pycompiler.py	Fri Aug 26 17:28:01 2005
@@ -194,8 +194,13 @@
         try:
             parse_result = internal_pypy_parse(source, mode, True, flags)
         except ParseError, e:
-            raise OperationError(space.w_SyntaxError,
-                                 e.wrap_info(space, filename))
+            w_synerr = space.newtuple([space.wrap(e.msg),
+                                       space.newtuple([space.wrap(filename),
+                                                       space.wrap(e.lineno),
+                                                       space.wrap(e.offset),
+                                                       space.wrap("")
+                                                       ])])
+            raise OperationError(space.w_SyntaxError, w_synerr)            
         return self.compile_parse_result(parse_result, filename, mode, flags)
 
     def compile_parse_result(self, parse_result, filename, mode, flags):
@@ -213,7 +218,7 @@
         from pypy.interpreter.stablecompiler.transformer import Transformer
         space = self.space
         try:
-            transformer = Transformer()
+            transformer = Transformer(filename)
             tree = transformer.compile_node(tuples)
             stablecompiler.misc.set_filename(filename, tree)
             flag_names = get_flag_names( flags )
@@ -420,8 +425,17 @@
                                                        space.wrap(e.offset),
                                                        space.wrap(e.text)])])
             raise OperationError(space.w_SyntaxError, w_synerr)
+	except UnicodeDecodeError, e:
+            # TODO use a custom UnicodeError
+            raise OperationError(space.w_UnicodeDecodeError, space.newtuple([
+                                 space.wrap(e.encoding), space.wrap(e.object), space.wrap(e.start),
+                                 space.wrap(e.end), space.wrap(e.reason)]))
         except ValueError,e:
-            raise OperationError(space.w_ValueError,space.wrap(str(e)))
+            if e.__class__ != ValueError:
+                 extra_msg = "(Really go %s)" % e.__class__.__name__
+            else:
+                extra_msg = ""
+            raise OperationError(space.w_ValueError,space.wrap(str(e)+extra_msg))
         except TypeError,e:
             raise
             raise OperationError(space.w_TypeError,space.wrap(str(e)))

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 17:28:01 2005
@@ -109,8 +109,9 @@
         tree = parsefile(fileob | filename)
     """
 
-    def __init__(self):
+    def __init__(self, filename):
         self._dispatch = {}
+        self.filename = filename
         for value, name in symbol.sym_name.items():
             if hasattr(self, name):
                 self._dispatch[value] = getattr(self, name)
@@ -125,6 +126,13 @@
                                }
         self.encoding = None
 
+    def syntaxerror( self, msg, node ):
+        offset = 0
+        text = "return x!"
+        lineno = extractLineNo( node )
+        args = ( self.filename, lineno, offset, text )
+        raise SyntaxError( msg, args )
+
     def transform(self, tree):
         """Transform an AST into a modified parse tree."""
         if not (isinstance(tree, tuple) or isinstance(tree, list)):
@@ -936,7 +944,7 @@
         l = self.com_node(node)
         if l.__class__ in (Name, Slice, Subscript, Getattr):
             return l
-        raise SyntaxError, "can't assign to %s" % l.__class__.__name__
+        self.syntaxerror( "can't assign to %s" % l.__class__.__name__, node)
 
     def com_assign(self, node, assigning):
         # return a node suitable for use as an "lvalue"
@@ -949,17 +957,17 @@
                 node = node[1]
             elif t in _assign_types:
                 if len(node) > 2:
-                    raise SyntaxError, "can't assign to operator"
+                    self.syntaxerror( "can't assign to operator", node)
                 node = node[1]
             elif t == symbol.power:
                 if node[1][0] != symbol.atom:
-                    raise SyntaxError, "can't assign to operator"
+                    self.syntaxerror( "can't assign to operator", node)
                 if len(node) > 2:
                     primary = self.com_node(node[1])
                     for i in range(2, len(node)-1):
                         ch = node[i]
                         if ch[0] == token.DOUBLESTAR:
-                            raise SyntaxError, "can't assign to operator"
+                            self.syntaxerror( "can't assign to operator", node)
                         primary = self.com_apply_trailer(primary, ch)
                     return self.com_assign_trailer(primary, node[-1],
                                                    assigning)
@@ -969,24 +977,24 @@
                 if t == token.LPAR:
                     node = node[2]
                     if node[0] == token.RPAR:
-                        raise SyntaxError, "can't assign to ()"
+                        self.syntaxerror( "can't assign to ()", node)
                 elif t == token.LSQB:
                     node = node[2]
                     if node[0] == token.RSQB:
-                        raise SyntaxError, "can't assign to []"
+                        self.syntaxerror( "can't assign to []", node)
                     return self.com_assign_list(node, assigning)
                 elif t == token.NAME:
                     return self.com_assign_name(node[1], assigning)
                 else:
-                    raise SyntaxError, "can't assign to literal"
+                    self.syntaxerror( "can't assign to literal", node)
             else:
-                raise SyntaxError, "bad assignment"
+                self.syntaxerror( "bad assignment", node)
 
     def com_assign_tuple(self, node, assigning):
         assigns = []
         if len(node)>=3:
             if node[2][0] == symbol.gen_for:
-                raise SyntaxError("assign to generator expression not possible")
+                self.syntaxerror("assign to generator expression not possible", node)
         for i in range(1, len(node), 2):
             assigns.append(self.com_assign(node[i], assigning))
         return AssTuple(assigns, lineno=extractLineNo(node))
@@ -996,7 +1004,7 @@
         for i in range(1, len(node), 2):
             if i + 1 < len(node):
                 if node[i + 1][0] == symbol.list_for:
-                    raise SyntaxError, "can't assign to list comprehension"
+                    self.syntaxerror( "can't assign to list comprehension", node)
                 assert node[i + 1][0] == token.COMMA, node[i + 1]
             assigns.append(self.com_assign(node[i], assigning))
         return AssList(assigns, lineno=extractLineNo(node))
@@ -1012,10 +1020,10 @@
             return self.com_subscriptlist(primary, node[2], assigning)
         if t == token.LPAR:
             if assigning==OP_DELETE:
-                raise SyntaxError, "can't delete function call"
+                self.syntaxerror( "can't delete function call", node)
             else:
-                raise SyntaxError, "can't assign to function call"
-        raise SyntaxError, "unknown trailer type: %s" % t
+                self.syntaxerror( "can't assign to function call", node)
+        self.syntaxerror( "unknown trailer type: %s" % t, node)
 
     def com_assign_attr(self, primary, node, assigning):
         return AssAttr(primary, node[1], assigning, lineno=node[-1])
@@ -1091,9 +1099,9 @@
                     else:
                         node = self.com_list_iter(node[3])
                 else:
-                    raise SyntaxError, \
-                          ("unexpected list comprehension element: %s %d"
-                           % (node, lineno))
+                    self.syntaxerror(
+                        "unexpected list comprehension element: %s %d"
+                        % (node, lineno), node)
             return ListComp(expr, fors, lineno=lineno)
 
         def com_list_iter(self, node):
@@ -1135,9 +1143,9 @@
                     else:
                         node = self.com_gen_iter(node[3])
                 else:
-                    raise SyntaxError, \
-                            ("unexpected generator expression element: %s %d"
-                             % (node, lineno))
+                    self.syntaxerror(
+                        "unexpected generator expression element: %s %d"
+                        % (node, lineno), node)
             fors[0].is_outmost = True
             return GenExpr(GenExprInner(expr, fors), lineno=lineno)
 
@@ -1162,11 +1170,11 @@
         if t == token.LSQB:
             return self.com_subscriptlist(primaryNode, nodelist[2], OP_APPLY)
 
-        raise SyntaxError, 'unknown node type: %s' % t
+        self.syntaxerror( 'unknown node type: %s' % t, primaryNode)
 
     def com_select_member(self, primaryNode, nodelist):
         if nodelist[0] != token.NAME:
-            raise SyntaxError, "member must be a name"
+            self.syntaxerror( "member must be a name", primaryNode)
         return Getattr(primaryNode, nodelist[1], lineno=nodelist[2])
 
     def com_call_function(self, primaryNode, nodelist):
@@ -1185,7 +1193,7 @@
                and len(node) == 3 and node[2][0] == symbol.gen_for:
                 # allow f(x for x in y), but reject f(x for x in y, 1)
                 # should use f((x for x in y), 1) instead of f(x for x in y, 1)
-                raise SyntaxError, 'generator expression needs parenthesis'
+                self.syntaxerror( 'generator expression needs parenthesis', primaryNode)
 
             args.append(result)
         else:
@@ -1201,14 +1209,14 @@
             i = i + 3
             if tok[0]==token.STAR:
                 if star_node is not None:
-                    raise SyntaxError, 'already have the varargs indentifier'
+                    self.syntaxerror( 'already have the varargs indentifier', primaryNode)
                 star_node = self.com_node(ch)
             elif tok[0]==token.DOUBLESTAR:
                 if dstar_node is not None:
-                    raise SyntaxError, 'already have the kwargs indentifier'
+                    self.syntaxerror( 'already have the kwargs indentifier', primaryNode)
                 dstar_node = self.com_node(ch)
             else:
-                raise SyntaxError, 'unknown node type: %s' % tok
+                self.syntaxerror( 'unknown node type: %s' % tok, primaryNode)
         return CallFunc(primaryNode, args, star_node, dstar_node,
                         lineno=extractLineNo(nodelist))
 
@@ -1218,14 +1226,14 @@
             return 0, self.com_generator_expression(test, nodelist[2])
         if len(nodelist) == 2:
             if kw:
-                raise SyntaxError, "non-keyword arg after keyword arg"
+                self.syntaxerror( "non-keyword arg after keyword arg", nodelist[0])
             return 0, self.com_node(nodelist[1])
         result = self.com_node(nodelist[3])
         n = nodelist[1]
         while len(n) == 2 and n[0] != token.NAME:
             n = n[1]
         if n[0] != token.NAME:
-            raise SyntaxError, "keyword can't be an expression (%s)"%n[0]
+            self.syntaxerror( "keyword can't be an expression (%s)"%n[0], n)
         node = Keyword(n[1], result, lineno=n[2])
         return 1, node
 

Modified: pypy/release/0.7.x/pypy/lib/_stablecompiler/apphook.py
==============================================================================
--- pypy/release/0.7.x/pypy/lib/_stablecompiler/apphook.py	(original)
+++ pypy/release/0.7.x/pypy/lib/_stablecompiler/apphook.py	Fri Aug 26 17:28:01 2005
@@ -10,7 +10,7 @@
 from _stablecompiler.transformer import Transformer
 
 def applevelcompile(tuples, filename, mode, flag_names ):
-    transformer = Transformer()
+    transformer = Transformer(filename)
     tree = transformer.compile_node(tuples)
     set_filename(filename, tree)
     if mode == 'exec':

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 17:28:01 2005
@@ -106,8 +106,9 @@
         tree = parsefile(fileob | filename)
     """
 
-    def __init__(self):
+    def __init__(self, filename):
         self._dispatch = {}
+        self.filename = filename
         for value, name in symbol.sym_name.items():
             if hasattr(self, name):
                 self._dispatch[value] = getattr(self, name)
@@ -122,6 +123,13 @@
                                }
         self.encoding = None
 
+    def syntaxerror( self, msg, node ):
+        offset = 0
+        text = "return x!"
+        lineno = extractLineNo( node )
+        args = ( self.filename, lineno, offset, text )
+        raise SyntaxError( msg, args )
+
     def transform(self, tree):
         """Transform an AST into a modified parse tree."""
         if not (isinstance(tree, tuple) or isinstance(tree, list)):
@@ -932,7 +940,7 @@
         l = self.com_node(node)
         if l.__class__ in (Name, Slice, Subscript, Getattr):
             return l
-        raise SyntaxError, "can't assign to %s" % l.__class__.__name__
+        self.syntaxerror( "can't assign to %s" % l.__class__.__name__, node)
 
     def com_assign(self, node, assigning):
         # return a node suitable for use as an "lvalue"
@@ -945,17 +953,17 @@
                 node = node[1]
             elif t in _assign_types:
                 if len(node) > 2:
-                    raise SyntaxError, "can't assign to operator"
+                    self.syntaxerror( "can't assign to operator", node)
                 node = node[1]
             elif t == symbol.power:
                 if node[1][0] != symbol.atom:
-                    raise SyntaxError, "can't assign to operator"
+                    self.syntaxerror( "can't assign to operator", node)
                 if len(node) > 2:
                     primary = self.com_node(node[1])
                     for i in range(2, len(node)-1):
                         ch = node[i]
                         if ch[0] == token.DOUBLESTAR:
-                            raise SyntaxError, "can't assign to operator"
+                            self.syntaxerror( "can't assign to operator", node)
                         primary = self.com_apply_trailer(primary, ch)
                     return self.com_assign_trailer(primary, node[-1],
                                                    assigning)
@@ -965,24 +973,24 @@
                 if t == token.LPAR:
                     node = node[2]
                     if node[0] == token.RPAR:
-                        raise SyntaxError, "can't assign to ()"
+                        self.syntaxerror( "can't assign to ()", node)
                 elif t == token.LSQB:
                     node = node[2]
                     if node[0] == token.RSQB:
-                        raise SyntaxError, "can't assign to []"
+                        self.syntaxerror( "can't assign to []", node)
                     return self.com_assign_list(node, assigning)
                 elif t == token.NAME:
                     return self.com_assign_name(node[1], assigning)
                 else:
-                    raise SyntaxError, "can't assign to literal"
+                    self.syntaxerror( "can't assign to literal", node)
             else:
-                raise SyntaxError, "bad assignment"
+                self.syntaxerror( "bad assignment", node)
 
     def com_assign_tuple(self, node, assigning):
         assigns = []
         if len(node)>=3:
             if node[2][0] == symbol.gen_for:
-                raise SyntaxError("assign to generator expression not possible")
+                self.syntaxerror("assign to generator expression not possible", node)
         for i in range(1, len(node), 2):
             assigns.append(self.com_assign(node[i], assigning))
         return AssTuple(assigns, lineno=extractLineNo(node))
@@ -992,7 +1000,7 @@
         for i in range(1, len(node), 2):
             if i + 1 < len(node):
                 if node[i + 1][0] == symbol.list_for:
-                    raise SyntaxError, "can't assign to list comprehension"
+                    self.syntaxerror( "can't assign to list comprehension", node)
                 assert node[i + 1][0] == token.COMMA, node[i + 1]
             assigns.append(self.com_assign(node[i], assigning))
         return AssList(assigns, lineno=extractLineNo(node))
@@ -1008,10 +1016,10 @@
             return self.com_subscriptlist(primary, node[2], assigning)
         if t == token.LPAR:
             if assigning==OP_DELETE:
-                raise SyntaxError, "can't delete function call"
+                self.syntaxerror( "can't delete function call", node)
             else:
-                raise SyntaxError, "can't assign to function call"
-        raise SyntaxError, "unknown trailer type: %s" % t
+                self.syntaxerror( "can't assign to function call", node)
+        self.syntaxerror( "unknown trailer type: %s" % t, node)
 
     def com_assign_attr(self, primary, node, assigning):
         return AssAttr(primary, node[1], assigning, lineno=node[-1])
@@ -1087,9 +1095,9 @@
                     else:
                         node = self.com_list_iter(node[3])
                 else:
-                    raise SyntaxError, \
-                          ("unexpected list comprehension element: %s %d"
-                           % (node, lineno))
+                    self.syntaxerror(
+                        "unexpected list comprehension element: %s %d"
+                        % (node, lineno), node)
             return ListComp(expr, fors, lineno=lineno)
 
         def com_list_iter(self, node):
@@ -1131,9 +1139,9 @@
                     else:
                         node = self.com_gen_iter(node[3])
                 else:
-                    raise SyntaxError, \
-                            ("unexpected generator expression element: %s %d"
-                             % (node, lineno))
+                    self.syntaxerror(
+                        "unexpected generator expression element: %s %d"
+                        % (node, lineno), node)
             fors[0].is_outmost = True
             return GenExpr(GenExprInner(expr, fors), lineno=lineno)
 
@@ -1158,11 +1166,11 @@
         if t == token.LSQB:
             return self.com_subscriptlist(primaryNode, nodelist[2], OP_APPLY)
 
-        raise SyntaxError, 'unknown node type: %s' % t
+        self.syntaxerror( 'unknown node type: %s' % t, primaryNode)
 
     def com_select_member(self, primaryNode, nodelist):
         if nodelist[0] != token.NAME:
-            raise SyntaxError, "member must be a name"
+            self.syntaxerror( "member must be a name", primaryNode)
         return Getattr(primaryNode, nodelist[1], lineno=nodelist[2])
 
     def com_call_function(self, primaryNode, nodelist):
@@ -1181,7 +1189,7 @@
                and len(node) == 3 and node[2][0] == symbol.gen_for:
                 # allow f(x for x in y), but reject f(x for x in y, 1)
                 # should use f((x for x in y), 1) instead of f(x for x in y, 1)
-                raise SyntaxError, 'generator expression needs parenthesis'
+                self.syntaxerror( 'generator expression needs parenthesis', primaryNode)
 
             args.append(result)
         else:
@@ -1197,14 +1205,14 @@
             i = i + 3
             if tok[0]==token.STAR:
                 if star_node is not None:
-                    raise SyntaxError, 'already have the varargs indentifier'
+                    self.syntaxerror( 'already have the varargs indentifier', primaryNode)
                 star_node = self.com_node(ch)
             elif tok[0]==token.DOUBLESTAR:
                 if dstar_node is not None:
-                    raise SyntaxError, 'already have the kwargs indentifier'
+                    self.syntaxerror( 'already have the kwargs indentifier', primaryNode)
                 dstar_node = self.com_node(ch)
             else:
-                raise SyntaxError, 'unknown node type: %s' % tok
+                self.syntaxerror( 'unknown node type: %s' % tok, primaryNode)
         return CallFunc(primaryNode, args, star_node, dstar_node,
                         lineno=extractLineNo(nodelist))
 
@@ -1214,14 +1222,14 @@
             return 0, self.com_generator_expression(test, nodelist[2])
         if len(nodelist) == 2:
             if kw:
-                raise SyntaxError, "non-keyword arg after keyword arg"
+                self.syntaxerror( "non-keyword arg after keyword arg", nodelist[0])
             return 0, self.com_node(nodelist[1])
         result = self.com_node(nodelist[3])
         n = nodelist[1]
         while len(n) == 2 and n[0] != token.NAME:
             n = n[1]
         if n[0] != token.NAME:
-            raise SyntaxError, "keyword can't be an expression (%s)"%n[0]
+            self.syntaxerror( "keyword can't be an expression (%s)"%n[0], n)
         node = Keyword(n[1], result, lineno=n[2])
         return 1, node
 



More information about the Pypy-commit mailing list