Author: Amaury Forgeot d'Arc <[email protected]>
Branch: py3.5
Changeset: r90895:259a16de4c00
Date: 2017-04-01 14:35 +0200
http://bitbucket.org/pypy/pypy/changeset/259a16de4c00/

Log:    CPython makes a difference between OSError(None,None) and OSError(),
        do the same in PyPy

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
@@ -443,10 +443,10 @@
     """OS system call failed."""
 
     def __init__(self, space):
-        self.w_errno = space.w_None
-        self.w_strerror = space.w_None
-        self.w_filename = space.w_None
-        self.w_filename2 = space.w_None
+        self.w_errno = None
+        self.w_strerror = None
+        self.w_filename = None
+        self.w_filename2 = None
         self.written = -1  # only for BlockingIOError.
         W_BaseException.__init__(self, space)
 
@@ -556,9 +556,9 @@
     # since we rebind args_w, we need special reduce, grump
     def descr_reduce(self, space):
         extra = []
-        if not space.is_w(self.w_filename, space.w_None):
+        if self.w_filename:
             extra.append(self.w_filename)
-            if not space.is_w(self.w_filename2, space.w_None):
+            if self.w_filename2:
                 extra.append(space.w_None)
                 extra.append(self.w_filename2)
         lst = [self.getclass(space), space.newtuple(self.args_w + extra)]
@@ -567,25 +567,26 @@
         return space.newtuple(lst)
 
     def descr_str(self, space):
-        if (not space.is_w(self.w_errno, space.w_None) and
-            not space.is_w(self.w_strerror, space.w_None)):
+        if self.w_errno:
             errno = space.unicode_w(space.str(self.w_errno))
+        else:
+            errno = u""
+        if self.w_strerror:
             strerror = space.unicode_w(space.str(self.w_strerror))
-            if not space.is_w(self.w_filename, space.w_None):
-                if not space.is_w(self.w_filename2, space.w_None):
-                    return space.newunicode(u"[Errno %s] %s: %s -> %s" % (
-                        errno,
-                        strerror,
-                        space.unicode_w(space.repr(self.w_filename)),
-                        space.unicode_w(space.repr(self.w_filename2))))
-                return space.newunicode(u"[Errno %s] %s: %s" % (
-                    errno,
-                    strerror,
-                    space.unicode_w(space.repr(self.w_filename))))
+        else:
+            strerror = u""
+        if self.w_filename:
+            if self.w_filename2:
+                return space.newunicode(u"[Errno %s] %s: %s -> %s" % (
+                    errno, strerror,
+                    space.unicode_w(space.repr(self.w_filename)),
+                    space.unicode_w(space.repr(self.w_filename2))))
+            return space.newunicode(u"[Errno %s] %s: %s" % (
+                errno, strerror,
+                space.unicode_w(space.repr(self.w_filename))))
+        if self.w_errno and self.w_strerror:
             return space.newunicode(u"[Errno %s] %s" % (
-                errno,
-                strerror,
-            ))
+                errno, strerror))
         return W_BaseException.descr_str(self, space)
 
     def descr_get_written(self, space):
@@ -637,7 +638,7 @@
             not space.is_w(self.w_strerror, space.w_None)):
             winerror = space.int_w(self.w_winerror)
             strerror = space.unicode_w(self.w_strerror)
-            if not space.is_w(self.w_filename, space.w_None):
+            if self.w_filename:
                 return space.newunicode(u"[Error %d] %s: %s" % (
                     winerror,
                     strerror,
diff --git a/pypy/module/exceptions/test/test_exc.py 
b/pypy/module/exceptions/test/test_exc.py
--- a/pypy/module/exceptions/test/test_exc.py
+++ b/pypy/module/exceptions/test/test_exc.py
@@ -2,8 +2,6 @@
 
 
 class AppTestExc(object):
-    spaceconfig = dict(usemodules=('exceptions',))
-
     def setup_class(cls):
         cls.w_file = cls.space.wrap(__file__)
 
@@ -392,6 +390,12 @@
         assert e.filename2 == "bok"
         assert str(e) == "[Errno 42] bar: 'baz' -> 'bok'"
 
+    def test_oserror_None(self):
+        assert str(OSError()) == ""
+        assert str(OSError(None)) == "None"
+        assert str(OSError(None, None)) == "[Errno None] None"
+        assert str(OSError(None, None, None, None)) == "[Errno None] None"
+
     # Check the heuristic for print & exec covers significant cases
     # As well as placing some limits on false positives
     def test_former_statements_refer_to_builtins(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to