]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #23842: os.major(), os.minor() and os.makedev() now support ints again.
authorSerhiy Storchaka <storchaka@gmail.com>
Mon, 20 Apr 2015 06:21:23 +0000 (09:21 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Mon, 20 Apr 2015 06:21:23 +0000 (09:21 +0300)
Lib/test/test_posix.py
Misc/NEWS
Modules/posixmodule.c

index 3f44aa37fa74a3a8a0282aa51ef6b03125325757..9810c77bc833917c9e4f31e9a7adbb9ca04725aa 100644 (file)
@@ -261,6 +261,40 @@ class PosixTester(unittest.TestCase):
     def test_stat(self):
         self.assertTrue(posix.stat(test_support.TESTFN))
 
+    @unittest.skipUnless(hasattr(posix, 'stat'), 'test needs posix.stat()')
+    @unittest.skipUnless(hasattr(posix, 'makedev'), 'test needs posix.makedev()')
+    def test_makedev(self):
+        st = posix.stat(test_support.TESTFN)
+        dev = st.st_dev
+        self.assertIsInstance(dev, (int, long))
+        self.assertGreaterEqual(dev, 0)
+
+        major = posix.major(dev)
+        self.assertIsInstance(major, (int, long))
+        self.assertGreaterEqual(major, 0)
+        self.assertEqual(posix.major(int(dev)), major)
+        self.assertEqual(posix.major(long(dev)), major)
+        self.assertRaises(TypeError, posix.major, float(dev))
+        self.assertRaises(TypeError, posix.major)
+        self.assertRaises((ValueError, OverflowError), posix.major, -1)
+
+        minor = posix.minor(dev)
+        self.assertIsInstance(minor, (int, long))
+        self.assertGreaterEqual(minor, 0)
+        self.assertEqual(posix.minor(int(dev)), minor)
+        self.assertEqual(posix.minor(long(dev)), minor)
+        self.assertRaises(TypeError, posix.minor, float(dev))
+        self.assertRaises(TypeError, posix.minor)
+        self.assertRaises((ValueError, OverflowError), posix.minor, -1)
+
+        self.assertEqual(posix.makedev(major, minor), dev)
+        self.assertEqual(posix.makedev(int(major), int(minor)), dev)
+        self.assertEqual(posix.makedev(long(major), long(minor)), dev)
+        self.assertRaises(TypeError, posix.makedev, float(major), minor)
+        self.assertRaises(TypeError, posix.makedev, major, float(minor))
+        self.assertRaises(TypeError, posix.makedev, major)
+        self.assertRaises(TypeError, posix.makedev)
+
     def _test_all_chown_common(self, chown_func, first_param, stat_func):
         """Common code for chown, fchown and lchown tests."""
         def check_stat(uid, gid):
index b06d5b198a443cbca747149902e29780dd89ca1d..e01aeb2e32ebca0f52b62b9ae12739b1e3bbabb7 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -21,6 +21,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #23842: os.major(), os.minor() and os.makedev() now support ints again.
+
 - Issue #23811: Add missing newline to the PyCompileError error message.
   Patch by Alex Shkop.
 
index c4c767e9cdf5881bfcb9ff1149553e7ba22d01b3..4e86d3216fa0cbcc2992d0bb1c59ccb0f2c7b77f 100644 (file)
@@ -478,13 +478,38 @@ OverflowUp:
 static int
 _Py_Dev_Converter(PyObject *obj, void *p)
 {
+    PyObject *index = PyNumber_Index(obj);
+    if (index == NULL)
+        return 0;
+    if (PyInt_Check(index)) {
+        long x = PyInt_AS_LONG(index);
+        Py_DECREF(index);
+        if (x == -1 && PyErr_Occurred())
+            return 0;
+        if (x < 0) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "can't convert negative number to unsigned long");
+            return 0;
+        }
+        *((dev_t *)p) = (unsigned long)x;
+    }
+    else if (PyLong_Check(index)) {
 #ifdef HAVE_LONG_LONG
-    *((dev_t *)p) = PyLong_AsUnsignedLongLong(obj);
+        *((dev_t *)p) = PyLong_AsUnsignedLongLong(index);
 #else
-    *((dev_t *)p) = PyLong_AsUnsignedLong(obj);
+        *((dev_t *)p) = PyLong_AsUnsignedLong(index);
 #endif
-    if (PyErr_Occurred())
+        Py_DECREF(index);
+        if (PyErr_Occurred())
+            return 0;
+    }
+    else {
+        Py_DECREF(index);
+        PyErr_Format(PyExc_TypeError,
+                     "expected int/long, %s found",
+                     Py_TYPE(obj)->tp_name);
         return 0;
+    }
     return 1;
 }