Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 25ad2ac

Browse files
committed
Merge remote-tracking branch 'upstream/main' into asyncio-queue-shutdown
2 parents 420a247 + 61599a4 commit 25ad2ac

37 files changed

Lines changed: 2752 additions & 2492 deletions

Grammar/python.gram

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,7 @@ bitwise_and[expr_ty]:
778778
shift_expr[expr_ty]:
779779
| a=shift_expr '<<' b=sum { _PyAST_BinOp(a, LShift, b, EXTRA) }
780780
| a=shift_expr '>>' b=sum { _PyAST_BinOp(a, RShift, b, EXTRA) }
781+
| invalid_arithmetic
781782
| sum
782783

783784
# Arithmetic operators
@@ -794,6 +795,7 @@ term[expr_ty]:
794795
| a=term '//' b=factor { _PyAST_BinOp(a, FloorDiv, b, EXTRA) }
795796
| a=term '%' b=factor { _PyAST_BinOp(a, Mod, b, EXTRA) }
796797
| a=term '@' b=factor { CHECK_VERSION(expr_ty, 5, "The '@' operator is", _PyAST_BinOp(a, MatMult, b, EXTRA)) }
798+
| invalid_factor
797799
| factor
798800

799801
factor[expr_ty] (memo):
@@ -1415,3 +1417,8 @@ invalid_replacement_field:
14151417
invalid_conversion_character:
14161418
| '!' &(':' | '}') { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: missing conversion character") }
14171419
| '!' !NAME { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: invalid conversion character") }
1420+
1421+
invalid_arithmetic:
1422+
| sum ('+'|'-'|'*'|'/'|'%'|'//'|'@') a='not' b=inversion { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "'not' after an operator must be parenthesized") }
1423+
invalid_factor:
1424+
| ('+' | '-' | '~') a='not' b=factor { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "'not' after an operator must be parenthesized") }

Lib/test/libregrtest/cmdline.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ def __init__(self, **kwargs) -> None:
173173
self.fail_rerun = False
174174
self.tempdir = None
175175
self._add_python_opts = True
176+
self.xmlpath = None
176177

177178
super().__init__(**kwargs)
178179

@@ -506,17 +507,28 @@ def _parse_args(args, **kwargs):
506507
ns.randomize = True
507508
if ns.verbose:
508509
ns.header = True
510+
509511
# When -jN option is used, a worker process does not use --verbose3
510512
# and so -R 3:3 -jN --verbose3 just works as expected: there is no false
511513
# alarm about memory leak.
512514
if ns.huntrleaks and ns.verbose3 and ns.use_mp is None:
513-
ns.verbose3 = False
514515
# run_single_test() replaces sys.stdout with io.StringIO if verbose3
515516
# is true. In this case, huntrleaks sees an write into StringIO as
516517
# a memory leak, whereas it is not (gh-71290).
518+
ns.verbose3 = False
517519
print("WARNING: Disable --verbose3 because it's incompatible with "
518520
"--huntrleaks without -jN option",
519521
file=sys.stderr)
522+
523+
if ns.huntrleaks and ns.xmlpath:
524+
# The XML data is written into a file outside runtest_refleak(), so
525+
# it looks like a leak but it's not. Simply disable XML output when
526+
# hunting for reference leaks (gh-83434).
527+
ns.xmlpath = None
528+
print("WARNING: Disable --junit-xml because it's incompatible "
529+
"with --huntrleaks",
530+
file=sys.stderr)
531+
520532
if ns.forever:
521533
# --forever implies --failfast
522534
ns.failfast = True

Lib/test/test_operator.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import unittest
22
import pickle
33
import sys
4+
from decimal import Decimal
5+
from fractions import Fraction
46

57
from test import support
68
from test.support import import_helper
@@ -508,6 +510,44 @@ def __getitem__(self, other): return 5 # so that C is a sequence
508510
self.assertEqual(operator.ixor (c, 5), "ixor")
509511
self.assertEqual(operator.iconcat (c, c), "iadd")
510512

513+
def test_iconcat_without_getitem(self):
514+
operator = self.module
515+
516+
msg = "'int' object can't be concatenated"
517+
with self.assertRaisesRegex(TypeError, msg):
518+
operator.iconcat(1, 0.5)
519+
520+
def test_index(self):
521+
operator = self.module
522+
class X:
523+
def __index__(self):
524+
return 1
525+
526+
self.assertEqual(operator.index(X()), 1)
527+
self.assertEqual(operator.index(0), 0)
528+
self.assertEqual(operator.index(1), 1)
529+
self.assertEqual(operator.index(2), 2)
530+
with self.assertRaises((AttributeError, TypeError)):
531+
operator.index(1.5)
532+
with self.assertRaises((AttributeError, TypeError)):
533+
operator.index(Fraction(3, 7))
534+
with self.assertRaises((AttributeError, TypeError)):
535+
operator.index(Decimal(1))
536+
with self.assertRaises((AttributeError, TypeError)):
537+
operator.index(None)
538+
539+
def test_not_(self):
540+
operator = self.module
541+
class C:
542+
def __bool__(self):
543+
raise SyntaxError
544+
self.assertRaises(TypeError, operator.not_)
545+
self.assertRaises(SyntaxError, operator.not_, C())
546+
self.assertFalse(operator.not_(5))
547+
self.assertFalse(operator.not_([0]))
548+
self.assertTrue(operator.not_(0))
549+
self.assertTrue(operator.not_([]))
550+
511551
def test_length_hint(self):
512552
operator = self.module
513553
class X(object):
@@ -533,6 +573,13 @@ def __length_hint__(self):
533573
with self.assertRaises(LookupError):
534574
operator.length_hint(X(LookupError))
535575

576+
class Y: pass
577+
578+
msg = "'str' object cannot be interpreted as an integer"
579+
with self.assertRaisesRegex(TypeError, msg):
580+
operator.length_hint(X(2), "abc")
581+
self.assertEqual(operator.length_hint(Y(), 10), 10)
582+
536583
def test_call(self):
537584
operator = self.module
538585

Lib/test/test_regrtest.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,24 @@ def test_bisect(self):
464464
regrtest = self.create_regrtest(args)
465465
self.assertTrue(regrtest.want_bisect)
466466

467+
def test_verbose3_huntrleaks(self):
468+
args = ['-R', '3:10', '--verbose3']
469+
with support.captured_stderr():
470+
regrtest = self.create_regrtest(args)
471+
self.assertIsNotNone(regrtest.hunt_refleak)
472+
self.assertEqual(regrtest.hunt_refleak.warmups, 3)
473+
self.assertEqual(regrtest.hunt_refleak.runs, 10)
474+
self.assertFalse(regrtest.output_on_failure)
475+
476+
def test_xml_huntrleaks(self):
477+
args = ['-R', '3:12', '--junit-xml', 'output.xml']
478+
with support.captured_stderr():
479+
regrtest = self.create_regrtest(args)
480+
self.assertIsNotNone(regrtest.hunt_refleak)
481+
self.assertEqual(regrtest.hunt_refleak.warmups, 3)
482+
self.assertEqual(regrtest.hunt_refleak.runs, 12)
483+
self.assertIsNone(regrtest.junit_filename)
484+
467485

468486
@dataclasses.dataclass(slots=True)
469487
class Rerun:

Lib/test/test_sax.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1215,10 +1215,10 @@ def test_expat_incremental_reset(self):
12151215

12161216
self.assertEqual(result.getvalue(), start + b"<doc>text</doc>")
12171217

1218+
@unittest.skipIf(pyexpat.version_info < (2, 6, 0),
1219+
f'Expat {pyexpat.version_info} does not '
1220+
'support reparse deferral')
12181221
def test_flush_reparse_deferral_enabled(self):
1219-
if pyexpat.version_info < (2, 6, 0):
1220-
self.skipTest(f'Expat {pyexpat.version_info} does not support reparse deferral')
1221-
12221222
result = BytesIO()
12231223
xmlgen = XMLGenerator(result)
12241224
parser = create_parser()
@@ -1251,8 +1251,8 @@ def test_flush_reparse_deferral_disabled(self):
12511251

12521252
if pyexpat.version_info >= (2, 6, 0):
12531253
parser._parser.SetReparseDeferralEnabled(False)
1254+
self.assertEqual(result.getvalue(), start) # i.e. no elements started
12541255

1255-
self.assertEqual(result.getvalue(), start) # i.e. no elements started
12561256
self.assertFalse(parser._parser.GetReparseDeferralEnabled())
12571257

12581258
parser.flush()

Lib/test/test_ssl.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2429,16 +2429,18 @@ def run(self):
24292429
self.write(msg.lower())
24302430
except OSError as e:
24312431
# handles SSLError and socket errors
2432+
if isinstance(e, ConnectionError):
2433+
# OpenSSL 1.1.1 sometimes raises
2434+
# ConnectionResetError when connection is not
2435+
# shut down gracefully.
2436+
if self.server.chatty and support.verbose:
2437+
print(f" Connection reset by peer: {self.addr}")
2438+
2439+
self.close()
2440+
self.running = False
2441+
return
24322442
if self.server.chatty and support.verbose:
2433-
if isinstance(e, ConnectionError):
2434-
# OpenSSL 1.1.1 sometimes raises
2435-
# ConnectionResetError when connection is not
2436-
# shut down gracefully.
2437-
print(
2438-
f" Connection reset by peer: {self.addr}"
2439-
)
2440-
else:
2441-
handle_error("Test server failure:\n")
2443+
handle_error("Test server failure:\n")
24422444
try:
24432445
self.write(b"ERROR\n")
24442446
except OSError:
@@ -3166,8 +3168,8 @@ def test_wrong_cert_tls13(self):
31663168
suppress_ragged_eofs=False) as s:
31673169
s.connect((HOST, server.port))
31683170
with self.assertRaisesRegex(
3169-
ssl.SSLError,
3170-
'alert unknown ca|EOF occurred|TLSV1_ALERT_UNKNOWN_CA'
3171+
OSError,
3172+
'alert unknown ca|EOF occurred|TLSV1_ALERT_UNKNOWN_CA|closed by the remote host|Connection reset by peer'
31713173
):
31723174
# TLS 1.3 perform client cert exchange after handshake
31733175
s.write(b'data')
@@ -4532,8 +4534,8 @@ def msg_cb(conn, direction, version, content_type, msg_type, data):
45324534
# test sometimes fails with EOF error. Test passes as long as
45334535
# server aborts connection with an error.
45344536
with self.assertRaisesRegex(
4535-
ssl.SSLError,
4536-
'(certificate required|EOF occurred)'
4537+
OSError,
4538+
'certificate required|EOF occurred|closed by the remote host|Connection reset by peer'
45374539
):
45384540
# receive CertificateRequest
45394541
data = s.recv(1024)

Lib/test/test_syntax.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1712,6 +1712,49 @@
17121712
Traceback (most recent call last):
17131713
SyntaxError: only single target (not list) can be annotated
17141714
1715+
# 'not' after operators:
1716+
1717+
>>> 3 + not 3
1718+
Traceback (most recent call last):
1719+
SyntaxError: 'not' after an operator must be parenthesized
1720+
1721+
>>> 3 * not 3
1722+
Traceback (most recent call last):
1723+
SyntaxError: 'not' after an operator must be parenthesized
1724+
1725+
>>> + not 3
1726+
Traceback (most recent call last):
1727+
SyntaxError: 'not' after an operator must be parenthesized
1728+
1729+
>>> - not 3
1730+
Traceback (most recent call last):
1731+
SyntaxError: 'not' after an operator must be parenthesized
1732+
1733+
>>> ~ not 3
1734+
Traceback (most recent call last):
1735+
SyntaxError: 'not' after an operator must be parenthesized
1736+
1737+
>>> 3 + - not 3
1738+
Traceback (most recent call last):
1739+
SyntaxError: 'not' after an operator must be parenthesized
1740+
1741+
>>> 3 + not -1
1742+
Traceback (most recent call last):
1743+
SyntaxError: 'not' after an operator must be parenthesized
1744+
1745+
# Check that we don't introduce misleading errors
1746+
>>> not 1 */ 2
1747+
Traceback (most recent call last):
1748+
SyntaxError: invalid syntax
1749+
1750+
>>> not 1 +
1751+
Traceback (most recent call last):
1752+
SyntaxError: invalid syntax
1753+
1754+
>>> not + 1 +
1755+
Traceback (most recent call last):
1756+
SyntaxError: invalid syntax
1757+
17151758
Corner-cases that used to fail to raise the correct error:
17161759
17171760
>>> def f(*, x=lambda __debug__:0): pass

Lib/test/test_xml_etree.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1707,11 +1707,10 @@ def test_unknown_event(self):
17071707
with self.assertRaises(ValueError):
17081708
ET.XMLPullParser(events=('start', 'end', 'bogus'))
17091709

1710+
@unittest.skipIf(pyexpat.version_info < (2, 6, 0),
1711+
f'Expat {pyexpat.version_info} does not '
1712+
'support reparse deferral')
17101713
def test_flush_reparse_deferral_enabled(self):
1711-
if pyexpat.version_info < (2, 6, 0):
1712-
self.skipTest(f'Expat {pyexpat.version_info} does not '
1713-
'support reparse deferral')
1714-
17151714
parser = ET.XMLPullParser(events=('start', 'end'))
17161715

17171716
for chunk in ("<doc", ">"):
@@ -1743,8 +1742,8 @@ def test_flush_reparse_deferral_disabled(self):
17431742
self.skipTest(f'XMLParser.(Get|Set)ReparseDeferralEnabled '
17441743
'methods not available in C')
17451744
parser._parser._parser.SetReparseDeferralEnabled(False)
1745+
self.assert_event_tags(parser, []) # i.e. no elements started
17461746

1747-
self.assert_event_tags(parser, []) # i.e. no elements started
17481747
if ET is pyET:
17491748
self.assertFalse(parser._parser._parser.GetReparseDeferralEnabled())
17501749

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Improve the :exc:`SyntaxError` that happens when 'not' appears after an
2+
operator. Patch by Pablo Galindo
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Updated the :mod:`hashlib` built-in `HACL\* project`_ C code from upstream
2+
that we use for many implementations when they are not present via OpenSSL
3+
in a given build. This also avoids the rare potential for a C symbol name
4+
one definition rule linking issue.
5+
6+
.. _HACL\* project: https://github.com/hacl-star/hacl-star

0 commit comments

Comments
 (0)