[Python-checkins] cpython (2.7): Issue #23842: os.major(), os.minor() and os.makedev() now support ints again.
serhiy.storchaka
python-checkins at python.org
Mon Apr 20 08:33:18 CEST 2015
https://hg.python.org/cpython/rev/cd7d51b5c951
changeset: 95726:cd7d51b5c951
branch: 2.7
parent: 95716:d70995cf44b3
user: Serhiy Storchaka <storchaka at gmail.com>
date: Mon Apr 20 09:21:23 2015 +0300
summary:
Issue #23842: os.major(), os.minor() and os.makedev() now support ints again.
files:
Lib/test/test_posix.py | 34 ++++++++++++++++++++++++++++++
Misc/NEWS | 2 +
Modules/posixmodule.c | 33 +++++++++++++++++++++++++---
3 files changed, 65 insertions(+), 4 deletions(-)
diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
--- a/Lib/test/test_posix.py
+++ b/Lib/test/test_posix.py
@@ -261,6 +261,40 @@
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):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -21,6 +21,8 @@
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.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -478,13 +478,38 @@
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);
-#endif
- if (PyErr_Occurred())
+ *((dev_t *)p) = PyLong_AsUnsignedLong(index);
+#endif
+ 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;
}
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list