[pypy-svn] r56357 - in pypy/dist/pypy/module/termios: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Mon Jul 7 18:44:59 CEST 2008


Author: cfbolz
Date: Mon Jul  7 18:44:57 2008
New Revision: 56357

Modified:
   pypy/dist/pypy/module/termios/interp_termios.py
   pypy/dist/pypy/module/termios/test/test_termios.py
Log:
Fix an RPython-ValueError in tcsetattr.


Modified: pypy/dist/pypy/module/termios/interp_termios.py
==============================================================================
--- pypy/dist/pypy/module/termios/interp_termios.py	(original)
+++ pypy/dist/pypy/module/termios/interp_termios.py	Mon Jul  7 18:44:57 2008
@@ -28,34 +28,31 @@
     return OperationError(w_exception_class, w_exception)
 
 def tcsetattr(space, fd, when, w_attributes):
+    from pypy.interpreter.baseobjspace import UnpackValueError
     try:
-        w_cc = space.getitem(w_attributes, space.wrap(-1))
-        tup_w = space.getitem(w_attributes, space.newslice(
-            space.wrap(0), space.wrap(-1), space.wrap(1)))
-        w_iflag, w_oflag, w_cflag, w_lflag, w_ispeed, w_ospeed = \
-                 space.unpackiterable(tup_w)
-        w_builtin = space.getbuiltinmodule('__builtin__')
-        cc = []
-        for w_c in space.unpackiterable(w_cc):
-            if space.is_true(space.isinstance(w_c, space.w_int)):
-                ch = space.call_function(space.getattr(w_builtin,
-                                              space.wrap('chr')), w_c)
-                cc.append(space.str_w(ch))
-            else:
-                cc.append(space.str_w(w_c))
-        tup = (space.int_w(w_iflag), space.int_w(w_oflag),
-               space.int_w(w_cflag), space.int_w(w_lflag),
-               space.int_w(w_ispeed), space.int_w(w_ospeed), cc)
-        try:
-            rtermios.tcsetattr(fd, when, tup)
-        except termios.error, e:
-            e.errno = e.args[0]
-            raise convert_error(space, e)
-    except OperationError, e:
-        if not e.match(space, space.w_TypeError):
-            raise
-        msg = "tcsetattr must be called with int, int and 7-arg tuple"
-        raise OperationError(space.w_TypeError, space.wrap(str(msg)))
+        w_iflag, w_oflag, w_cflag, w_lflag, w_ispeed, w_ospeed, w_cc = \
+                 space.unpackiterable(w_attributes, expected_length=7)
+    except UnpackValueError, e:
+        raise OperationError(
+            space.w_TypeError,
+            space.wrap("tcsetattr, arg 3: must be 7 element list"))
+    w_builtin = space.getbuiltinmodule('__builtin__')
+    cc = []
+    for w_c in space.unpackiterable(w_cc):
+        if space.is_true(space.isinstance(w_c, space.w_int)):
+            ch = space.call_function(space.getattr(w_builtin,
+                                          space.wrap('chr')), w_c)
+            cc.append(space.str_w(ch))
+        else:
+            cc.append(space.str_w(w_c))
+    tup = (space.int_w(w_iflag), space.int_w(w_oflag),
+           space.int_w(w_cflag), space.int_w(w_lflag),
+           space.int_w(w_ispeed), space.int_w(w_ospeed), cc)
+    try:
+        rtermios.tcsetattr(fd, when, tup)
+    except termios.error, e:
+        e.errno = e.args[0]
+        raise convert_error(space, e)
 tcsetattr.unwrap_spec = [ObjSpace, int, int, W_Root]
 
 def tcgetattr(space, fd):

Modified: pypy/dist/pypy/module/termios/test/test_termios.py
==============================================================================
--- pypy/dist/pypy/module/termios/test/test_termios.py	(original)
+++ pypy/dist/pypy/module/termios/test/test_termios.py	Mon Jul  7 18:44:57 2008
@@ -128,3 +128,6 @@
         import termios
         raises(termios.error, "termios.tcgetattr(334)")
         
+    def test_error_tcsetattr(self):
+        import termios
+        raises(TypeError, termios.tcsetattr, 0, 1, (1, 2))



More information about the Pypy-commit mailing list