[pypy-svn] pypy default: More error checking in signal.setitimer.

alex_gaynor commits-noreply at bitbucket.org
Sat Feb 12 17:08:54 CET 2011


Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: 
Changeset: r41838:89bbc0ca0a4b
Date: 2011-02-12 11:08 -0500
http://bitbucket.org/pypy/pypy/changeset/89bbc0ca0a4b/

Log:	More error checking in signal.setitimer.

diff --git a/pypy/module/select/interp_epoll.py b/pypy/module/select/interp_epoll.py
--- a/pypy/module/select/interp_epoll.py
+++ b/pypy/module/select/interp_epoll.py
@@ -1,11 +1,10 @@
 from __future__ import with_statement
 
 import errno
-import os
 
 from pypy.interpreter.baseobjspace import Wrappable
 from pypy.interpreter.gateway import interp2app, unwrap_spec, ObjSpace, W_Root
-from pypy.interpreter.error import OperationError, wrap_oserror, operationerrfmt
+from pypy.interpreter.error import OperationError, operationerrfmt, exception_from_errno
 from pypy.interpreter.typedef import TypeDef, GetSetProperty
 from pypy.rpython.lltypesystem import lltype, rffi
 from pypy.rpython.tool import rffi_platform
@@ -56,12 +55,6 @@
     compilation_info=eci,
 )
 
-def exception_from_errno(space, w_type):
-    errno = get_errno()
-    msg = os.strerror(errno)
-    w_error = space.call_function(w_type, space.wrap(errno), space.wrap(msg))
-    return OperationError(w_type, w_error)
-
 class W_Epoll(Wrappable):
     def __init__(self, space, epfd):
         self.space = space

diff --git a/pypy/module/signal/test/test_signal.py b/pypy/module/signal/test/test_signal.py
--- a/pypy/module/signal/test/test_signal.py
+++ b/pypy/module/signal/test/test_signal.py
@@ -255,3 +255,7 @@
         signal.pause()
         assert self.called
 
+    def test_itimer_exc(self):
+        import signal
+
+        raises(signal.ItimerError, signal.setitimer, -1, 0)

diff --git a/pypy/module/signal/interp_signal.py b/pypy/module/signal/interp_signal.py
--- a/pypy/module/signal/interp_signal.py
+++ b/pypy/module/signal/interp_signal.py
@@ -1,5 +1,5 @@
 from __future__ import with_statement
-from pypy.interpreter.error import OperationError
+from pypy.interpreter.error import OperationError, exception_from_errno
 from pypy.interpreter.baseobjspace import W_Root, ObjSpace
 from pypy.interpreter.executioncontext import AsyncAction, AbstractActionFlag
 from pypy.interpreter.executioncontext import PeriodicAsyncAction
@@ -303,6 +303,10 @@
     w_interval = space.wrap(double_from_timeval(val.c_it_interval))
     return space.newtuple([w_value, w_interval])
 
+def get_itimer_error(space):
+    mod = space.getbuiltinmodule("signal")
+    return space.getattr(mod, space.wrap("ItimerError"))
+
 @jit.dont_look_inside
 @unwrap_spec(ObjSpace, int, float, float)
 def setitimer(space, which, first, interval=0):
@@ -313,7 +317,10 @@
 
         with lltype.scoped_alloc(itimervalP.TO, 1) as old:
 
-            c_setitimer(which, new, old)
+            ret = c_setitimer(which, new, old)
+            if ret != 0:
+                raise exception_from_errno(space, get_itimer_error(space))
+
 
             return itimer_retval(space, old[0])
 

diff --git a/pypy/module/signal/app_signal.py b/pypy/module/signal/app_signal.py
--- a/pypy/module/signal/app_signal.py
+++ b/pypy/module/signal/app_signal.py
@@ -8,3 +8,7 @@
     It raises KeyboardInterrupt.
     """
     raise KeyboardInterrupt()
+
+
+class ItimerError(IOError):
+    pass
\ No newline at end of file

diff --git a/pypy/module/signal/__init__.py b/pypy/module/signal/__init__.py
--- a/pypy/module/signal/__init__.py
+++ b/pypy/module/signal/__init__.py
@@ -26,6 +26,7 @@
 
     appleveldefs = {
         'default_int_handler': 'app_signal.default_int_handler',
+        'ItimerError': 'app_signal.ItimerError',
     }
 
     def buildloaders(cls):

diff --git a/pypy/interpreter/error.py b/pypy/interpreter/error.py
--- a/pypy/interpreter/error.py
+++ b/pypy/interpreter/error.py
@@ -1,6 +1,6 @@
 import os, sys
+from pypy.rlib import jit
 from pypy.rlib.objectmodel import we_are_translated
-from pypy.rlib import jit
 from errno import EINTR
 
 AUTO_DEBUG = os.getenv('PYPY_DEBUG')
@@ -401,3 +401,10 @@
                              w_exception_class=w_exception_class)
 wrap_oserror._annspecialcase_ = 'specialize:arg(3)'
 
+def exception_from_errno(space, w_type):
+    from pypy.rlib.rposix import get_errno
+
+    errno = get_errno()
+    msg = os.strerror(errno)
+    w_error = space.call_function(w_type, space.wrap(errno), space.wrap(msg))
+    return OperationError(w_type, w_error)


More information about the Pypy-commit mailing list