[pypy-commit] pypy py3k: Add "raise ex2 from ex1" syntax (the from clause is not really used yet)

amauryfa noreply at buildbot.pypy.org
Thu Oct 13 22:40:15 CEST 2011


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: py3k
Changeset: r48023:689baa45b402
Date: 2011-10-13 22:38 +0200
http://bitbucket.org/pypy/pypy/changeset/689baa45b402/

Log:	Add "raise ex2 from ex1" syntax (the from clause is not really used
	yet)
	- Replace old "raise type, message" syntax
	- various fixes around string conversions

diff --git a/lib_pypy/_collections.py b/lib_pypy/_collections.py
--- a/lib_pypy/_collections.py
+++ b/lib_pypy/_collections.py
@@ -94,7 +94,7 @@
 
     def pop(self):
         if self.left is self.right and self.leftndx > self.rightndx:
-            raise IndexError, "pop from an empty deque"
+            raise IndexError("pop from an empty deque")
         x = self.right[self.rightndx]
         self.right[self.rightndx] = None
         self.length -= 1
@@ -115,7 +115,7 @@
 
     def popleft(self):
         if self.left is self.right and self.leftndx > self.rightndx:
-            raise IndexError, "pop from an empty deque"
+            raise IndexError("pop from an empty deque")
         x = self.left[self.leftndx]
         self.left[self.leftndx] = None
         self.length -= 1
@@ -313,7 +313,7 @@
         return type(self), (list(self), self.maxlen)
 
     def __hash__(self):
-        raise TypeError, "deque objects are unhashable"
+        raise TypeError("deque objects are unhashable")
 
     def __copy__(self):
         return self.__class__(self, self.maxlen)
@@ -365,7 +365,7 @@
         self.counter = len(deq)
         def giveup():
             self.counter = 0
-            raise RuntimeError, "deque mutated during iteration"
+            raise RuntimeError("deque mutated during iteration")
         self._gen = itergen(deq.state, giveup)
 
     def next(self):
diff --git a/lib_pypy/itertools.py b/lib_pypy/itertools.py
--- a/lib_pypy/itertools.py
+++ b/lib_pypy/itertools.py
@@ -377,7 +377,7 @@
             self.step = 1
         if self.start<0 or (self.stop is not None and self.stop<0
            ) or self.step<=0:
-            raise ValueError, "indices for islice() must be positive"
+            raise ValueError("indices for islice() must be positive")
         self.it = iter(iterable)
         self.donext = None
         self.cnt = 0
diff --git a/lib_pypy/struct.py b/lib_pypy/struct.py
--- a/lib_pypy/struct.py
+++ b/lib_pypy/struct.py
@@ -81,18 +81,18 @@
 
 def pack_signed_int(number,size,le):
     if not isinstance(number, (int,long)):
-        raise StructError,"argument for i,I,l,L,q,Q,h,H must be integer"
+        raise StructError("argument for i,I,l,L,q,Q,h,H must be integer")
     if  number > 2**(8*size-1)-1 or number < -1*2**(8*size-1):
-        raise OverflowError,"Number:%i too large to convert" % number
+        raise OverflowError("Number:%i too large to convert" % number)
     return pack_int(number,size,le)
 
 def pack_unsigned_int(number,size,le):
     if not isinstance(number, (int,long)):
-        raise StructError,"argument for i,I,l,L,q,Q,h,H must be integer"
+        raise StructError("argument for i,I,l,L,q,Q,h,H must be integer")
     if number < 0:
-        raise TypeError,"can't convert negative long to unsigned"
+        raise TypeError("can't convert negative long to unsigned")
     if number > 2**(8*size)-1:
-        raise OverflowError,"Number:%i too large to convert" % number
+        raise OverflowError("Number:%i too large to convert" % number)
     return pack_int(number,size,le)
 
 def pack_char(char,size,le):
@@ -296,7 +296,7 @@
         try:
             format = formatdef[cur]
         except KeyError:
-            raise StructError,"%s is not a valid format"%cur
+            raise StructError("%s is not a valid format" % cur)
         if num != None :
             result += num*format['size']
         else:
@@ -319,7 +319,7 @@
         try:
             format = formatdef[cur]
         except KeyError:
-            raise StructError,"%s is not a valid format"%cur
+            raise StructError("%s is not a valid format" % cur)
         if num == None :
             num_s = 0
             num = 1
@@ -334,7 +334,7 @@
                 result += [args[0][:num] + '\0'*padding]
                 args.pop(0)
             else:
-                raise StructError,"arg for string format not a string"
+                raise StructError("arg for string format not a string")
         elif cur == 'p':
             if isinstance(args[0], str):
                 padding = num - len(args[0]) - 1
@@ -348,18 +348,18 @@
                         result += [chr(255) + args[0][:num-1]]
                 args.pop(0)
             else:
-                raise StructError,"arg for string format not a string"
+                raise StructError("arg for string format not a string")
 
         else:
             if len(args) < num:
-                raise StructError,"insufficient arguments to pack"
+                raise StructError("insufficient arguments to pack")
             for var in args[:num]:
                 result += [format['pack'](var,format['size'],endianness)]
             args=args[num:]
         num = None
         i += 1
     if len(args) != 0:
-        raise StructError,"too many arguments for pack format"
+        raise StructError("too many arguments for pack format")
     return ''.join(result)
 
 def unpack(fmt,data):
@@ -373,7 +373,7 @@
     result = []
     length= calcsize(fmt)
     if length != len (data):
-        raise StructError,"unpack str size does not match format"
+        raise StructError("unpack str size does not match format")
     while i<len(fmt):
         num,i=getNum(fmt,i)
         cur = fmt[i]
@@ -381,7 +381,7 @@
         try:
             format = formatdef[cur]
         except KeyError:
-            raise StructError,"%s is not a valid format"%cur
+            raise StructError("%s is not a valid format" % cur)
 
         if not num :
             num = 1
diff --git a/pypy/interpreter/astcompiler/ast.py b/pypy/interpreter/astcompiler/ast.py
--- a/pypy/interpreter/astcompiler/ast.py
+++ b/pypy/interpreter/astcompiler/ast.py
@@ -723,44 +723,37 @@
 
 class Raise(stmt):
 
-    _lineno_mask = 8
-    _col_offset_mask = 16
-
-    def __init__(self, type, inst, tback, lineno, col_offset):
-        self.type = type
-        self.inst = inst
-        self.tback = tback
+    _lineno_mask = 4
+    _col_offset_mask = 8
+
+    def __init__(self, exc, cause, lineno, col_offset):
+        self.exc = exc
+        self.cause = cause
         stmt.__init__(self, lineno, col_offset)
-        self.initialization_state = 31
+        self.initialization_state = 15
 
     def walkabout(self, visitor):
         visitor.visit_Raise(self)
 
     def mutate_over(self, visitor):
-        if self.type:
-            self.type = self.type.mutate_over(visitor)
-        if self.inst:
-            self.inst = self.inst.mutate_over(visitor)
-        if self.tback:
-            self.tback = self.tback.mutate_over(visitor)
+        if self.exc:
+            self.exc = self.exc.mutate_over(visitor)
+        if self.cause:
+            self.cause = self.cause.mutate_over(visitor)
         return visitor.visit_Raise(self)
 
     def sync_app_attrs(self, space):
-        if (self.initialization_state & ~7) ^ 24:
-            missing_field(space, self.initialization_state, [None, None, None, 'lineno', 'col_offset'], 'Raise')
+        if (self.initialization_state & ~3) ^ 12:
+            missing_field(space, self.initialization_state, [None, None, 'lineno', 'col_offset'], 'Raise')
         else:
             if not self.initialization_state & 1:
-                self.type = None
+                self.exc = None
             if not self.initialization_state & 2:
-                self.inst = None
-            if not self.initialization_state & 4:
-                self.tback = None
-        if self.type:
-            self.type.sync_app_attrs(space)
-        if self.inst:
-            self.inst.sync_app_attrs(space)
-        if self.tback:
-            self.tback.sync_app_attrs(space)
+                self.cause = None
+        if self.exc:
+            self.exc.sync_app_attrs(space)
+        if self.cause:
+            self.cause.sync_app_attrs(space)
 
 
 class TryExcept(stmt):
@@ -2686,12 +2679,10 @@
         self.visit_sequence(node.body)
 
     def visit_Raise(self, node):
-        if node.type:
-            node.type.walkabout(self)
-        if node.inst:
-            node.inst.walkabout(self)
-        if node.tback:
-            node.tback.walkabout(self)
+        if node.exc:
+            node.exc.walkabout(self)
+        if node.cause:
+            node.cause.walkabout(self)
 
     def visit_TryExcept(self, node):
         self.visit_sequence(node.body)
@@ -3991,79 +3982,57 @@
     __init__=interp2app(With_init),
 )
 
-def Raise_get_type(space, w_self):
+def Raise_get_exc(space, w_self):
     if w_self.w_dict is not None:
-        w_obj = w_self.getdictvalue(space, 'type')
+        w_obj = w_self.getdictvalue(space, 'exc')
         if w_obj is not None:
             return w_obj
     if not w_self.initialization_state & 1:
         typename = space.type(w_self).getname(space)
-        w_err = space.wrap("'%s' object has no attribute 'type'" % typename)
+        w_err = space.wrap("'%s' object has no attribute 'exc'" % typename)
         raise OperationError(space.w_AttributeError, w_err)
-    return space.wrap(w_self.type)
-
-def Raise_set_type(space, w_self, w_new_value):
+    return space.wrap(w_self.exc)
+
+def Raise_set_exc(space, w_self, w_new_value):
     try:
-        w_self.type = space.interp_w(expr, w_new_value, True)
+        w_self.exc = space.interp_w(expr, w_new_value, True)
     except OperationError, e:
         if not e.match(space, space.w_TypeError):
             raise
-        w_self.setdictvalue(space, 'type', w_new_value)
+        w_self.setdictvalue(space, 'exc', w_new_value)
         return
-    w_self.deldictvalue(space, 'type')
+    w_self.deldictvalue(space, 'exc')
     w_self.initialization_state |= 1
 
-def Raise_get_inst(space, w_self):
+def Raise_get_cause(space, w_self):
     if w_self.w_dict is not None:
-        w_obj = w_self.getdictvalue(space, 'inst')
+        w_obj = w_self.getdictvalue(space, 'cause')
         if w_obj is not None:
             return w_obj
     if not w_self.initialization_state & 2:
         typename = space.type(w_self).getname(space)
-        w_err = space.wrap("'%s' object has no attribute 'inst'" % typename)
+        w_err = space.wrap("'%s' object has no attribute 'cause'" % typename)
         raise OperationError(space.w_AttributeError, w_err)
-    return space.wrap(w_self.inst)
-
-def Raise_set_inst(space, w_self, w_new_value):
+    return space.wrap(w_self.cause)
+
+def Raise_set_cause(space, w_self, w_new_value):
     try:
-        w_self.inst = space.interp_w(expr, w_new_value, True)
+        w_self.cause = space.interp_w(expr, w_new_value, True)
     except OperationError, e:
         if not e.match(space, space.w_TypeError):
             raise
-        w_self.setdictvalue(space, 'inst', w_new_value)
+        w_self.setdictvalue(space, 'cause', w_new_value)
         return
-    w_self.deldictvalue(space, 'inst')
+    w_self.deldictvalue(space, 'cause')
     w_self.initialization_state |= 2
 
-def Raise_get_tback(space, w_self):
-    if w_self.w_dict is not None:
-        w_obj = w_self.getdictvalue(space, 'tback')
-        if w_obj is not None:
-            return w_obj
-    if not w_self.initialization_state & 4:
-        typename = space.type(w_self).getname(space)
-        w_err = space.wrap("'%s' object has no attribute 'tback'" % typename)
-        raise OperationError(space.w_AttributeError, w_err)
-    return space.wrap(w_self.tback)
-
-def Raise_set_tback(space, w_self, w_new_value):
-    try:
-        w_self.tback = space.interp_w(expr, w_new_value, True)
-    except OperationError, e:
-        if not e.match(space, space.w_TypeError):
-            raise
-        w_self.setdictvalue(space, 'tback', w_new_value)
-        return
-    w_self.deldictvalue(space, 'tback')
-    w_self.initialization_state |= 4
-
-_Raise_field_unroller = unrolling_iterable(['type', 'inst', 'tback'])
+_Raise_field_unroller = unrolling_iterable(['exc', 'cause'])
 def Raise_init(space, w_self, __args__):
     w_self = space.descr_self_interp_w(Raise, w_self)
     args_w, kwargs_w = __args__.unpack()
     if args_w:
-        if len(args_w) != 3:
-            w_err = space.wrap("Raise constructor takes either 0 or 3 positional arguments")
+        if len(args_w) != 2:
+            w_err = space.wrap("Raise constructor takes either 0 or 2 positional arguments")
             raise OperationError(space.w_TypeError, w_err)
         i = 0
         for field in _Raise_field_unroller:
@@ -4075,10 +4044,9 @@
 Raise.typedef = typedef.TypeDef("Raise",
     stmt.typedef,
     __module__='_ast',
-    _fields=_FieldsWrapper(['type', 'inst', 'tback']),
-    type=typedef.GetSetProperty(Raise_get_type, Raise_set_type, cls=Raise),
-    inst=typedef.GetSetProperty(Raise_get_inst, Raise_set_inst, cls=Raise),
-    tback=typedef.GetSetProperty(Raise_get_tback, Raise_set_tback, cls=Raise),
+    _fields=_FieldsWrapper(['exc', 'cause']),
+    exc=typedef.GetSetProperty(Raise_get_exc, Raise_set_exc, cls=Raise),
+    cause=typedef.GetSetProperty(Raise_get_cause, Raise_set_cause, cls=Raise),
     __new__=interp2app(get_AST_new(Raise)),
     __init__=interp2app(Raise_init),
 )
diff --git a/pypy/interpreter/astcompiler/astbuilder.py b/pypy/interpreter/astcompiler/astbuilder.py
--- a/pypy/interpreter/astcompiler/astbuilder.py
+++ b/pypy/interpreter/astcompiler/astbuilder.py
@@ -149,17 +149,13 @@
             return ast.Return(values, flow_node.lineno, flow_node.column)
         elif first_child_type == syms.raise_stmt:
             exc = None
-            value = None
-            traceback = None
+            cause = None
             child_count = len(first_child.children)
             if child_count >= 2:
                 exc = self.handle_expr(first_child.children[1])
             if child_count >= 4:
-                value = self.handle_expr(first_child.children[3])
-            if child_count == 6:
-                traceback = self.handle_expr(first_child.children[5])
-            return ast.Raise(exc, value, traceback, flow_node.lineno,
-                             flow_node.column)
+                cause = self.handle_expr(first_child.children[3])
+            return ast.Raise(exc, cause, flow_node.lineno, flow_node.column)
         else:
             raise AssertionError("unknown flow statement")
 
diff --git a/pypy/interpreter/astcompiler/codegen.py b/pypy/interpreter/astcompiler/codegen.py
--- a/pypy/interpreter/astcompiler/codegen.py
+++ b/pypy/interpreter/astcompiler/codegen.py
@@ -746,15 +746,12 @@
     def visit_Raise(self, rais):
         self.update_position(rais.lineno, True)
         arg = 0
-        if rais.type:
-            rais.type.walkabout(self)
+        if rais.exc:
+            rais.exc.walkabout(self)
             arg += 1
-            if rais.inst:
-                rais.inst.walkabout(self)
+            if rais.cause:
+                rais.cause.walkabout(self)
                 arg += 1
-                if rais.tback:
-                    rais.tback.walkabout(self)
-                    arg += 1
         self.emit_op_arg(ops.RAISE_VARARGS, arg)
 
     def visit_Global(self, glob):
diff --git a/pypy/interpreter/astcompiler/test/test_compiler.py b/pypy/interpreter/astcompiler/test/test_compiler.py
--- a/pypy/interpreter/astcompiler/test/test_compiler.py
+++ b/pypy/interpreter/astcompiler/test/test_compiler.py
@@ -797,6 +797,17 @@
             return y"""
         yield self.st, test, "f()", 4
 
+    def test_raise_from(self):
+        test = """if 1:
+        def f():
+            try:
+                raise TypeError() from ValueError()
+            except TypeError:
+                return 42
+        """
+        yield self.st, test, "f()", 42
+    # This line is needed for py.code to find the source.
+
 
 class AppTestCompiler:
 
diff --git a/pypy/interpreter/astcompiler/tools/Python.asdl b/pypy/interpreter/astcompiler/tools/Python.asdl
--- a/pypy/interpreter/astcompiler/tools/Python.asdl
+++ b/pypy/interpreter/astcompiler/tools/Python.asdl
@@ -30,8 +30,7 @@
 	      | If(expr test, stmt* body, stmt* orelse)
 	      | With(expr context_expr, expr? optional_vars, stmt* body)
 
-	      -- 'type' is a bad name
-	      | Raise(expr? type, expr? inst, expr? tback)
+	      | Raise(expr? exc, expr? cause)
 	      | TryExcept(stmt* body, excepthandler* handlers, stmt* orelse)
 	      | TryFinally(stmt* body, stmt* finalbody)
 	      | Assert(expr test, expr? msg)
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -1219,7 +1219,7 @@
         # unclear if there is any use at all for getting the bytes in
         # the unicode buffer.)
         try:
-            return self.str_w(w_obj)
+            return self.bytes_w(w_obj)
         except OperationError, e:
             if not e.match(self, self.w_TypeError):
                 raise
@@ -1254,6 +1254,10 @@
         return self.str_w(w_obj)
 
     def unicode_w(self, w_obj):
+        if not we_are_translated():
+            if self.isinstance_w(w_obj, self.w_bytes):
+                import pdb; pdb.set_trace()
+                assert False, "unicode_w was called with a bytes string"
         return w_obj.unicode_w(self)
 
     def realunicode_w(self, w_obj):
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -489,15 +489,14 @@
             self.last_exception = operror
             raise Reraise
 
-        w_value = w_traceback = space.w_None
-        if nbargs >= 3:
-            w_traceback = self.popvalue()
+        w_value = w_cause = space.w_None
         if nbargs >= 2:
+            w_cause = self.popvalue() # XXX cause?
+        if 1:
             w_value = self.popvalue()
-        if 1:
-            w_type = self.popvalue()
-        operror = OperationError(w_type, w_value)
+        operror = OperationError(space.type(w_value), w_value)
         operror.normalize_exception(space)
+        w_traceback = space.w_None # XXX with_traceback?
         if not space.full_exceptions or space.is_w(w_traceback, space.w_None):
             # common case
             raise operror
diff --git a/pypy/interpreter/pyparser/data/Grammar3.2 b/pypy/interpreter/pyparser/data/Grammar3.2
--- a/pypy/interpreter/pyparser/data/Grammar3.2
+++ b/pypy/interpreter/pyparser/data/Grammar3.2
@@ -49,7 +49,7 @@
 continue_stmt: 'continue'
 return_stmt: 'return' [testlist]
 yield_stmt: yield_expr
-raise_stmt: 'raise' [test [',' test [',' test]]]
+raise_stmt: 'raise' [test ['from' test]]
 import_stmt: import_name | import_from
 import_name: 'import' dotted_as_names
 import_from: ('from' ('.'* dotted_name | '.'+)
diff --git a/pypy/interpreter/pyparser/pyparse.py b/pypy/interpreter/pyparser/pyparse.py
--- a/pypy/interpreter/pyparser/pyparse.py
+++ b/pypy/interpreter/pyparser/pyparse.py
@@ -135,7 +135,7 @@
                 if e.match(space, space.w_UnicodeDecodeError):
                     e.normalize_exception(space)
                     w_message = space.str(e.get_w_value(space))
-                    raise error.SyntaxError(space.text_w(w_message))
+                    raise error.SyntaxError(space.str_w(w_message))
                 raise
 
         f_flags, future_info = future.get_futures(self.future_flags, textsrc)
diff --git a/pypy/module/__builtin__/app_inspect.py b/pypy/module/__builtin__/app_inspect.py
--- a/pypy/module/__builtin__/app_inspect.py
+++ b/pypy/module/__builtin__/app_inspect.py
@@ -19,12 +19,12 @@
     if len(obj) == 0:
         return _caller_locals()
     elif len(obj) != 1:
-        raise TypeError, "vars() takes at most 1 argument."
+        raise TypeError("vars() takes at most 1 argument.")
     else:
         try:
             return obj[0].__dict__
         except AttributeError:
-            raise TypeError, "vars() argument must have __dict__ attribute"
+            raise TypeError("vars() argument must have __dict__ attribute")
 
 # Replaced by the interp-level helper space.callable(): 
 ##def callable(ob):
diff --git a/pypy/module/exceptions/interp_exceptions.py b/pypy/module/exceptions/interp_exceptions.py
--- a/pypy/module/exceptions/interp_exceptions.py
+++ b/pypy/module/exceptions/interp_exceptions.py
@@ -631,11 +631,11 @@
 
     def descr_init(self, space, w_encoding, w_object, w_start, w_end, w_reason):
         # typechecking
-        space.text_w(w_encoding)
-        space.str_w(w_object)
+        space.str_w(w_encoding)
+        space.bytes_w(w_object)
         space.int_w(w_start)
         space.int_w(w_end)
-        space.text_w(w_reason)
+        space.str_w(w_reason)
         # assign attributes
         self.w_encoding = w_encoding
         self.w_object = w_object
@@ -650,7 +650,7 @@
             if self.end == self.start + 1:
                 return "'%s' codec can't decode byte 0x%02x in position %d: %s"%(
                     self.encoding,
-                    ord(self.object[self.start]), self.start, self.reason)
+                    self.object[self.start], self.start, self.reason)
             return "'%s' codec can't decode bytes in position %d-%d: %s" % (
                 self.encoding, self.start, self.end - 1, self.reason)
         """)
diff --git a/pypy/module/imp/importing.py b/pypy/module/imp/importing.py
--- a/pypy/module/imp/importing.py
+++ b/pypy/module/imp/importing.py
@@ -964,7 +964,7 @@
     """ Read a code object from a file and check it for validity """
 
     w_marshal = space.getbuiltinmodule('marshal')
-    w_code = space.call_method(w_marshal, 'loads', space.wrap(strbuf))
+    w_code = space.call_method(w_marshal, 'loads', space.wrapbytes(strbuf))
     pycode = space.interpclass_w(w_code)
     if pycode is None or not isinstance(pycode, Code):
         raise operationerrfmt(space.w_ImportError,
@@ -1008,9 +1008,9 @@
     """
     w_marshal = space.getbuiltinmodule('marshal')
     try:
-        w_str = space.call_method(w_marshal, 'dumps', space.wrap(co),
-                                  space.wrap(MARSHAL_VERSION_FOR_PYC))
-        strbuf = space.str_w(w_str)
+        w_bytes = space.call_method(w_marshal, 'dumps', space.wrap(co),
+                                    space.wrap(MARSHAL_VERSION_FOR_PYC))
+        strbuf = space.bytes_w(w_bytes)
     except OperationError, e:
         if e.async(space):
             raise
diff --git a/pypy/module/operator/app_operator.py b/pypy/module/operator/app_operator.py
--- a/pypy/module/operator/app_operator.py
+++ b/pypy/module/operator/app_operator.py
@@ -21,7 +21,7 @@
         if x == b:
             return index
         index += 1
-    raise ValueError, 'sequence.index(x): x not in sequence'
+    raise ValueError('sequence.index(x): x not in sequence')
 
 # XXX the following is approximative
 def isMappingType(obj,):
@@ -40,9 +40,9 @@
 def repeat(obj, num):
     'repeat(a, b) -- Return a * b, where a is a sequence, and b is an integer.'
     if not isinstance(num, (int, long)):
-        raise TypeError, 'an integer is required'
+        raise TypeError('an integer is required')
     if not isSequenceType(obj):
-        raise TypeError, "non-sequence object can't be repeated"
+        raise TypeError("non-sequence object can't be repeated")
 
     return obj * num
 
diff --git a/pypy/module/posix/app_posix.py b/pypy/module/posix/app_posix.py
--- a/pypy/module/posix/app_posix.py
+++ b/pypy/module/posix/app_posix.py
@@ -191,7 +191,7 @@
         except Exception, e:
             try_close(write_end)
             try_close(read_end)
-            raise Exception, e     # bare 'raise' does not work here :-(
+            raise Exception() from e
 
     def wait():
         """ wait() -> (pid, status)
diff --git a/pypy/module/sys/app.py b/pypy/module/sys/app.py
--- a/pypy/module/sys/app.py
+++ b/pypy/module/sys/app.py
@@ -54,7 +54,7 @@
     # note that we cannot use SystemExit(exitcode) here.
     # The comma version leads to an extra de-tupelizing
     # in normalize_exception, which is exactly like CPython's.
-    raise SystemExit, exitcode
+    raise SystemExit(exitcode)
 
 #import __builtin__
 
diff --git a/pypy/objspace/std/marshal_impl.py b/pypy/objspace/std/marshal_impl.py
--- a/pypy/objspace/std/marshal_impl.py
+++ b/pypy/objspace/std/marshal_impl.py
@@ -249,7 +249,7 @@
 marshal_w__Rope = marshal_w__String
 
 def unmarshal_String(space, u, tc):
-    return space.wrap(u.get_str())
+    return space.wrapbytes(u.get_str())
 register(TYPE_STRING, unmarshal_String)
 
 def unmarshal_stringref(space, u, tc):
@@ -336,7 +336,7 @@
 def unmarshal_str(u):
     w_obj = u.get_w_obj()
     try:
-        return u.space.str_w(w_obj)
+        return u.space.bytes_w(w_obj)
     except OperationError, e:
         if e.match(u.space, u.space.w_TypeError):
             u.raise_exc('invalid marshal data for code object')
diff --git a/pypy/objspace/std/unicodeobject.py b/pypy/objspace/std/unicodeobject.py
--- a/pypy/objspace/std/unicodeobject.py
+++ b/pypy/objspace/std/unicodeobject.py
@@ -75,8 +75,7 @@
     return ''.join(result)
 
 def str__Unicode(space, w_uni):
-    from pypy.objspace.std.unicodetype import encode_object
-    return encode_object(space, w_uni, None, None)
+    return w_uni
 
 def eq__Unicode_Unicode(space, w_left, w_right):
     return space.newbool(w_left._value == w_right._value)


More information about the pypy-commit mailing list