[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