[Python-checkins] bpo-23927: Make getargs.c skipitem() skipping 'w*'. (GH-8192)
Miss Islington (bot)
webhook-mailer at python.org
Wed Jul 11 13:10:46 EDT 2018
https://github.com/python/cpython/commit/ec7562068fd123969ab4d27e11f4070271c72e16
commit: ec7562068fd123969ab4d27e11f4070271c72e16
branch: 3.6
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2018-07-11T10:10:40-07:00
summary:
bpo-23927: Make getargs.c skipitem() skipping 'w*'. (GH-8192)
(cherry picked from commit 504373c59b48f1ea12132d515459022730db6047)
Co-authored-by: Serhiy Storchaka <storchaka at gmail.com>
files:
A Misc/NEWS.d/next/C API/2018-07-09-11-39-54.bpo-23927.pDFkxb.rst
M Lib/test/test_capi.py
M Python/getargs.c
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
index b36a2ce585ce..2725333e7e96 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
@@ -5,6 +5,7 @@
import pickle
import random
import re
+import string
import subprocess
import sys
import sysconfig
@@ -565,6 +566,37 @@ def test_skipitem(self):
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 000000000000..3e2ac6c91837
--- /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 4d27418a84ba..594b150deeb1 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -2281,7 +2281,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;
More information about the Python-checkins
mailing list