diff options
-rw-r--r-- | Lib/test/test_capi.py | 32 | ||||
-rw-r--r-- | Misc/NEWS.d/next/C API/2018-07-09-11-39-54.bpo-23927.pDFkxb.rst | 2 | ||||
-rw-r--r-- | Python/getargs.c | 4 |
3 files changed, 37 insertions, 1 deletions
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 2a6de3c..bb2570a 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -6,6 +6,7 @@ import os import pickle import random import re +import string import subprocess import sys import sysconfig @@ -489,6 +490,37 @@ class SkipitemTest(unittest.TestCase): c, i, when_skipped, when_not_skipped)) self.assertIs(when_skipped, when_not_skipped, message) + def test_skipitem_with_suffix(self): + parse = _testcapi.parse_tuple_and_keywords + empty_tuple = () + tuple_1 = (0,) + dict_b = {'b':1} + keywords = ["a", "b"] + + supported = ('s#', 's*', 'z#', 'z*', 'u#', 'Z#', 'y#', 'y*', 'w#', 'w*') + for c in string.ascii_letters: + for c2 in '#*': + f = c + c2 + with self.subTest(format=f): + optional_format = "|" + f + "i" + if f in supported: + parse(empty_tuple, dict_b, optional_format, keywords) + else: + with self.assertRaisesRegex(SystemError, + 'impossible<bad format char>'): + parse(empty_tuple, dict_b, optional_format, keywords) + + for c in map(chr, range(32, 128)): + f = 'e' + c + optional_format = "|" + f + "i" + with self.subTest(format=f): + if c in 'st': + parse(empty_tuple, dict_b, optional_format, keywords) + else: + with self.assertRaisesRegex(SystemError, + 'impossible<bad format char>'): + parse(empty_tuple, dict_b, optional_format, keywords) + def test_parse_tuple_and_keywords(self): # Test handling errors in the parse_tuple_and_keywords helper itself self.assertRaises(TypeError, _testcapi.parse_tuple_and_keywords, diff --git a/Misc/NEWS.d/next/C API/2018-07-09-11-39-54.bpo-23927.pDFkxb.rst b/Misc/NEWS.d/next/C API/2018-07-09-11-39-54.bpo-23927.pDFkxb.rst new file mode 100644 index 0000000..3e2ac6c --- /dev/null +++ b/Misc/NEWS.d/next/C API/2018-07-09-11-39-54.bpo-23927.pDFkxb.rst @@ -0,0 +1,2 @@ +Fixed :exc:`SystemError` in :c:func:`PyArg_ParseTupleAndKeywords` when the +``w*`` format unit is used for optional parameter. diff --git a/Python/getargs.c b/Python/getargs.c index 97c1fe8..992cb21 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -2333,7 +2333,9 @@ skipitem(const char **p_format, va_list *p_va, int flags) (void) va_arg(*p_va, int *); } format++; - } else if ((c == 's' || c == 'z' || c == 'y') && *format == '*') { + } else if ((c == 's' || c == 'z' || c == 'y' || c == 'w') + && *format == '*') + { format++; } break; |