From d9ddc4a7f9acebd8304ecbeed4738db12def45f6 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 28 Sep 2021 11:19:44 +0100 Subject: [PATCH 1/5] bpo-35606: Fix math.prod tests using 'start' as keyword parameter --- Lib/test/test_math.py | 10 +++++----- Modules/mathmodule.c | 9 ++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 6d67d6293b2e7d..1d3c5ffce1970c 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1803,14 +1803,14 @@ def test_prod(self): self.assertRaises(TypeError, prod) self.assertRaises(TypeError, prod, 42) self.assertRaises(TypeError, prod, ['a', 'b', 'c']) - self.assertRaises(TypeError, prod, ['a', 'b', 'c'], '') - self.assertRaises(TypeError, prod, [b'a', b'c'], b'') + self.assertRaises(TypeError, prod, ['a', 'b', 'c'], start='') + self.assertRaises(TypeError, prod, [b'a', b'c'], start=b'') values = [bytearray(b'a'), bytearray(b'b')] - self.assertRaises(TypeError, prod, values, bytearray(b'')) + self.assertRaises(TypeError, prod, values, start=bytearray(b'')) self.assertRaises(TypeError, prod, [[1], [2], [3]]) self.assertRaises(TypeError, prod, [{2:3}]) - self.assertRaises(TypeError, prod, [{2:3}]*2, {2:3}) - self.assertRaises(TypeError, prod, [[1], [2], [3]], []) + self.assertRaises(TypeError, prod, [{2:3}]*2, start={2:3}) + self.assertRaises(TypeError, prod, [[1], [2], [3]], start=[]) with self.assertRaises(TypeError): prod([10, 20], [30, 40]) # start is a keyword-only argument diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index bd97b03205b7ca..12895c30f3a294 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3082,14 +3082,13 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start) } if (result == NULL) { - result = PyLong_FromLong(1); + result = _PyLong_GetOne(); if (result == NULL) { Py_DECREF(iter); return NULL; } - } else { - Py_INCREF(result); - } + } + Py_INCREF(result); #ifndef SLOW_PROD /* Fast paths for integers keeping temporary products in C. * Assumes all inputs are the same type. @@ -3105,7 +3104,7 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start) } /* Loop over all the items in the iterable until we finish, we overflow * or we found a non integer element */ - while(result == NULL) { + while (result == NULL) { item = PyIter_Next(iter); if (item == NULL) { Py_DECREF(iter); From b92ef1897a8b01720daca76909f90614c18ccabc Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Tue, 28 Sep 2021 12:33:30 +0100 Subject: [PATCH 2/5] Update Lib/test/test_math.py Co-authored-by: Serhiy Storchaka --- Lib/test/test_math.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 1d3c5ffce1970c..66b00e4da3dd4a 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1812,7 +1812,7 @@ def test_prod(self): self.assertRaises(TypeError, prod, [{2:3}]*2, start={2:3}) self.assertRaises(TypeError, prod, [[1], [2], [3]], start=[]) with self.assertRaises(TypeError): - prod([10, 20], [30, 40]) # start is a keyword-only argument + prod([10, 20], 1) # start is a keyword-only argument self.assertEqual(prod([0, 1, 2, 3]), 0) self.assertEqual(prod([1, 0, 2, 3]), 0) From daa90cf989f75a21a70b81924b51e2ac208cede5 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 28 Sep 2021 12:37:19 +0100 Subject: [PATCH 3/5] Add some extra cases --- Lib/test/test_math.py | 6 ++++++ lel.py | 11 +++++++++++ 2 files changed, 17 insertions(+) create mode 100644 lel.py diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 66b00e4da3dd4a..a9f1b1e11bcb39 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1811,6 +1811,12 @@ def test_prod(self): self.assertRaises(TypeError, prod, [{2:3}]) self.assertRaises(TypeError, prod, [{2:3}]*2, start={2:3}) self.assertRaises(TypeError, prod, [[1], [2], [3]], start=[]) + + # Some odd cases + self.assertEqual(prod([2, 3], start='ab'), 'abababababab') + self.assertEqual(prod([2, 3], start=[1, 2]), [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]) + self.assertEqual(prod([], start={2: 3}), {2:3}) + with self.assertRaises(TypeError): prod([10, 20], 1) # start is a keyword-only argument diff --git a/lel.py b/lel.py new file mode 100644 index 00000000000000..bbdd557620e0b1 --- /dev/null +++ b/lel.py @@ -0,0 +1,11 @@ +import traceback + +try: + compile("f(x, y for y in range(30))", "", "exec") + # compile("f(x, 1 1232323 , z)", "", "exec") + # compile("def fact(x):\n\treturn x!\n", "?", "exec") + # compile("1+\n", "?", "exec") +except Exception as e: + f = e + +traceback.print_exception(f) From 0ee65a473bc16bda521ef84cf9d56f5da113b2fa Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 28 Sep 2021 12:47:01 +0100 Subject: [PATCH 4/5] fixup! Add some extra cases --- lel.py | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 lel.py diff --git a/lel.py b/lel.py deleted file mode 100644 index bbdd557620e0b1..00000000000000 --- a/lel.py +++ /dev/null @@ -1,11 +0,0 @@ -import traceback - -try: - compile("f(x, y for y in range(30))", "", "exec") - # compile("f(x, 1 1232323 , z)", "", "exec") - # compile("def fact(x):\n\treturn x!\n", "?", "exec") - # compile("1+\n", "?", "exec") -except Exception as e: - f = e - -traceback.print_exception(f) From c7ccc56fe88f8a02e1105d4c820b26bd61c3bef6 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 28 Sep 2021 12:56:34 +0100 Subject: [PATCH 5/5] fixup! fixup! Add some extra cases --- Modules/mathmodule.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 12895c30f3a294..5e9f63f6c6e025 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3083,11 +3083,7 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start) if (result == NULL) { result = _PyLong_GetOne(); - if (result == NULL) { - Py_DECREF(iter); - return NULL; - } - } + } Py_INCREF(result); #ifndef SLOW_PROD /* Fast paths for integers keeping temporary products in C.