8000 bpo-23927: Make getargs.c skipitem() skipping 'w*'. (GH-8192) · python/cpython@ec75620 · GitHub
[go: up one dir, main page]

Skip to content

Commit ec75620

Browse files
bpo-23927: Make getargs.c skipitem() skipping 'w*'. (GH-8192)
(cherry picked from commit 504373c) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
1 parent d68cb9d commit ec75620

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

Lib/test/test_capi.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import pickle
66
import random
77
import re
8+
import string
89
import subprocess
910
import sys
1011
import sysconfig
@@ -565,6 +566,37 @@ def test_skipitem(self):
565566
c, i, when_skipped, when_not_skipped))
566567
self.assertIs(when_skipped, when_not_skipped, message)
567568

569+
def test_skipitem_with_suffix(self):
570+
parse = _testcapi.parse_tuple_and_keywords
571+
empty_tuple = ()
572+
tuple_1 = (0,)
573+
dict_b = {'b':1}
574+
keywords = ["a", "b"]
575+
576+
supported = ('s#', 's*', 'z#', 'z*', 'u#', 'Z#', 'y#', 'y*', 'w#', 'w*')
577+
for c in string.ascii_letters:
578+
for c2 in '#*':
579+
f = c + c2
580+
with self.subTest(format=f):
581+
optional_format = "|" + f + "i"
582+
if f in supported:
583+
parse(empty_tuple, dict_b, optional_format, keywords)
584+
else:
585+
with self.assertRaisesRegex(SystemError,
586+
'impossible<bad format char>'):
587+
parse(empty_tuple, dict_b, optional_format, keywords)
588+
589+
for c in map(chr, range(32, 128)):
590+
f = 'e' + c
591+
optional_format = "|" + f + "i"
592+
with self.subTest(format=f):
593+
if c in 'st':
594+
parse(empty_tuple, dict_b, optional_format, keywords)
595+
else:
596+
with self.assertRaisesRegex(SystemError,
597+
'impossible<bad format char>'):
598+
parse(empty_tuple, dict_b, optional_format, keywords)
599+
568600
def test_parse_tuple_and_keywords(self):
569601
# Test handling errors in the parse_tuple_and_keywords helper itself
570602
self.assertRaises(TypeError, _testcapi.parse_tuple_and_keywords,
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fixed :exc:`SystemError` in :c:func:`PyArg_ParseTupleAndKeywords` when the
2+
``w*`` format unit is used for optional parameter.

Python/getargs.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2281,7 +2281,9 @@ skipitem(const char **p_format, va_list *p_va, int flags)
22812281
(void) va_arg(*p_va, int *);
22822282
}
22832283
format++;
2284-
} else if ((c == 's' || c == 'z' || c == 'y') && *format == '*') {
2284+
} else if ((c == 's' || c == 'z' || c == 'y' || c == 'w')
2285+
&& *format == '*')
2286+
{
22852287
format++;
22862288
}
22872289
break;

0 commit comments

Comments
 (0)
0