[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