[pypy-commit] pypy py3.3: more closely match CPython requiring strict unsigned shorts

pjenvey noreply at buildbot.pypy.org
Sat Aug 23 01:32:04 CEST 2014


Author: Philip Jenvey <pjenvey at underboss.org>
Branch: py3.3
Changeset: r72974:ba30358bcb6b
Date: 2014-08-22 16:25 -0700
http://bitbucket.org/pypy/pypy/changeset/ba30358bcb6b/

Log:	more closely match CPython requiring strict unsigned shorts

diff --git a/pypy/module/select/interp_select.py b/pypy/module/select/interp_select.py
--- a/pypy/module/select/interp_select.py
+++ b/pypy/module/select/interp_select.py
@@ -1,11 +1,13 @@
 import errno
 
 from rpython.rlib import _rsocket_rffi as _c, rpoll
+from rpython.rlib.rarithmetic import USHRT_MAX
 from rpython.rtyper.lltypesystem import lltype, rffi
 
 from pypy.interpreter.baseobjspace import W_Root
 from pypy.interpreter.error import OperationError, oefmt, wrap_oserror
-from pypy.interpreter.gateway import WrappedDefault, interp2app, unwrap_spec
+from pypy.interpreter.gateway import (
+    Unwrapper, WrappedDefault, interp2app, unwrap_spec)
 from pypy.interpreter.typedef import TypeDef
 
 defaultevents = rpoll.POLLIN | rpoll.POLLOUT | rpoll.POLLPRI
@@ -19,28 +21,31 @@
     return Poll()
 
 
+class UShortUnwrapper(Unwrapper):
+
+    def unwrap(self, space, w_value):
+        value = space.int_w(w_value)
+        if value < 0:
+            raise oefmt(space.w_OverflowError,
+                        "can't convert negative value to C unsigned short")
+        if value > USHRT_MAX:
+            raise oefmt(space.w_OverflowError,
+                        "Python int too large for C unsigned short")
+        return value
+
+
 class Poll(W_Root):
     def __init__(self):
         self.fddict = {}
         self.running = False
 
-    @unwrap_spec(events="c_short")
+    @unwrap_spec(events=UShortUnwrapper)
     def register(self, space, w_fd, events=defaultevents):
-        if events < 0:
-            raise OperationError(
-                space.w_OverflowError,
-                space.wrap("Python int too large for C unsigned short"),
-            )
         fd = space.c_filedescriptor_w(w_fd)
         self.fddict[fd] = events
 
-    @unwrap_spec(events=int)
+    @unwrap_spec(events=UShortUnwrapper)
     def modify(self, space, w_fd, events):
-        if events < 0:
-            raise OperationError(
-                space.w_OverflowError,
-                space.wrap("Python int too large for C unsigned short"),
-            )
         fd = space.c_filedescriptor_w(w_fd)
         if fd not in self.fddict:
             raise wrap_oserror(space, OSError(errno.ENOENT, "poll.modify"),
diff --git a/pypy/module/select/test/test_select.py b/pypy/module/select/test/test_select.py
--- a/pypy/module/select/test/test_select.py
+++ b/pypy/module/select/test/test_select.py
@@ -221,11 +221,11 @@
         pollster.register(1)
         raises(OverflowError, pollster.register, 0, -1)
         raises(OverflowError, pollster.register, 0, 1 << 64)
-        exc = raises(OverflowError, pollster.register, 0, 32768) # SHRT_MAX + 1
-        assert str(exc.value) == 'signed short integer is greater than maximum'
+        pollster.register(0, 32768) # SHRT_MAX + 1
         exc = raises(OverflowError, pollster.register, 0, -32768 - 1)
-        assert str(exc.value) == 'signed short integer is less than minimum'
-        raises(OverflowError, pollster.register, 0, 65535) # USHRT_MAX + 1
+        assert "unsigned" in str(exc.value)
+        pollster.register(0, 65535) # USHRT_MAX
+        raises(OverflowError, pollster.register, 0, 65536) # USHRT_MAX + 1
         raises(OverflowError, pollster.poll, 2147483648) # INT_MAX +  1
         raises(OverflowError, pollster.poll, -2147483648 - 1)
         raises(OverflowError, pollster.poll, 4294967296) # UINT_MAX + 1


More information about the pypy-commit mailing list