From webhook-mailer at python.org Tue Feb 1 04:59:00 2022 From: webhook-mailer at python.org (Fidget-Spinner) Date: Tue, 01 Feb 2022 09:59:00 -0000 Subject: [Python-checkins] bpo-46482: add a test for `typing.Annotation.__new__` (GH-30821) Message-ID: https://github.com/python/cpython/commit/4c0612ad00ba45dbea2a86f7db6d21546cf243f8 commit: 4c0612ad00ba45dbea2a86f7db6d21546cf243f8 branch: main author: Nikita Sobolev committer: Fidget-Spinner <28750310+Fidget-Spinner at users.noreply.github.com> date: 2022-02-01T17:58:41+08:00 summary: bpo-46482: add a test for `typing.Annotation.__new__` (GH-30821) files: M Lib/test/test_typing.py diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 8449affd03a76..090d4c70d3d84 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -4643,6 +4643,13 @@ class A(typing.Match): class AnnotatedTests(BaseTestCase): + def test_new(self): + with self.assertRaisesRegex( + TypeError, + 'Type Annotated cannot be instantiated', + ): + Annotated() + def test_repr(self): self.assertEqual( repr(Annotated[int, 4, 5]), From webhook-mailer at python.org Tue Feb 1 05:22:38 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 01 Feb 2022 10:22:38 -0000 Subject: [Python-checkins] bpo-46355: What's New: Note that PyFrameObject are private (GH-31032) Message-ID: https://github.com/python/cpython/commit/a4cb31927a1f0ee31025ea1ca82fcbfad44755dc commit: a4cb31927a1f0ee31025ea1ca82fcbfad44755dc branch: main author: Petr Viktorin committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T02:22:34-08:00 summary: bpo-46355: What's New: Note that PyFrameObject are private (GH-31032) This adds a slightly more detailed explanation of the change. The most important point is that the changed/removed fields were "subject to change" to begin with. files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index e054008753a94..e7f3dab2b51db 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -759,12 +759,19 @@ Porting to Python 3.11 which are not available in the limited C API. (Contributed by Victor Stinner in :issue:`46007`.) -* Changes of the :c:type:`PyFrameObject` structure members: +* Changes of the private :c:type:`PyFrameObject` structure members. + + While the documentation notes that the fields of ``PyFrameObject`` are + subject to change at any time, they have been stable for a long time + and were used in several popular extensions. + In Python 3.11, the frame struct was reorganized to allow performance + optimizations. Rather than reading the fields directly, extensions should + use functions: * ``f_code``: removed, use :c:func:`PyFrame_GetCode` instead. Warning: the function returns a :term:`strong reference`, need to call :c:func:`Py_DECREF`. - * ``f_back``: changed, use :c:func:`PyFrame_GetBack`. + * ``f_back``: changed (see below), use :c:func:`PyFrame_GetBack`. * ``f_builtins``: removed, use ``PyObject_GetAttrString(frame, "f_builtins")``. * ``f_globals``: removed, @@ -773,13 +780,17 @@ Porting to Python 3.11 use ``PyObject_GetAttrString(frame, "f_locals")``. * ``f_lasti``: removed, use ``PyObject_GetAttrString(frame, "f_lasti")``. - * ``f_valuesstack``: removed. - * ``f_stackdepth``: removed. - * ``f_gen``: removed. - * ``f_iblock``: removed. - * ``f_state``: removed. - * ``f_blockstack``: removed. - * ``f_localsplus``: removed. + + The following fields were removed entirely, as they were details + of the old implementation: + + * ``f_valuesstack`` + * ``f_stackdepth`` + * ``f_gen`` + * ``f_iblock`` + * ``f_state`` + * ``f_blockstack`` + * ``f_localsplus`` The Python frame object is now created lazily. A side effect is that the ``f_back`` member must not be accessed directly, since its value is now also From webhook-mailer at python.org Tue Feb 1 05:25:43 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 01 Feb 2022 10:25:43 -0000 Subject: [Python-checkins] [3.9] bpo-46482: add a test for `typing.Annotation.__new__` (GH-30821) (GH-31045) Message-ID: https://github.com/python/cpython/commit/2532b7c820ec2dc87b19eb322ab92b47f3c77866 commit: 2532b7c820ec2dc87b19eb322ab92b47f3c77866 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T02:25:25-08:00 summary: [3.9] bpo-46482: add a test for `typing.Annotation.__new__` (GH-30821) (GH-31045) (cherry picked from commit 4c0612ad00ba45dbea2a86f7db6d21546cf243f8) Co-authored-by: Nikita Sobolev Automerge-Triggered-By: GH:Fidget-Spinner files: M Lib/test/test_typing.py diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index dfca96b909932..27ec5edd92b7a 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -4158,6 +4158,13 @@ class A(typing.Match): class AnnotatedTests(BaseTestCase): + def test_new(self): + with self.assertRaisesRegex( + TypeError, + 'Type Annotated cannot be instantiated', + ): + Annotated() + def test_repr(self): self.assertEqual( repr(Annotated[int, 4, 5]), From webhook-mailer at python.org Tue Feb 1 05:27:41 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 01 Feb 2022 10:27:41 -0000 Subject: [Python-checkins] bpo-46482: add a test for `typing.Annotation.__new__` (GH-30821) Message-ID: https://github.com/python/cpython/commit/6a188d88c562bfd68ef3a32d148d9b234d50646e commit: 6a188d88c562bfd68ef3a32d148d9b234d50646e branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T02:27:36-08:00 summary: bpo-46482: add a test for `typing.Annotation.__new__` (GH-30821) (cherry picked from commit 4c0612ad00ba45dbea2a86f7db6d21546cf243f8) Co-authored-by: Nikita Sobolev files: M Lib/test/test_typing.py diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index e5b596e7f3d82..366f7d8eb31d1 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -4543,6 +4543,13 @@ class A(typing.Match): class AnnotatedTests(BaseTestCase): + def test_new(self): + with self.assertRaisesRegex( + TypeError, + 'Type Annotated cannot be instantiated', + ): + Annotated() + def test_repr(self): self.assertEqual( repr(Annotated[int, 4, 5]), From webhook-mailer at python.org Tue Feb 1 05:32:08 2022 From: webhook-mailer at python.org (iritkatriel) Date: Tue, 01 Feb 2022 10:32:08 -0000 Subject: [Python-checkins] bpo-44031: fix test_tabnanny failure in non-ascii CWD (GH-31014) Message-ID: https://github.com/python/cpython/commit/108e66b6d23efd0fc2966163ead9434b328c5f17 commit: 108e66b6d23efd0fc2966163ead9434b328c5f17 branch: main author: Irit Katriel <1055913+iritkatriel at users.noreply.github.com> committer: iritkatriel <1055913+iritkatriel at users.noreply.github.com> date: 2022-02-01T10:31:57Z summary: bpo-44031: fix test_tabnanny failure in non-ascii CWD (GH-31014) files: M Lib/test/test_tabnanny.py diff --git a/Lib/test/test_tabnanny.py b/Lib/test/test_tabnanny.py index 4dfbd2985d5b5..59fdfc5573d37 100644 --- a/Lib/test/test_tabnanny.py +++ b/Lib/test/test_tabnanny.py @@ -293,8 +293,8 @@ def validate_cmd(self, *args, stdout="", stderr="", partial=False): _, out, err = script_helper.assert_python_ok('-m', 'tabnanny', *args) # Note: The `splitlines()` will solve the problem of CRLF(\r) added # by OS Windows. - out = out.decode('ascii') - err = err.decode('ascii') + out = os.fsdecode(out) + err = os.fsdecode(err) if partial: for std, output in ((stdout, out), (stderr, err)): _output = output.splitlines() From webhook-mailer at python.org Tue Feb 1 06:20:20 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 01 Feb 2022 11:20:20 -0000 Subject: [Python-checkins] bpo-44031: fix test_tabnanny failure in non-ascii CWD (GH-31014) Message-ID: https://github.com/python/cpython/commit/1dcd77280410e4b3bd7b0680f00a38cea466ebd1 commit: 1dcd77280410e4b3bd7b0680f00a38cea466ebd1 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T03:20:07-08:00 summary: bpo-44031: fix test_tabnanny failure in non-ascii CWD (GH-31014) (cherry picked from commit 108e66b6d23efd0fc2966163ead9434b328c5f17) Co-authored-by: Irit Katriel <1055913+iritkatriel at users.noreply.github.com> files: M Lib/test/test_tabnanny.py diff --git a/Lib/test/test_tabnanny.py b/Lib/test/test_tabnanny.py index 4dfbd2985d5b5..59fdfc5573d37 100644 --- a/Lib/test/test_tabnanny.py +++ b/Lib/test/test_tabnanny.py @@ -293,8 +293,8 @@ def validate_cmd(self, *args, stdout="", stderr="", partial=False): _, out, err = script_helper.assert_python_ok('-m', 'tabnanny', *args) # Note: The `splitlines()` will solve the problem of CRLF(\r) added # by OS Windows. - out = out.decode('ascii') - err = err.decode('ascii') + out = os.fsdecode(out) + err = os.fsdecode(err) if partial: for std, output in ((stdout, out), (stderr, err)): _output = output.splitlines() From webhook-mailer at python.org Tue Feb 1 06:32:08 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 01 Feb 2022 11:32:08 -0000 Subject: [Python-checkins] [3.9] bpo-44031: fix test_tabnanny failure in non-ascii CWD (GH-31014) (GH-31048) Message-ID: https://github.com/python/cpython/commit/2e9f77f9d4fc282666ff85051b6e7ade0eed1d4c commit: 2e9f77f9d4fc282666ff85051b6e7ade0eed1d4c branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T03:31:49-08:00 summary: [3.9] bpo-44031: fix test_tabnanny failure in non-ascii CWD (GH-31014) (GH-31048) (cherry picked from commit 108e66b6d23efd0fc2966163ead9434b328c5f17) Co-authored-by: Irit Katriel <1055913+iritkatriel at users.noreply.github.com> Automerge-Triggered-By: GH:iritkatriel files: M Lib/test/test_tabnanny.py diff --git a/Lib/test/test_tabnanny.py b/Lib/test/test_tabnanny.py index 95840d6ac0c5f..7f3308d745aa0 100644 --- a/Lib/test/test_tabnanny.py +++ b/Lib/test/test_tabnanny.py @@ -292,8 +292,8 @@ def validate_cmd(self, *args, stdout="", stderr="", partial=False): _, out, err = script_helper.assert_python_ok('-m', 'tabnanny', *args) # Note: The `splitlines()` will solve the problem of CRLF(\r) added # by OS Windows. - out = out.decode('ascii') - err = err.decode('ascii') + out = os.fsdecode(out) + err = os.fsdecode(err) if partial: for std, output in ((stdout, out), (stderr, err)): _output = output.splitlines() From webhook-mailer at python.org Tue Feb 1 08:41:24 2022 From: webhook-mailer at python.org (Fidget-Spinner) Date: Tue, 01 Feb 2022 13:41:24 -0000 Subject: [Python-checkins] bpo-46564: do not create frame object for super object (GH-31002) Message-ID: https://github.com/python/cpython/commit/b9ebde8db7e176e021103745cd012bae700828b5 commit: b9ebde8db7e176e021103745cd012bae700828b5 branch: main author: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> committer: Fidget-Spinner <28750310+Fidget-Spinner at users.noreply.github.com> date: 2022-02-01T21:40:46+08:00 summary: bpo-46564: do not create frame object for super object (GH-31002) files: A Misc/NEWS.d/next/Core and Builtins/2022-02-01-10-23-21.bpo-46564.6Xc2_H.rst M Objects/typeobject.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-01-10-23-21.bpo-46564.6Xc2_H.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-01-10-23-21.bpo-46564.6Xc2_H.rst new file mode 100644 index 0000000000000..4ffa6800989d7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-02-01-10-23-21.bpo-46564.6Xc2_H.rst @@ -0,0 +1 @@ +Do not create frame objects when creating :class:`super` object. Patch by Kumar Aditya. \ No newline at end of file diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 621ad9745d844..f7e0775e2225b 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -9012,7 +9012,7 @@ super_descr_get(PyObject *self, PyObject *obj, PyObject *type) } static int -super_init_without_args(PyFrameObject *f, PyCodeObject *co, +super_init_without_args(InterpreterFrame *cframe, PyCodeObject *co, PyTypeObject **type_p, PyObject **obj_p) { if (co->co_argcount == 0) { @@ -9021,13 +9021,13 @@ super_init_without_args(PyFrameObject *f, PyCodeObject *co, return -1; } - assert(f->f_frame->f_code->co_nlocalsplus > 0); - PyObject *firstarg = _PyFrame_GetLocalsArray(f->f_frame)[0]; + assert(cframe->f_code->co_nlocalsplus > 0); + PyObject *firstarg = _PyFrame_GetLocalsArray(cframe)[0]; // The first argument might be a cell. if (firstarg != NULL && (_PyLocals_GetKind(co->co_localspluskinds, 0) & CO_FAST_CELL)) { // "firstarg" is a cell here unless (very unlikely) super() // was called from the C-API before the first MAKE_CELL op. - if (f->f_frame->f_lasti >= 0) { + if (cframe->f_lasti >= 0) { assert(_Py_OPCODE(*co->co_firstinstr) == MAKE_CELL || _Py_OPCODE(*co->co_firstinstr) == COPY_FREE_VARS); assert(PyCell_Check(firstarg)); firstarg = PyCell_GET(firstarg); @@ -9047,7 +9047,7 @@ super_init_without_args(PyFrameObject *f, PyCodeObject *co, PyObject *name = PyTuple_GET_ITEM(co->co_localsplusnames, i); assert(PyUnicode_Check(name)); if (_PyUnicode_EqualToASCIIId(name, &PyId___class__)) { - PyObject *cell = _PyFrame_GetLocalsArray(f->f_frame)[i]; + PyObject *cell = _PyFrame_GetLocalsArray(cframe)[i]; if (cell == NULL || !PyCell_Check(cell)) { PyErr_SetString(PyExc_RuntimeError, "super(): bad __class__ cell"); @@ -9096,17 +9096,13 @@ super_init(PyObject *self, PyObject *args, PyObject *kwds) /* Call super(), without args -- fill in from __class__ and first local variable on the stack. */ PyThreadState *tstate = _PyThreadState_GET(); - PyFrameObject *frame = PyThreadState_GetFrame(tstate); - if (frame == NULL) { + InterpreterFrame *cframe = tstate->cframe->current_frame; + if (cframe == NULL) { PyErr_SetString(PyExc_RuntimeError, "super(): no current frame"); return -1; } - - PyCodeObject *code = PyFrame_GetCode(frame); - int res = super_init_without_args(frame, code, &type, &obj); - Py_DECREF(frame); - Py_DECREF(code); + int res = super_init_without_args(cframe, cframe->f_code, &type, &obj); if (res < 0) { return -1; From webhook-mailer at python.org Tue Feb 1 08:47:26 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 01 Feb 2022 13:47:26 -0000 Subject: [Python-checkins] bpo-46600: ./configure --with-pydebug uses -Og with clang (GH-31052) Message-ID: https://github.com/python/cpython/commit/0515eafe55ce7699e3bbc3c1555f08073d43b790 commit: 0515eafe55ce7699e3bbc3c1555f08073d43b790 branch: main author: Victor Stinner committer: vstinner date: 2022-02-01T14:47:12+01:00 summary: bpo-46600: ./configure --with-pydebug uses -Og with clang (GH-31052) Fix the test checking if the C compiler supports -Og option in the ./configure script to also use -Og on clang which supports it. files: A Misc/NEWS.d/next/Build/2022-02-01-14-07-37.bpo-46600.NNLnfj.rst M configure M configure.ac diff --git a/Misc/NEWS.d/next/Build/2022-02-01-14-07-37.bpo-46600.NNLnfj.rst b/Misc/NEWS.d/next/Build/2022-02-01-14-07-37.bpo-46600.NNLnfj.rst new file mode 100644 index 0000000000000..1fab655f9b271 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-02-01-14-07-37.bpo-46600.NNLnfj.rst @@ -0,0 +1,3 @@ +Fix the test checking if the C compiler supports ``-Og`` option in the +``./configure`` script to also use ``-Og`` on clang which supports it. Patch +by Victor Stinner. diff --git a/configure b/configure index da4af32cc17aa..015b51645f5be 100755 --- a/configure +++ b/configure @@ -7623,6 +7623,50 @@ case $CC in fi esac +# Check if CC supports -Og optimization level +save_CFLAGS=$CFLAGS +CFLAGS="-Og" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Og optimization level" >&5 +$as_echo_n "checking if $CC supports -Og optimization level... " >&6; } +if ${ac_cv_cc_supports_og+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + ac_cv_cc_supports_og=yes + +else + + ac_cv_cc_supports_og=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_supports_og" >&5 +$as_echo "$ac_cv_cc_supports_og" >&6; } +CFLAGS=$save_CFLAGS + +# Optimization messes up debuggers, so turn it off for +# debug builds. +PYDEBUG_CFLAGS="-O0" +if test "x$ac_cv_cc_supports_og" = xyes; then : + PYDEBUG_CFLAGS="-Og" +fi + # tweak OPT based on compiler and platform, only if the user didn't set # it on the command line @@ -7648,13 +7692,7 @@ then case $ac_cv_prog_cc_g in yes) if test "$Py_DEBUG" = 'true' ; then - # Optimization messes up debuggers, so turn it off for - # debug builds. - if "$CC" -v --help 2>/dev/null |grep -- -Og > /dev/null; then - OPT="-g -Og -Wall" - else - OPT="-g -O0 -Wall" - fi + OPT="-g $PYDEBUG_CFLAGS -Wall" else OPT="-g $WRAP -O3 -Wall" fi diff --git a/configure.ac b/configure.ac index 5a076646b96dd..6204747edfc25 100644 --- a/configure.ac +++ b/configure.ac @@ -1791,6 +1791,28 @@ case $CC in fi esac +# Check if CC supports -Og optimization level +_SAVE_VAR([CFLAGS]) +CFLAGS="-Og" +AC_CACHE_CHECK([if $CC supports -Og optimization level], + [ac_cv_cc_supports_og], + AC_COMPILE_IFELSE( + [ + AC_LANG_PROGRAM([[]], [[]]) + ],[ + ac_cv_cc_supports_og=yes + ],[ + ac_cv_cc_supports_og=no + ]) +) +_RESTORE_VAR([CFLAGS]) + +# Optimization messes up debuggers, so turn it off for +# debug builds. +PYDEBUG_CFLAGS="-O0" +AS_VAR_IF([ac_cv_cc_supports_og], [yes], + [PYDEBUG_CFLAGS="-Og"]) + # tweak OPT based on compiler and platform, only if the user didn't set # it on the command line AC_SUBST(OPT) @@ -1816,13 +1838,7 @@ then case $ac_cv_prog_cc_g in yes) if test "$Py_DEBUG" = 'true' ; then - # Optimization messes up debuggers, so turn it off for - # debug builds. - if "$CC" -v --help 2>/dev/null |grep -- -Og > /dev/null; then - OPT="-g -Og -Wall" - else - OPT="-g -O0 -Wall" - fi + OPT="-g $PYDEBUG_CFLAGS -Wall" else OPT="-g $WRAP -O3 -Wall" fi From webhook-mailer at python.org Tue Feb 1 08:56:34 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 01 Feb 2022 13:56:34 -0000 Subject: [Python-checkins] bpo-46584: remove check for `py2.3` from `ctypes/test_python_api` (GH-31024) Message-ID: https://github.com/python/cpython/commit/913e340a323c7e61ae6e4acbb1312b4342657bec commit: 913e340a323c7e61ae6e4acbb1312b4342657bec branch: main author: Nikita Sobolev committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T05:56:25-08:00 summary: bpo-46584: remove check for `py2.3` from `ctypes/test_python_api` (GH-31024) files: M Lib/ctypes/test/test_python_api.py diff --git a/Lib/ctypes/test/test_python_api.py b/Lib/ctypes/test/test_python_api.py index 9c137469c3b5a..49571f97bbe15 100644 --- a/Lib/ctypes/test/test_python_api.py +++ b/Lib/ctypes/test/test_python_api.py @@ -1,5 +1,5 @@ from ctypes import * -import unittest, sys +import unittest from test import support ################################################################ @@ -10,10 +10,6 @@ ################################################################ from sys import getrefcount as grc -if sys.version_info > (2, 4): - c_py_ssize_t = c_size_t -else: - c_py_ssize_t = c_int class PythonAPITestCase(unittest.TestCase): @@ -21,7 +17,7 @@ def test_PyBytes_FromStringAndSize(self): PyBytes_FromStringAndSize = pythonapi.PyBytes_FromStringAndSize PyBytes_FromStringAndSize.restype = py_object - PyBytes_FromStringAndSize.argtypes = c_char_p, c_py_ssize_t + PyBytes_FromStringAndSize.argtypes = c_char_p, c_size_t self.assertEqual(PyBytes_FromStringAndSize(b"abcdefghi", 3), b"abc") From webhook-mailer at python.org Tue Feb 1 09:42:46 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 01 Feb 2022 14:42:46 -0000 Subject: [Python-checkins] [3.10] bpo-46584: remove check for `py2.3` from `ctypes/test_python_api` (GH-31024) (GH-31054) Message-ID: https://github.com/python/cpython/commit/8765b01bcf6514602affcca66e7deeeb998f9cef commit: 8765b01bcf6514602affcca66e7deeeb998f9cef branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T06:42:37-08:00 summary: [3.10] bpo-46584: remove check for `py2.3` from `ctypes/test_python_api` (GH-31024) (GH-31054) (cherry picked from commit 913e340a323c7e61ae6e4acbb1312b4342657bec) Co-authored-by: Nikita Sobolev files: M Lib/ctypes/test/test_python_api.py diff --git a/Lib/ctypes/test/test_python_api.py b/Lib/ctypes/test/test_python_api.py index 9c137469c3b5a..49571f97bbe15 100644 --- a/Lib/ctypes/test/test_python_api.py +++ b/Lib/ctypes/test/test_python_api.py @@ -1,5 +1,5 @@ from ctypes import * -import unittest, sys +import unittest from test import support ################################################################ @@ -10,10 +10,6 @@ ################################################################ from sys import getrefcount as grc -if sys.version_info > (2, 4): - c_py_ssize_t = c_size_t -else: - c_py_ssize_t = c_int class PythonAPITestCase(unittest.TestCase): @@ -21,7 +17,7 @@ def test_PyBytes_FromStringAndSize(self): PyBytes_FromStringAndSize = pythonapi.PyBytes_FromStringAndSize PyBytes_FromStringAndSize.restype = py_object - PyBytes_FromStringAndSize.argtypes = c_char_p, c_py_ssize_t + PyBytes_FromStringAndSize.argtypes = c_char_p, c_size_t self.assertEqual(PyBytes_FromStringAndSize(b"abcdefghi", 3), b"abc") From webhook-mailer at python.org Tue Feb 1 09:42:54 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 01 Feb 2022 14:42:54 -0000 Subject: [Python-checkins] [3.9] bpo-46584: remove check for `py2.3` from `ctypes/test_python_api` (GH-31024) (GH-31053) Message-ID: https://github.com/python/cpython/commit/7368ca1b889d7fa16423e69034bf4c5fe7b00268 commit: 7368ca1b889d7fa16423e69034bf4c5fe7b00268 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T06:42:49-08:00 summary: [3.9] bpo-46584: remove check for `py2.3` from `ctypes/test_python_api` (GH-31024) (GH-31053) (cherry picked from commit 913e340a323c7e61ae6e4acbb1312b4342657bec) Co-authored-by: Nikita Sobolev files: M Lib/ctypes/test/test_python_api.py diff --git a/Lib/ctypes/test/test_python_api.py b/Lib/ctypes/test/test_python_api.py index 9c137469c3b5a..49571f97bbe15 100644 --- a/Lib/ctypes/test/test_python_api.py +++ b/Lib/ctypes/test/test_python_api.py @@ -1,5 +1,5 @@ from ctypes import * -import unittest, sys +import unittest from test import support ################################################################ @@ -10,10 +10,6 @@ ################################################################ from sys import getrefcount as grc -if sys.version_info > (2, 4): - c_py_ssize_t = c_size_t -else: - c_py_ssize_t = c_int class PythonAPITestCase(unittest.TestCase): @@ -21,7 +17,7 @@ def test_PyBytes_FromStringAndSize(self): PyBytes_FromStringAndSize = pythonapi.PyBytes_FromStringAndSize PyBytes_FromStringAndSize.restype = py_object - PyBytes_FromStringAndSize.argtypes = c_char_p, c_py_ssize_t + PyBytes_FromStringAndSize.argtypes = c_char_p, c_size_t self.assertEqual(PyBytes_FromStringAndSize(b"abcdefghi", 3), b"abc") From webhook-mailer at python.org Tue Feb 1 10:05:40 2022 From: webhook-mailer at python.org (markshannon) Date: Tue, 01 Feb 2022 15:05:40 -0000 Subject: [Python-checkins] bpo-46072: Add some object layout and allocation stats (GH-31051) Message-ID: https://github.com/python/cpython/commit/48be46ec1f3f8010570165daa1da4bf9961f3a83 commit: 48be46ec1f3f8010570165daa1da4bf9961f3a83 branch: main author: Mark Shannon committer: markshannon date: 2022-02-01T15:05:18Z summary: bpo-46072: Add some object layout and allocation stats (GH-31051) files: M Include/internal/pycore_code.h M Objects/dictobject.c M Objects/obmalloc.c M Python/specialize.c M Tools/scripts/summarize_stats.py diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 68b536f75ca5e..45c7752112b46 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -305,9 +305,19 @@ typedef struct _call_stats { uint64_t pyeval_calls; } CallStats; +typedef struct _object_stats { + uint64_t allocations; + uint64_t frees; + uint64_t new_values; + uint64_t dict_materialized_on_request; + uint64_t dict_materialized_new_key; + uint64_t dict_materialized_too_big; +} ObjectStats; + typedef struct _stats { OpcodeStats opcode_stats[256]; CallStats call_stats; + ObjectStats object_stats; } PyStats; extern PyStats _py_stats; @@ -316,6 +326,7 @@ extern PyStats _py_stats; #define STAT_DEC(opname, name) _py_stats.opcode_stats[opname].specialization.name-- #define OPCODE_EXE_INC(opname) _py_stats.opcode_stats[opname].execution_count++ #define CALL_STAT_INC(name) _py_stats.call_stats.name++ +#define OBJECT_STAT_INC(name) _py_stats.object_stats.name++ void _Py_PrintSpecializationStats(int to_file); @@ -326,6 +337,7 @@ PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); #define STAT_DEC(opname, name) ((void)0) #define OPCODE_EXE_INC(opname) ((void)0) #define CALL_STAT_INC(name) ((void)0) +#define OBJECT_STAT_INC(name) ((void)0) #endif diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 39be189e12000..0ad0f0b59c87e 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -114,6 +114,7 @@ As a consequence of this, split keys have a maximum size of 16. #include "Python.h" #include "pycore_bitutils.h" // _Py_bit_length #include "pycore_call.h" // _PyObject_CallNoArgs() +#include "pycore_code.h" // stats #include "pycore_dict.h" // PyDictKeysObject #include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() #include "pycore_object.h" // _PyObject_GC_TRACK() @@ -4990,6 +4991,7 @@ _PyObject_InitializeDict(PyObject *obj) return 0; } if (tp->tp_flags & Py_TPFLAGS_MANAGED_DICT) { + OBJECT_STAT_INC(new_values); return init_inline_values(obj, tp); } PyObject *dict; @@ -5033,6 +5035,7 @@ _PyObject_MakeDictFromInstanceAttributes(PyObject *obj, PyDictValues *values) { assert(Py_TYPE(obj)->tp_flags & Py_TPFLAGS_MANAGED_DICT); PyDictKeysObject *keys = CACHED_KEYS(Py_TYPE(obj)); + OBJECT_STAT_INC(dict_materialized_on_request); return make_dict_from_instance_attributes(keys, values); } @@ -5051,6 +5054,14 @@ _PyObject_StoreInstanceAttribute(PyObject *obj, PyDictValues *values, PyErr_SetObject(PyExc_AttributeError, name); return -1; } +#ifdef Py_STATS + if (shared_keys_usable_size(keys) > 14) { + OBJECT_STAT_INC(dict_materialized_too_big); + } + else { + OBJECT_STAT_INC(dict_materialized_new_key); + } +#endif PyObject *dict = make_dict_from_instance_attributes(keys, values); if (dict == NULL) { return -1; @@ -5183,6 +5194,7 @@ PyObject_GenericGetDict(PyObject *obj, void *context) PyObject **dictptr = _PyObject_ManagedDictPointer(obj); if (*values_ptr) { assert(*dictptr == NULL); + OBJECT_STAT_INC(dict_materialized_on_request); *dictptr = dict = make_dict_from_instance_attributes(CACHED_KEYS(tp), *values_ptr); if (dict != NULL) { *values_ptr = NULL; diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index e3df7e8cc410e..bad4dc0963921 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -1,5 +1,6 @@ #include "Python.h" #include "pycore_pymem.h" // _PyTraceMalloc_Config +#include "pycore_code.h" // stats #include #include // malloc() @@ -695,6 +696,7 @@ PyObject_Malloc(size_t size) /* see PyMem_RawMalloc() */ if (size > (size_t)PY_SSIZE_T_MAX) return NULL; + OBJECT_STAT_INC(allocations); return _PyObject.malloc(_PyObject.ctx, size); } @@ -704,6 +706,7 @@ PyObject_Calloc(size_t nelem, size_t elsize) /* see PyMem_RawMalloc() */ if (elsize != 0 && nelem > (size_t)PY_SSIZE_T_MAX / elsize) return NULL; + OBJECT_STAT_INC(allocations); return _PyObject.calloc(_PyObject.ctx, nelem, elsize); } @@ -719,6 +722,7 @@ PyObject_Realloc(void *ptr, size_t new_size) void PyObject_Free(void *ptr) { + OBJECT_STAT_INC(frees); _PyObject.free(_PyObject.ctx, ptr); } diff --git a/Python/specialize.c b/Python/specialize.c index aec94d9e60be4..5771a41dcfd2c 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -171,10 +171,22 @@ print_call_stats(FILE *out, CallStats *stats) fprintf(out, "Calls to Python functions inlined: %" PRIu64 "\n", stats->inlined_py_calls); } +static void +print_object_stats(FILE *out, ObjectStats *stats) +{ + fprintf(out, "Object allocations: %" PRIu64 "\n", stats->allocations); + fprintf(out, "Object frees: %" PRIu64 "\n", stats->frees); + fprintf(out, "Object new values: %" PRIu64 "\n", stats->new_values); + fprintf(out, "Object materialize dict (on request): %" PRIu64 "\n", stats->dict_materialized_on_request); + fprintf(out, "Object materialize dict (new key): %" PRIu64 "\n", stats->dict_materialized_new_key); + fprintf(out, "Object materialize dict (too big): %" PRIu64 "\n", stats->dict_materialized_too_big); +} + static void print_stats(FILE *out, PyStats *stats) { print_spec_stats(out, stats->opcode_stats); print_call_stats(out, &stats->call_stats); + print_object_stats(out, &stats->object_stats); } void diff --git a/Tools/scripts/summarize_stats.py b/Tools/scripts/summarize_stats.py index 34cbad5fa7ea2..2761dcb50985b 100644 --- a/Tools/scripts/summarize_stats.py +++ b/Tools/scripts/summarize_stats.py @@ -105,7 +105,17 @@ def main(): total += value for key, value in stats.items(): if "Calls to" in key: - print(f"{key}: {value} {100*value/total:0.1f}%") + print(f" {key}: {value} {100*value/total:0.1f}%") + print("Object stats:") + total = stats.get("Object new values") + for key, value in stats.items(): + if key.startswith("Object"): + if "materialize" in key: + print(f" {key}: {value} {100*value/total:0.1f}%") + else: + print(f" {key}: {value}") + total = 0 + if __name__ == "__main__": main() From webhook-mailer at python.org Tue Feb 1 10:58:48 2022 From: webhook-mailer at python.org (ned-deily) Date: Tue, 01 Feb 2022 15:58:48 -0000 Subject: [Python-checkins] bpo-45925: Update macOS installer to SQLite 3.37.2 (GH-30921) Message-ID: https://github.com/python/cpython/commit/0e4bef7a7f6f25a6f39755778c73e7026901611f commit: 0e4bef7a7f6f25a6f39755778c73e7026901611f branch: main author: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> committer: ned-deily date: 2022-02-01T10:58:29-05:00 summary: bpo-45925: Update macOS installer to SQLite 3.37.2 (GH-30921) Co-authored-by: Erlend Egeberg Aasland files: A Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst M Mac/BuildScript/build-installer.py diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 0f8924bb72740..7e89a3bc82ae2 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -358,9 +358,9 @@ def library_recipes(): ), ), dict( - name="SQLite 3.36.0", - url="https://sqlite.org/2021/sqlite-autoconf-3360000.tar.gz", - checksum='f5752052fc5b8e1b539af86a3671eac7', + name="SQLite 3.37.2", + url="https://sqlite.org/2022/sqlite-autoconf-3370200.tar.gz", + checksum='683cc5312ee74e71079c14d24b7a6d27', extra_cflags=('-Os ' '-DSQLITE_ENABLE_FTS5 ' '-DSQLITE_ENABLE_FTS4 ' diff --git a/Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst b/Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst new file mode 100644 index 0000000000000..3705266c154b7 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst @@ -0,0 +1 @@ +Update macOS installer to SQLite 3.37.2. \ No newline at end of file From webhook-mailer at python.org Tue Feb 1 11:05:11 2022 From: webhook-mailer at python.org (asvetlov) Date: Tue, 01 Feb 2022 16:05:11 -0000 Subject: [Python-checkins] bpo-46487: Add `get_write_buffer_limits` to Write and _SSLProtocol transports (GH-30958) Message-ID: https://github.com/python/cpython/commit/64568acbd88a88d54ac9b8215447f88280448dd5 commit: 64568acbd88a88d54ac9b8215447f88280448dd5 branch: main author: Emiya committer: asvetlov date: 2022-02-01T18:05:02+02:00 summary: bpo-46487: Add `get_write_buffer_limits` to Write and _SSLProtocol transports (GH-30958) Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst M Lib/asyncio/sslproto.py M Lib/asyncio/transports.py diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index cad25b26539f5..00fc16c014c9b 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -367,6 +367,12 @@ def get_write_buffer_size(self): """Return the current size of the write buffer.""" return self._ssl_protocol._transport.get_write_buffer_size() + def get_write_buffer_limits(self): + """Get the high and low watermarks for write flow control. + Return a tuple (low, high) where low and high are + positive number of bytes.""" + return self._ssl_protocol._transport.get_write_buffer_limits() + @property def _protocol_paused(self): # Required for sendfile fallback pause_writing/resume_writing logic diff --git a/Lib/asyncio/transports.py b/Lib/asyncio/transports.py index 45e155c94cad1..73b1fa2de416c 100644 --- a/Lib/asyncio/transports.py +++ b/Lib/asyncio/transports.py @@ -99,6 +99,12 @@ def get_write_buffer_size(self): """Return the current size of the write buffer.""" raise NotImplementedError + def get_write_buffer_limits(self): + """Get the high and low watermarks for write flow control. + Return a tuple (low, high) where low and high are + positive number of bytes.""" + raise NotImplementedError + def write(self, data): """Write some data bytes to the transport. diff --git a/Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst b/Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst new file mode 100644 index 0000000000000..adbc50a4bf9b7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst @@ -0,0 +1 @@ +Add the ``get_write_buffer_limits`` method to :class:`asyncio.transports.WriteTransport` and to the SSL transport. From webhook-mailer at python.org Tue Feb 1 11:29:11 2022 From: webhook-mailer at python.org (ned-deily) Date: Tue, 01 Feb 2022 16:29:11 -0000 Subject: [Python-checkins] bpo-45925: Update macOS installer to SQLite 3.37.2 (GH-30921) (GH-31057) Message-ID: https://github.com/python/cpython/commit/519eb6ad74f946a9aa7676e2d6579a3a765a8b50 commit: 519eb6ad74f946a9aa7676e2d6579a3a765a8b50 branch: 3.10 author: Ned Deily committer: ned-deily date: 2022-02-01T11:29:02-05:00 summary: bpo-45925: Update macOS installer to SQLite 3.37.2 (GH-30921) (GH-31057) Co-authored-by: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> Co-authored-by: Erlend Egeberg Aasland files: A Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst M Mac/BuildScript/build-installer.py diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 1eef40fc940f4..6720c0ba1785e 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -358,9 +358,9 @@ def library_recipes(): ), ), dict( - name="SQLite 3.35.5", - url="https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz", - checksum='d1d1aba394c8e0443077dc9f1a681bb8', + name="SQLite 3.37.2", + url="https://sqlite.org/2022/sqlite-autoconf-3370200.tar.gz", + checksum='683cc5312ee74e71079c14d24b7a6d27', extra_cflags=('-Os ' '-DSQLITE_ENABLE_FTS5 ' '-DSQLITE_ENABLE_FTS4 ' diff --git a/Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst b/Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst new file mode 100644 index 0000000000000..3705266c154b7 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst @@ -0,0 +1 @@ +Update macOS installer to SQLite 3.37.2. \ No newline at end of file From webhook-mailer at python.org Tue Feb 1 12:02:42 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 01 Feb 2022 17:02:42 -0000 Subject: [Python-checkins] bpo-45953: Preserve backward compatibility on some PyThreadState field names. (GH-31038) Message-ID: https://github.com/python/cpython/commit/f78be59c83c151d94902daef56218530c52e29e7 commit: f78be59c83c151d94902daef56218530c52e29e7 branch: main author: Eric Snow committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T09:02:25-08:00 summary: bpo-45953: Preserve backward compatibility on some PyThreadState field names. (GH-31038) The gevent project is using the two `PyThreadState` fields I renamed in gh-30590. This PR fixes the names. See #msg412046. files: M Include/cpython/pystate.h M Python/pystate.c diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index a35e5b803bd08..74dd44d6edccb 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -187,16 +187,19 @@ struct _ts { /* The following fields are here to avoid allocation during init. The data is exposed through PyThreadState pointer fields. These fields should not be accessed directly outside of init. + This is indicated by an underscore prefix on the field names. All other PyInterpreterState pointer fields are populated when needed and default to NULL. */ + // Note some fields do not have a leading underscore for backward + // compatibility. See https://bugs.python.org/issue45953#msg412046. /* The thread's exception stack entry. (Always the last entry.) */ - _PyErr_StackItem _exc_state; + _PyErr_StackItem exc_state; /* The bottom-most frame on the stack. */ - CFrame _root_cframe; + CFrame root_cframe; }; diff --git a/Python/pystate.c b/Python/pystate.c index 4b698f2b1d771..4378d78a8b781 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -776,9 +776,9 @@ init_threadstate(PyThreadState *tstate, tstate->recursion_limit = interp->ceval.recursion_limit, tstate->recursion_remaining = interp->ceval.recursion_limit, - tstate->exc_info = &tstate->_exc_state; + tstate->exc_info = &tstate->exc_state; - tstate->cframe = &tstate->_root_cframe; + tstate->cframe = &tstate->root_cframe; tstate->datastack_chunk = NULL; tstate->datastack_top = NULL; tstate->datastack_limit = NULL; @@ -1016,10 +1016,10 @@ PyThreadState_Clear(PyThreadState *tstate) Py_CLEAR(tstate->curexc_value); Py_CLEAR(tstate->curexc_traceback); - Py_CLEAR(tstate->_exc_state.exc_value); + Py_CLEAR(tstate->exc_state.exc_value); /* The stack of exception states should contain just this thread. */ - if (verbose && tstate->exc_info != &tstate->_exc_state) { + if (verbose && tstate->exc_info != &tstate->exc_state) { fprintf(stderr, "PyThreadState_Clear: warning: thread still has a generator\n"); } From webhook-mailer at python.org Tue Feb 1 12:12:36 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 01 Feb 2022 17:12:36 -0000 Subject: [Python-checkins] bpo-46600: Fix test_gdb.test_pycfunction() for clang -Og (GH-31058) Message-ID: https://github.com/python/cpython/commit/bebaa95fd0f44babf8b6bcffd8f2908c73ca259e commit: bebaa95fd0f44babf8b6bcffd8f2908c73ca259e branch: main author: Victor Stinner committer: vstinner date: 2022-02-01T18:12:26+01:00 summary: bpo-46600: Fix test_gdb.test_pycfunction() for clang -Og (GH-31058) Fix test_gdb.test_pycfunction() for Python built with clang -Og. Tolerate inlined functions in the gdb traceback. When _testcapimodule.c is built by clang -Og, _null_to_none() is inlined in meth_varargs() and so gdb returns _null_to_none() as the frame #1. If it's not inlined, meth_varargs() is the frame #1. files: A Misc/NEWS.d/next/Tests/2022-02-01-17-13-53.bpo-46600.FMCk8Z.rst M Lib/test/test_gdb.py diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index eaeb6fb8ff568..344fd3dd3f7fc 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -897,15 +897,19 @@ def test_gc(self): # to suppress these. See also the comment in DebuggerTests.get_stack_trace def test_pycfunction(self): 'Verify that "py-bt" displays invocations of PyCFunction instances' + # bpo-46600: If the compiler inlines _null_to_none() in meth_varargs() + # (ex: clang -Og), _null_to_none() is the frame #1. Otherwise, + # meth_varargs() is the frame #1. + expected_frame = r'#(1|2)' # Various optimizations multiply the code paths by which these are # called, so test a variety of calling conventions. - for func_name, args, expected_frame in ( - ('meth_varargs', '', 1), - ('meth_varargs_keywords', '', 1), - ('meth_o', '[]', 1), - ('meth_noargs', '', 1), - ('meth_fastcall', '', 1), - ('meth_fastcall_keywords', '', 1), + for func_name, args in ( + ('meth_varargs', ''), + ('meth_varargs_keywords', ''), + ('meth_o', '[]'), + ('meth_noargs', ''), + ('meth_fastcall', ''), + ('meth_fastcall_keywords', ''), ): for obj in ( '_testcapi', @@ -945,10 +949,9 @@ def bar(): # defined.' message in stderr. ignore_stderr=True, ) - self.assertIn( - f'#{expected_frame} https://github.com/python/cpython/commit/a22dd00f2da4f6ff96f58fd8d551f16bdb870c8d commit: a22dd00f2da4f6ff96f58fd8d551f16bdb870c8d branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ned-deily date: 2022-02-01T12:12:59-05:00 summary: bpo-45925: Update macOS installer to SQLite 3.37.2 (GH-30921) (GH-31057) (GH-31059) Co-authored-by: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> Co-authored-by: Erlend Egeberg Aasland (cherry picked from commit 519eb6ad74f946a9aa7676e2d6579a3a765a8b50) files: A Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst M Mac/BuildScript/build-installer.py diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 3f5acfdf56648..47a01056f2e5c 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -356,9 +356,9 @@ def library_recipes(): ), ), dict( - name="SQLite 3.35.5", - url="https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz", - checksum='d1d1aba394c8e0443077dc9f1a681bb8', + name="SQLite 3.37.2", + url="https://sqlite.org/2022/sqlite-autoconf-3370200.tar.gz", + checksum='683cc5312ee74e71079c14d24b7a6d27', extra_cflags=('-Os ' '-DSQLITE_ENABLE_FTS5 ' '-DSQLITE_ENABLE_FTS4 ' diff --git a/Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst b/Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst new file mode 100644 index 0000000000000..3705266c154b7 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst @@ -0,0 +1 @@ +Update macOS installer to SQLite 3.37.2. \ No newline at end of file From webhook-mailer at python.org Tue Feb 1 14:29:58 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 01 Feb 2022 19:29:58 -0000 Subject: [Python-checkins] bpo-46487: Add `get_write_buffer_limits` to Write and _SSLProtocol transports (GH-30958) Message-ID: https://github.com/python/cpython/commit/e4a6e549027b33bbe87f49fcfccc880243e49834 commit: e4a6e549027b33bbe87f49fcfccc880243e49834 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T11:29:45-08:00 summary: bpo-46487: Add `get_write_buffer_limits` to Write and _SSLProtocol transports (GH-30958) Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> (cherry picked from commit 64568acbd88a88d54ac9b8215447f88280448dd5) Co-authored-by: Emiya files: A Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst M Lib/asyncio/sslproto.py M Lib/asyncio/transports.py diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index cad25b26539f5..00fc16c014c9b 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -367,6 +367,12 @@ def get_write_buffer_size(self): """Return the current size of the write buffer.""" return self._ssl_protocol._transport.get_write_buffer_size() + def get_write_buffer_limits(self): + """Get the high and low watermarks for write flow control. + Return a tuple (low, high) where low and high are + positive number of bytes.""" + return self._ssl_protocol._transport.get_write_buffer_limits() + @property def _protocol_paused(self): # Required for sendfile fallback pause_writing/resume_writing logic diff --git a/Lib/asyncio/transports.py b/Lib/asyncio/transports.py index 45e155c94cad1..73b1fa2de416c 100644 --- a/Lib/asyncio/transports.py +++ b/Lib/asyncio/transports.py @@ -99,6 +99,12 @@ def get_write_buffer_size(self): """Return the current size of the write buffer.""" raise NotImplementedError + def get_write_buffer_limits(self): + """Get the high and low watermarks for write flow control. + Return a tuple (low, high) where low and high are + positive number of bytes.""" + raise NotImplementedError + def write(self, data): """Write some data bytes to the transport. diff --git a/Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst b/Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst new file mode 100644 index 0000000000000..adbc50a4bf9b7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst @@ -0,0 +1 @@ +Add the ``get_write_buffer_limits`` method to :class:`asyncio.transports.WriteTransport` and to the SSL transport. From webhook-mailer at python.org Tue Feb 1 14:30:08 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 01 Feb 2022 19:30:08 -0000 Subject: [Python-checkins] bpo-46487: Add `get_write_buffer_limits` to Write and _SSLProtocol transports (GH-30958) Message-ID: https://github.com/python/cpython/commit/e5e1441d41907f92cc3bb5de675a2c519068173d commit: e5e1441d41907f92cc3bb5de675a2c519068173d branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T11:30:03-08:00 summary: bpo-46487: Add `get_write_buffer_limits` to Write and _SSLProtocol transports (GH-30958) Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> (cherry picked from commit 64568acbd88a88d54ac9b8215447f88280448dd5) Co-authored-by: Emiya files: A Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst M Lib/asyncio/sslproto.py M Lib/asyncio/transports.py diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index cad25b26539f5..00fc16c014c9b 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -367,6 +367,12 @@ def get_write_buffer_size(self): """Return the current size of the write buffer.""" return self._ssl_protocol._transport.get_write_buffer_size() + def get_write_buffer_limits(self): + """Get the high and low watermarks for write flow control. + Return a tuple (low, high) where low and high are + positive number of bytes.""" + return self._ssl_protocol._transport.get_write_buffer_limits() + @property def _protocol_paused(self): # Required for sendfile fallback pause_writing/resume_writing logic diff --git a/Lib/asyncio/transports.py b/Lib/asyncio/transports.py index 45e155c94cad1..73b1fa2de416c 100644 --- a/Lib/asyncio/transports.py +++ b/Lib/asyncio/transports.py @@ -99,6 +99,12 @@ def get_write_buffer_size(self): """Return the current size of the write buffer.""" raise NotImplementedError + def get_write_buffer_limits(self): + """Get the high and low watermarks for write flow control. + Return a tuple (low, high) where low and high are + positive number of bytes.""" + raise NotImplementedError + def write(self, data): """Write some data bytes to the transport. diff --git a/Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst b/Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst new file mode 100644 index 0000000000000..adbc50a4bf9b7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst @@ -0,0 +1 @@ +Add the ``get_write_buffer_limits`` method to :class:`asyncio.transports.WriteTransport` and to the SSL transport. From webhook-mailer at python.org Tue Feb 1 16:41:43 2022 From: webhook-mailer at python.org (brandtbucher) Date: Tue, 01 Feb 2022 21:41:43 -0000 Subject: [Python-checkins] bpo-46528: Simplify BUILD_TUPLE/UNPACK_SEQUENCE folding (GH-31039) Message-ID: https://github.com/python/cpython/commit/a0e55a571cf01885fd5826266c37abaee307c309 commit: a0e55a571cf01885fd5826266c37abaee307c309 branch: main author: Brandt Bucher committer: brandtbucher date: 2022-02-01T13:41:32-08:00 summary: bpo-46528: Simplify BUILD_TUPLE/UNPACK_SEQUENCE folding (GH-31039) files: M Lib/test/test_peepholer.py M Python/compile.c diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 659f654b5c676..2df5883ce7918 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -126,7 +126,7 @@ def test_pack_unpack(self): code = compile(line,'','single') self.assertInBytecode(code, elem) self.assertNotInBytecode(code, 'BUILD_TUPLE') - self.assertNotInBytecode(code, 'UNPACK_TUPLE') + self.assertNotInBytecode(code, 'UNPACK_SEQUENCE') self.check_lnotab(code) def test_folding_of_tuples_of_constants(self): diff --git a/Python/compile.c b/Python/compile.c index eda708e21f16a..1d2d567e85e93 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -8661,29 +8661,22 @@ optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts) } /* Try to fold tuples of constants. - Skip over BUILD_SEQN 1 UNPACK_SEQN 1. - Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2. - Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */ + Skip over BUILD_TUPLE(1) UNPACK_SEQUENCE(1). + Replace BUILD_TUPLE(2) UNPACK_SEQUENCE(2) with SWAP(2). + Replace BUILD_TUPLE(3) UNPACK_SEQUENCE(3) with SWAP(3). */ case BUILD_TUPLE: if (nextop == UNPACK_SEQUENCE && oparg == bb->b_instr[i+1].i_oparg) { switch(oparg) { case 1: inst->i_opcode = NOP; bb->b_instr[i+1].i_opcode = NOP; - break; + continue; case 2: - inst->i_opcode = SWAP; - inst->i_oparg = 2; - bb->b_instr[i+1].i_opcode = NOP; - i--; - break; case 3: - inst->i_opcode = SWAP; - inst->i_oparg = 3; - bb->b_instr[i+1].i_opcode = NOP; - i--; + inst->i_opcode = NOP; + bb->b_instr[i+1].i_opcode = SWAP; + continue; } - break; } if (i >= oparg) { if (fold_tuple_on_constants(c, inst-oparg, oparg, consts)) { From webhook-mailer at python.org Tue Feb 1 17:34:02 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 01 Feb 2022 22:34:02 -0000 Subject: [Python-checkins] bpo-14916: use specified tokenizer fd for file input (GH-31006) Message-ID: https://github.com/python/cpython/commit/89b13042fcfc95bae21a49806a205ef62f1cdd73 commit: 89b13042fcfc95bae21a49806a205ef62f1cdd73 branch: main author: Paul m. p. P committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T14:33:52-08:00 summary: bpo-14916: use specified tokenizer fd for file input (GH-31006) @pablogsal, sorry i failed to rebase to main, so i recreated https://github.com/python/cpython/pull/22190#issuecomment-1024633392 > PyRun_InteractiveOne\*() functions allow to explicitily set fd instead of stdin. but stdin was hardcoded in readline call. > This patch does not fix target file for prompt unlike original bpo one : prompt fd is unrelated to tokenizer source which could be read only. It is more of a bugfix regarding the docs : actual documentation say "prompt the user" so one would expect prompt to go on stdout not a file for both PyRun_InteractiveOne\*() and PyRun_InteractiveLoop\*(). Automerge-Triggered-By: GH:pablogsal files: A Misc/NEWS.d/next/C API/2020-09-11-02-50-41.bpo-14916.QN1Y03.rst M Parser/tokenizer.c diff --git a/Misc/NEWS.d/next/C API/2020-09-11-02-50-41.bpo-14916.QN1Y03.rst b/Misc/NEWS.d/next/C API/2020-09-11-02-50-41.bpo-14916.QN1Y03.rst new file mode 100644 index 0000000000000..885cfc53aba38 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-09-11-02-50-41.bpo-14916.QN1Y03.rst @@ -0,0 +1 @@ +Fixed bug in the tokenizer that prevented ``PyRun_InteractiveOne`` from parsing from the provided FD. diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index cd4254f8b9077..5b5cbdb809ebe 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -855,7 +855,7 @@ tok_underflow_interactive(struct tok_state *tok) { tok->done = E_INTERACT_STOP; return 1; } - char *newtok = PyOS_Readline(stdin, stdout, tok->prompt); + char *newtok = PyOS_Readline(tok->fp ? tok->fp : stdin, stdout, tok->prompt); if (newtok != NULL) { char *translated = translate_newlines(newtok, 0, tok); PyMem_Free(newtok); From webhook-mailer at python.org Tue Feb 1 20:20:33 2022 From: webhook-mailer at python.org (terryjreedy) Date: Wed, 02 Feb 2022 01:20:33 -0000 Subject: [Python-checkins] bpo-46591: Make About IDLE doc link label clickable (GH-30251) Message-ID: https://github.com/python/cpython/commit/53c78080573b3bae4c4e782b9f47dce48aac9688 commit: 53c78080573b3bae4c4e782b9f47dce48aac9688 branch: main author: Wes <5124946+wesinator at users.noreply.github.com> committer: terryjreedy date: 2022-02-01T20:20:23-05:00 summary: bpo-46591: Make About IDLE doc link label clickable (GH-30251) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/help_about.py M Lib/idlelib/idle_test/htest.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index ed2b05ed662e8..34b2c08a92256 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -4,6 +4,8 @@ Released on 2022-10-03 ========================= +bpo-46591: Make the IDLE doc URL on the About IDLE dialog clickable. + bpo-45296: Clarify close, quit, and exit in IDLE. In the File menu, 'Close' and 'Exit' are now 'Close Window' (the current one) and 'Exit' is now 'Exit IDLE' (by closing all windows). In Shell, 'quit()' and diff --git a/Lib/idlelib/help_about.py b/Lib/idlelib/help_about.py index 019aacbd0faa2..c59f494599806 100644 --- a/Lib/idlelib/help_about.py +++ b/Lib/idlelib/help_about.py @@ -3,6 +3,7 @@ """ import os import sys +import webbrowser from platform import python_version, architecture from tkinter import Toplevel, Frame, Label, Button, PhotoImage @@ -94,6 +95,7 @@ def create_widgets(self): f"{version[:version.rindex('.')]}/library/idle.html", justify=LEFT, fg=self.fg, bg=self.bg) docs.grid(row=7, column=0, columnspan=2, sticky=W, padx=10, pady=0) + docs.bind("", lambda event: webbrowser.open(docs['text'])) Frame(frame_background, borderwidth=1, relief=SUNKEN, height=2, bg=self.bg).grid(row=8, column=0, sticky=EW, diff --git a/Lib/idlelib/idle_test/htest.py b/Lib/idlelib/idle_test/htest.py index 666ff4cb84851..d297f8aa0094e 100644 --- a/Lib/idlelib/idle_test/htest.py +++ b/Lib/idlelib/idle_test/htest.py @@ -77,8 +77,8 @@ def _wrapper(parent): # htest # 'kwds': {'title': 'help_about test', '_htest': True, }, - 'msg': "Test every button. Ensure Python, TK and IDLE versions " - "are correctly displayed.\n [Close] to exit.", + 'msg': "Click on URL to open in default browser.\n" + "Verify x.y.z versions and test each button, including Close.\n " } # TODO implement ^\; adding '' to function does not work. diff --git a/Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst b/Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst new file mode 100644 index 0000000000000..7785faa1c4cbf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst @@ -0,0 +1 @@ +Make the IDLE doc URL on the About IDLE dialog clickable. \ No newline at end of file From webhook-mailer at python.org Tue Feb 1 20:47:18 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 02 Feb 2022 01:47:18 -0000 Subject: [Python-checkins] bpo-46591: Make About IDLE doc link label clickable (GH-30251) Message-ID: https://github.com/python/cpython/commit/a1869e385b17bfdfe8d9850047f5b2dbb88e58fa commit: a1869e385b17bfdfe8d9850047f5b2dbb88e58fa branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T17:47:09-08:00 summary: bpo-46591: Make About IDLE doc link label clickable (GH-30251) Co-authored-by: Terry Jan Reedy (cherry picked from commit 53c78080573b3bae4c4e782b9f47dce48aac9688) Co-authored-by: Wes <5124946+wesinator at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/help_about.py M Lib/idlelib/idle_test/htest.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 175c907951034..2ba8d581bbc73 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -4,6 +4,8 @@ Released on 2022-05-16 ========================= +bpo-46591: Make the IDLE doc URL on the About IDLE dialog clickable. + bpo-45296: Clarify close, quit, and exit in IDLE. In the File menu, 'Close' and 'Exit' are now 'Close Window' (the current one) and 'Exit' is now 'Exit IDLE' (by closing all windows). In Shell, 'quit()' and diff --git a/Lib/idlelib/help_about.py b/Lib/idlelib/help_about.py index 019aacbd0faa2..c59f494599806 100644 --- a/Lib/idlelib/help_about.py +++ b/Lib/idlelib/help_about.py @@ -3,6 +3,7 @@ """ import os import sys +import webbrowser from platform import python_version, architecture from tkinter import Toplevel, Frame, Label, Button, PhotoImage @@ -94,6 +95,7 @@ def create_widgets(self): f"{version[:version.rindex('.')]}/library/idle.html", justify=LEFT, fg=self.fg, bg=self.bg) docs.grid(row=7, column=0, columnspan=2, sticky=W, padx=10, pady=0) + docs.bind("", lambda event: webbrowser.open(docs['text'])) Frame(frame_background, borderwidth=1, relief=SUNKEN, height=2, bg=self.bg).grid(row=8, column=0, sticky=EW, diff --git a/Lib/idlelib/idle_test/htest.py b/Lib/idlelib/idle_test/htest.py index 666ff4cb84851..d297f8aa0094e 100644 --- a/Lib/idlelib/idle_test/htest.py +++ b/Lib/idlelib/idle_test/htest.py @@ -77,8 +77,8 @@ def _wrapper(parent): # htest # 'kwds': {'title': 'help_about test', '_htest': True, }, - 'msg': "Test every button. Ensure Python, TK and IDLE versions " - "are correctly displayed.\n [Close] to exit.", + 'msg': "Click on URL to open in default browser.\n" + "Verify x.y.z versions and test each button, including Close.\n " } # TODO implement ^\; adding '' to function does not work. diff --git a/Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst b/Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst new file mode 100644 index 0000000000000..7785faa1c4cbf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst @@ -0,0 +1 @@ +Make the IDLE doc URL on the About IDLE dialog clickable. \ No newline at end of file From webhook-mailer at python.org Tue Feb 1 20:47:49 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 02 Feb 2022 01:47:49 -0000 Subject: [Python-checkins] bpo-44359: Fix test_ftplib unhandled thread exceptions (GH-31069) Message-ID: https://github.com/python/cpython/commit/0611eafc709cbe8a2a0bdde082d25df0c5034de7 commit: 0611eafc709cbe8a2a0bdde082d25df0c5034de7 branch: main author: Victor Stinner committer: vstinner date: 2022-02-02T02:47:40+01:00 summary: bpo-44359: Fix test_ftplib unhandled thread exceptions (GH-31069) test_ftplib now silently ignores socket errors to prevent logging unhandled threading exceptions. files: A Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst M Lib/test/test_ftplib.py diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py index 56e3d8ab8528a..2f5cc06ca4b9a 100644 --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -56,6 +56,13 @@ "type=file;perm=r;unique==SGP2; file \xAE non-ascii char\r\n") +def default_error_handler(): + # bpo-44359: Silently ignore socket errors. Such errors occur when a client + # socket is closed, in TestFTPClass.tearDown() and makepasv() tests, and + # the server gets an error on its side. + pass + + class DummyDTPHandler(asynchat.async_chat): dtp_conn_closed = False @@ -87,7 +94,7 @@ def push(self, what): super(DummyDTPHandler, self).push(what.encode(self.encoding)) def handle_error(self): - raise Exception + default_error_handler() class DummyFTPHandler(asynchat.async_chat): @@ -137,7 +144,7 @@ def found_terminator(self): self.push('550 command "%s" not understood.' %cmd) def handle_error(self): - raise Exception + default_error_handler() def push(self, data): asynchat.async_chat.push(self, data.encode(self.encoding) + b'\r\n') @@ -315,7 +322,7 @@ def writable(self): return 0 def handle_error(self): - raise Exception + default_error_handler() if ssl is not None: @@ -418,7 +425,7 @@ def recv(self, buffer_size): raise def handle_error(self): - raise Exception + default_error_handler() def close(self): if (isinstance(self.socket, ssl.SSLSocket) and diff --git a/Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst b/Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst new file mode 100644 index 0000000000000..00c29b1ca4089 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst @@ -0,0 +1,2 @@ +test_ftplib now silently ignores socket errors to prevent logging unhandled +threading exceptions. Patch by Victor Stinner. From webhook-mailer at python.org Tue Feb 1 20:47:55 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 02 Feb 2022 01:47:55 -0000 Subject: [Python-checkins] bpo-46591: Make About IDLE doc link label clickable (GH-30251) Message-ID: https://github.com/python/cpython/commit/7dee93c2d223a080f410f6901987e9d363743471 commit: 7dee93c2d223a080f410f6901987e9d363743471 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T17:47:51-08:00 summary: bpo-46591: Make About IDLE doc link label clickable (GH-30251) Co-authored-by: Terry Jan Reedy (cherry picked from commit 53c78080573b3bae4c4e782b9f47dce48aac9688) Co-authored-by: Wes <5124946+wesinator at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/help_about.py M Lib/idlelib/idle_test/htest.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index bb78289ba8261..724709a29ff63 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -4,6 +4,8 @@ Released on 2022-05-16 ========================= +bpo-46591: Make the IDLE doc URL on the About IDLE dialog clickable. + bpo-45296: Clarify close, quit, and exit in IDLE. In the File menu, 'Close' and 'Exit' are now 'Close Window' (the current one) and 'Exit' is now 'Exit IDLE' (by closing all windows). In Shell, 'quit()' and diff --git a/Lib/idlelib/help_about.py b/Lib/idlelib/help_about.py index 019aacbd0faa2..c59f494599806 100644 --- a/Lib/idlelib/help_about.py +++ b/Lib/idlelib/help_about.py @@ -3,6 +3,7 @@ """ import os import sys +import webbrowser from platform import python_version, architecture from tkinter import Toplevel, Frame, Label, Button, PhotoImage @@ -94,6 +95,7 @@ def create_widgets(self): f"{version[:version.rindex('.')]}/library/idle.html", justify=LEFT, fg=self.fg, bg=self.bg) docs.grid(row=7, column=0, columnspan=2, sticky=W, padx=10, pady=0) + docs.bind("", lambda event: webbrowser.open(docs['text'])) Frame(frame_background, borderwidth=1, relief=SUNKEN, height=2, bg=self.bg).grid(row=8, column=0, sticky=EW, diff --git a/Lib/idlelib/idle_test/htest.py b/Lib/idlelib/idle_test/htest.py index 666ff4cb84851..d297f8aa0094e 100644 --- a/Lib/idlelib/idle_test/htest.py +++ b/Lib/idlelib/idle_test/htest.py @@ -77,8 +77,8 @@ def _wrapper(parent): # htest # 'kwds': {'title': 'help_about test', '_htest': True, }, - 'msg': "Test every button. Ensure Python, TK and IDLE versions " - "are correctly displayed.\n [Close] to exit.", + 'msg': "Click on URL to open in default browser.\n" + "Verify x.y.z versions and test each button, including Close.\n " } # TODO implement ^\; adding '' to function does not work. diff --git a/Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst b/Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst new file mode 100644 index 0000000000000..7785faa1c4cbf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst @@ -0,0 +1 @@ +Make the IDLE doc URL on the About IDLE dialog clickable. \ No newline at end of file From webhook-mailer at python.org Tue Feb 1 21:12:35 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 02 Feb 2022 02:12:35 -0000 Subject: [Python-checkins] bpo-44359: Fix test_ftplib unhandled thread exceptions (GH-31069) Message-ID: https://github.com/python/cpython/commit/85b421fbff23ff41c52fa5bde191920b3701f0d0 commit: 85b421fbff23ff41c52fa5bde191920b3701f0d0 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T18:12:27-08:00 summary: bpo-44359: Fix test_ftplib unhandled thread exceptions (GH-31069) test_ftplib now silently ignores socket errors to prevent logging unhandled threading exceptions. (cherry picked from commit 0611eafc709cbe8a2a0bdde082d25df0c5034de7) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst M Lib/test/test_ftplib.py diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py index 56e3d8ab8528a..2f5cc06ca4b9a 100644 --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -56,6 +56,13 @@ "type=file;perm=r;unique==SGP2; file \xAE non-ascii char\r\n") +def default_error_handler(): + # bpo-44359: Silently ignore socket errors. Such errors occur when a client + # socket is closed, in TestFTPClass.tearDown() and makepasv() tests, and + # the server gets an error on its side. + pass + + class DummyDTPHandler(asynchat.async_chat): dtp_conn_closed = False @@ -87,7 +94,7 @@ def push(self, what): super(DummyDTPHandler, self).push(what.encode(self.encoding)) def handle_error(self): - raise Exception + default_error_handler() class DummyFTPHandler(asynchat.async_chat): @@ -137,7 +144,7 @@ def found_terminator(self): self.push('550 command "%s" not understood.' %cmd) def handle_error(self): - raise Exception + default_error_handler() def push(self, data): asynchat.async_chat.push(self, data.encode(self.encoding) + b'\r\n') @@ -315,7 +322,7 @@ def writable(self): return 0 def handle_error(self): - raise Exception + default_error_handler() if ssl is not None: @@ -418,7 +425,7 @@ def recv(self, buffer_size): raise def handle_error(self): - raise Exception + default_error_handler() def close(self): if (isinstance(self.socket, ssl.SSLSocket) and diff --git a/Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst b/Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst new file mode 100644 index 0000000000000..00c29b1ca4089 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst @@ -0,0 +1,2 @@ +test_ftplib now silently ignores socket errors to prevent logging unhandled +threading exceptions. Patch by Victor Stinner. From webhook-mailer at python.org Tue Feb 1 21:17:16 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 02 Feb 2022 02:17:16 -0000 Subject: [Python-checkins] bpo-44359: Fix test_ftplib unhandled thread exceptions (GH-31069) Message-ID: https://github.com/python/cpython/commit/0371e5d7f1248abb0712fc98c3135d01d265cec8 commit: 0371e5d7f1248abb0712fc98c3135d01d265cec8 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-01T18:16:58-08:00 summary: bpo-44359: Fix test_ftplib unhandled thread exceptions (GH-31069) test_ftplib now silently ignores socket errors to prevent logging unhandled threading exceptions. (cherry picked from commit 0611eafc709cbe8a2a0bdde082d25df0c5034de7) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst M Lib/test/test_ftplib.py diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py index 6f8f977b3950d..b51e5440800cd 100644 --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -49,6 +49,13 @@ "type=file;perm=r;unique==SGP2; file \xAE non-ascii char\r\n") +def default_error_handler(): + # bpo-44359: Silently ignore socket errors. Such errors occur when a client + # socket is closed, in TestFTPClass.tearDown() and makepasv() tests, and + # the server gets an error on its side. + pass + + class DummyDTPHandler(asynchat.async_chat): dtp_conn_closed = False @@ -80,7 +87,7 @@ def push(self, what): super(DummyDTPHandler, self).push(what.encode(self.encoding)) def handle_error(self): - raise Exception + default_error_handler() class DummyFTPHandler(asynchat.async_chat): @@ -130,7 +137,7 @@ def found_terminator(self): self.push('550 command "%s" not understood.' %cmd) def handle_error(self): - raise Exception + default_error_handler() def push(self, data): asynchat.async_chat.push(self, data.encode(self.encoding) + b'\r\n') @@ -308,7 +315,7 @@ def writable(self): return 0 def handle_error(self): - raise Exception + default_error_handler() if ssl is not None: @@ -411,7 +418,7 @@ def recv(self, buffer_size): raise def handle_error(self): - raise Exception + default_error_handler() def close(self): if (isinstance(self.socket, ssl.SSLSocket) and diff --git a/Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst b/Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst new file mode 100644 index 0000000000000..00c29b1ca4089 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst @@ -0,0 +1,2 @@ +test_ftplib now silently ignores socket errors to prevent logging unhandled +threading exceptions. Patch by Victor Stinner. From webhook-mailer at python.org Tue Feb 1 21:38:23 2022 From: webhook-mailer at python.org (ned-deily) Date: Wed, 02 Feb 2022 02:38:23 -0000 Subject: [Python-checkins] bpo-46602: Do not append conftest.c (GH-31062) Message-ID: https://github.com/python/cpython/commit/b1288964e31069bdf81abe560c82874f6f620928 commit: b1288964e31069bdf81abe560c82874f6f620928 branch: main author: adanhawth <36526095+adanhawth at users.noreply.github.com> committer: ned-deily date: 2022-02-01T21:38:15-05:00 summary: bpo-46602: Do not append conftest.c (GH-31062) The heredoc creation statements use >> to append conftest.c. This can cause tricky build issues if the file is not correctly removed prior to its name being reused (such name is reused several times for different contextual tests during the build). One such result from appending may cause #include to persist when testing to acquire PLATFORM_TRIPLET. This can then lead to downstream issues concerning SOABI. files: A Misc/NEWS.d/next/Build/2022-02-02-02-06-07.bpo-46602.8GaOZ2.rst M configure M configure.ac diff --git a/Misc/NEWS.d/next/Build/2022-02-02-02-06-07.bpo-46602.8GaOZ2.rst b/Misc/NEWS.d/next/Build/2022-02-02-02-06-07.bpo-46602.8GaOZ2.rst new file mode 100644 index 0000000000000..a1123b44ecd59 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-02-02-02-06-07.bpo-46602.8GaOZ2.rst @@ -0,0 +1 @@ +Tidied up configure.ac so that conftest.c is truncated rather than appended. This assists in the case where the 'rm' of conftest.c fails to happen between tests. Downstream issues such as a clobbered SOABI can result. \ No newline at end of file diff --git a/configure b/configure index 015b51645f5be..9097c0514b57c 100755 --- a/configure +++ b/configure @@ -5942,7 +5942,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } -cat >> conftest.c < conftest.c <&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the Android API level" >&5 $as_echo_n "checking for the Android API level... " >&6; } -cat >> conftest.c < conftest.c <> conftest.c < conftest.c <> conftest.c < conftest.c < https://github.com/python/cpython/commit/abcc3d75f6e570519cb37c62130a2295c6928bff commit: abcc3d75f6e570519cb37c62130a2295c6928bff branch: main author: Jelle Zijlstra committer: gvanrossum date: 2022-02-01T18:48:55-08:00 summary: bpo-46414: Add typing.reveal_type (#30646) Co-authored-by: Nikita Sobolev files: A Misc/NEWS.d/next/Library/2022-01-17-10-00-02.bpo-46414.Ld0b_y.rst M Doc/library/typing.rst M Lib/test/test_typing.py M Lib/typing.py diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index cdfd403a34ef9..9007c0daf59a4 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1932,6 +1932,37 @@ Functions and decorators runtime we intentionally don't check anything (we want this to be as fast as possible). +.. function:: reveal_type(obj) + + Reveal the inferred static type of an expression. + + When a static type checker encounters a call to this function, + it emits a diagnostic with the type of the argument. For example:: + + x: int = 1 + reveal_type(x) # Revealed type is "builtins.int" + + This can be useful when you want to debug how your type checker + handles a particular piece of code. + + The function returns its argument unchanged, which allows using + it within an expression:: + + x = reveal_type(1) # Revealed type is "builtins.int" + + Most type checkers support ``reveal_type()`` anywhere, even if the + name is not imported from ``typing``. Importing the name from + ``typing`` allows your code to run without runtime errors and + communicates intent more clearly. + + At runtime, this function prints the runtime type of its argument to stderr + and returns it unchanged:: + + x = reveal_type(1) # prints "Runtime type is int" + print(x) # prints "1" + + .. versionadded:: 3.11 + .. decorator:: overload The ``@overload`` decorator allows describing functions and methods diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 090d4c70d3d84..85f74064458f2 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -20,6 +20,7 @@ from typing import get_type_hints from typing import get_origin, get_args from typing import is_typeddict +from typing import reveal_type from typing import no_type_check, no_type_check_decorator from typing import Type from typing import NamedTuple, TypedDict @@ -34,7 +35,7 @@ import weakref import types -from test.support import import_helper +from test.support import import_helper, captured_stderr from test import mod_generics_cache from test import _typed_dict_helper @@ -5289,6 +5290,14 @@ def bar(self): self.assertIn('baz', dir(Foo[int])) +class RevealTypeTests(BaseTestCase): + def test_reveal_type(self): + obj = object() + with captured_stderr() as stderr: + self.assertIs(obj, reveal_type(obj)) + self.assertEqual(stderr.getvalue(), "Runtime type is 'object'\n") + + class AllTests(BaseTestCase): """Tests for __all__.""" diff --git a/Lib/typing.py b/Lib/typing.py index dac9c6c4f87cf..0cf9755022e9b 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -130,6 +130,7 @@ def _idfunc(_, x): 'overload', 'ParamSpecArgs', 'ParamSpecKwargs', + 'reveal_type', 'runtime_checkable', 'Text', 'TYPE_CHECKING', @@ -2675,3 +2676,23 @@ class re(metaclass=_DeprecatedType): re.__name__ = __name__ + '.re' sys.modules[re.__name__] = re + + +def reveal_type(obj: T, /) -> T: + """Reveal the inferred type of a variable. + + When a static type checker encounters a call to ``reveal_type()``, + it will emit the inferred type of the argument:: + + x: int = 1 + reveal_type(x) + + Running a static type checker (e.g., ``mypy``) on this example + will produce output similar to 'Revealed type is "builtins.int"'. + + At runtime, the function prints the runtime type of the + argument and returns it unchanged. + + """ + print(f"Runtime type is {type(obj).__name__!r}", file=sys.stderr) + return obj diff --git a/Misc/NEWS.d/next/Library/2022-01-17-10-00-02.bpo-46414.Ld0b_y.rst b/Misc/NEWS.d/next/Library/2022-01-17-10-00-02.bpo-46414.Ld0b_y.rst new file mode 100644 index 0000000000000..0fdbfa77d9bc8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-17-10-00-02.bpo-46414.Ld0b_y.rst @@ -0,0 +1 @@ +Add :func:`typing.reveal_type`. Patch by Jelle Zijlstra. From webhook-mailer at python.org Tue Feb 1 23:18:25 2022 From: webhook-mailer at python.org (rhettinger) Date: Wed, 02 Feb 2022 04:18:25 -0000 Subject: [Python-checkins] Fix minor details in the Counter docs (GH-31029) Message-ID: https://github.com/python/cpython/commit/f77beacf015e9bf8762e9b9a9a631396b05d4d9a commit: f77beacf015e9bf8762e9b9a9a631396b05d4d9a branch: main author: Raymond Hettinger committer: rhettinger date: 2022-02-01T22:18:11-06:00 summary: Fix minor details in the Counter docs (GH-31029) files: M Doc/library/collections.rst M Lib/collections/__init__.py diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index b8a717d883c09..b97bc425de9eb 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -271,7 +271,7 @@ For example:: .. versionadded:: 3.1 .. versionchanged:: 3.7 As a :class:`dict` subclass, :class:`Counter` - Inherited the capability to remember insertion order. Math operations + inherited the capability to remember insertion order. Math operations on *Counter* objects also preserve order. Results are ordered according to when an element is first encountered in the left operand and then by the order encountered in the right operand. @@ -366,19 +366,26 @@ Several mathematical operations are provided for combining :class:`Counter` objects to produce multisets (counters that have counts greater than zero). Addition and subtraction combine counters by adding or subtracting the counts of corresponding elements. Intersection and union return the minimum and -maximum of corresponding counts. Each operation can accept inputs with signed +maximum of corresponding counts. Equality and inclusion compare +corresponding counts. Each operation can accept inputs with signed counts, but the output will exclude results with counts of zero or less. +.. doctest:: + >>> c = Counter(a=3, b=1) >>> d = Counter(a=1, b=2) >>> c + d # add two counters together: c[x] + d[x] Counter({'a': 4, 'b': 3}) >>> c - d # subtract (keeping only positive counts) Counter({'a': 2}) - >>> c & d # intersection: min(c[x], d[x]) # doctest: +SKIP + >>> c & d # intersection: min(c[x], d[x]) Counter({'a': 1, 'b': 1}) >>> c | d # union: max(c[x], d[x]) Counter({'a': 3, 'b': 2}) + >>> c == d # equality: c[x] == d[x] + False + >>> c <= d # inclusion: c[x] <= d[x] + False Unary addition and subtraction are shortcuts for adding an empty counter or subtracting from an empty counter. diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index fa8b30985a435..264435cb41b2f 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -736,6 +736,10 @@ def __repr__(self): # To strip negative and zero counts, add-in an empty counter: # c += Counter() # + # Results are ordered according to when an element is first + # encountered in the left operand and then by the order + # encountered in the right operand. + # # When the multiplicities are all zero or one, multiset operations # are guaranteed to be equivalent to the corresponding operations # for regular sets. From webhook-mailer at python.org Tue Feb 1 23:18:56 2022 From: webhook-mailer at python.org (rhettinger) Date: Wed, 02 Feb 2022 04:18:56 -0000 Subject: [Python-checkins] Add recipe for subslices (GH-31028) Message-ID: https://github.com/python/cpython/commit/06a491179f2de106d34c6b4973a32dce08fc4247 commit: 06a491179f2de106d34c6b4973a32dce08fc4247 branch: main author: Raymond Hettinger committer: rhettinger date: 2022-02-01T22:18:52-06:00 summary: Add recipe for subslices (GH-31028) files: M Doc/library/itertools.rst diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index f0d93ebb6b21a..8c3b7842f7f6a 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -893,6 +893,12 @@ which incur interpreter overhead. yield from it return true_iterator(), remainder_iterator() + def subslices(seq): + "Return all contiguous non-empty subslices of a sequence" + # subslices('ABCD') --> A AB ABC ABCD B BC BCD C CD D + slices = starmap(slice, combinations(range(len(seq) + 1), 2)) + return map(operator.getitem, repeat(seq), slices) + def powerset(iterable): "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" s = list(iterable) @@ -1188,6 +1194,9 @@ which incur interpreter overhead. >>> ''.join(remainder) 'dEfGhI' + >>> list(subslices('ABCD')) + ['A', 'AB', 'ABC', 'ABCD', 'B', 'BC', 'BCD', 'C', 'CD', 'D'] + >>> list(powerset([1,2,3])) [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)] From webhook-mailer at python.org Wed Feb 2 00:28:29 2022 From: webhook-mailer at python.org (rhettinger) Date: Wed, 02 Feb 2022 05:28:29 -0000 Subject: [Python-checkins] Fix minor details in the Counter docs (GH-31029) (GH-31072) Message-ID: https://github.com/python/cpython/commit/e480def027b68a570dc0c2e235463842373dc741 commit: e480def027b68a570dc0c2e235463842373dc741 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: rhettinger date: 2022-02-01T23:28:07-06:00 summary: Fix minor details in the Counter docs (GH-31029) (GH-31072) files: M Doc/library/collections.rst M Lib/collections/__init__.py diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index b8a717d883c09..b97bc425de9eb 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -271,7 +271,7 @@ For example:: .. versionadded:: 3.1 .. versionchanged:: 3.7 As a :class:`dict` subclass, :class:`Counter` - Inherited the capability to remember insertion order. Math operations + inherited the capability to remember insertion order. Math operations on *Counter* objects also preserve order. Results are ordered according to when an element is first encountered in the left operand and then by the order encountered in the right operand. @@ -366,19 +366,26 @@ Several mathematical operations are provided for combining :class:`Counter` objects to produce multisets (counters that have counts greater than zero). Addition and subtraction combine counters by adding or subtracting the counts of corresponding elements. Intersection and union return the minimum and -maximum of corresponding counts. Each operation can accept inputs with signed +maximum of corresponding counts. Equality and inclusion compare +corresponding counts. Each operation can accept inputs with signed counts, but the output will exclude results with counts of zero or less. +.. doctest:: + >>> c = Counter(a=3, b=1) >>> d = Counter(a=1, b=2) >>> c + d # add two counters together: c[x] + d[x] Counter({'a': 4, 'b': 3}) >>> c - d # subtract (keeping only positive counts) Counter({'a': 2}) - >>> c & d # intersection: min(c[x], d[x]) # doctest: +SKIP + >>> c & d # intersection: min(c[x], d[x]) Counter({'a': 1, 'b': 1}) >>> c | d # union: max(c[x], d[x]) Counter({'a': 3, 'b': 2}) + >>> c == d # equality: c[x] == d[x] + False + >>> c <= d # inclusion: c[x] <= d[x] + False Unary addition and subtraction are shortcuts for adding an empty counter or subtracting from an empty counter. diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index bae0805d6686c..818588f740318 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -766,6 +766,10 @@ def __repr__(self): # To strip negative and zero counts, add-in an empty counter: # c += Counter() # + # Results are ordered according to when an element is first + # encountered in the left operand and then by the order + # encountered in the right operand. + # # When the multiplicities are all zero or one, multiset operations # are guaranteed to be equivalent to the corresponding operations # for regular sets. From webhook-mailer at python.org Wed Feb 2 03:15:30 2022 From: webhook-mailer at python.org (asvetlov) Date: Wed, 02 Feb 2022 08:15:30 -0000 Subject: [Python-checkins] bpo-46583: remove unused `sys.version_info` check from `selectors` (GH-31023) Message-ID: https://github.com/python/cpython/commit/3483aa65dfebfc60a87ea9db3f20da84be41f606 commit: 3483aa65dfebfc60a87ea9db3f20da84be41f606 branch: main author: Nikita Sobolev committer: asvetlov date: 2022-02-02T10:15:02+02:00 summary: bpo-46583: remove unused `sys.version_info` check from `selectors` (GH-31023) files: M Lib/selectors.py diff --git a/Lib/selectors.py b/Lib/selectors.py index bb15a1cb1bada..af6a4f94b5008 100644 --- a/Lib/selectors.py +++ b/Lib/selectors.py @@ -50,12 +50,11 @@ def _fileobj_to_fd(fileobj): Object used to associate a file object to its backing file descriptor, selected event mask, and attached data. """ -if sys.version_info >= (3, 5): - SelectorKey.fileobj.__doc__ = 'File object registered.' - SelectorKey.fd.__doc__ = 'Underlying file descriptor.' - SelectorKey.events.__doc__ = 'Events that must be waited for on this file object.' - SelectorKey.data.__doc__ = ('''Optional opaque data associated to this file object. - For example, this could be used to store a per-client session ID.''') +SelectorKey.fileobj.__doc__ = 'File object registered.' +SelectorKey.fd.__doc__ = 'Underlying file descriptor.' +SelectorKey.events.__doc__ = 'Events that must be waited for on this file object.' +SelectorKey.data.__doc__ = ('''Optional opaque data associated to this file object. +For example, this could be used to store a per-client session ID.''') class _SelectorMapping(Mapping): From webhook-mailer at python.org Wed Feb 2 03:16:44 2022 From: webhook-mailer at python.org (asvetlov) Date: Wed, 02 Feb 2022 08:16:44 -0000 Subject: [Python-checkins] Remove Python 3.3 compatibility code from overlapped.c (GH-31049) Message-ID: https://github.com/python/cpython/commit/a05866ce3e617e2b74c205f27a89eab63c7b3101 commit: a05866ce3e617e2b74c205f27a89eab63c7b3101 branch: main author: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> committer: asvetlov date: 2022-02-02T10:16:36+02:00 summary: Remove Python 3.3 compatibility code from overlapped.c (GH-31049) files: M Modules/overlapped.c diff --git a/Modules/overlapped.c b/Modules/overlapped.c index 7c4570896bc59..2ba48c8b845f5 100644 --- a/Modules/overlapped.c +++ b/Modules/overlapped.c @@ -23,12 +23,6 @@ # define T_POINTER T_ULONGLONG #endif -/* Compatibility with Python 3.3 */ -#if PY_VERSION_HEX < 0x03040000 -# define PyMem_RawMalloc PyMem_Malloc -# define PyMem_RawFree PyMem_Free -#endif - #define F_HANDLE F_POINTER #define F_ULONG_PTR F_POINTER #define F_DWORD "k" From webhook-mailer at python.org Wed Feb 2 06:02:01 2022 From: webhook-mailer at python.org (markshannon) Date: Wed, 02 Feb 2022 11:02:01 -0000 Subject: [Python-checkins] bpo-46072: Add some frame stats. (GH-31060) Message-ID: https://github.com/python/cpython/commit/187930f74c44e460ba09c60ba5d9bb4fac543d8f commit: 187930f74c44e460ba09c60ba5d9bb4fac543d8f branch: main author: Mark Shannon committer: markshannon date: 2022-02-02T11:01:33Z summary: bpo-46072: Add some frame stats. (GH-31060) files: M Include/internal/pycore_code.h M Objects/frameobject.c M Python/ceval.c M Python/frame.c M Python/pystate.c M Python/specialize.c M Tools/scripts/summarize_stats.py diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 45c7752112b46..3897ea0ab6a1a 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -303,6 +303,8 @@ typedef struct _opcode_stats { typedef struct _call_stats { uint64_t inlined_py_calls; uint64_t pyeval_calls; + uint64_t frames_pushed; + uint64_t frame_objects_created; } CallStats; typedef struct _object_stats { diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 81ad4cc65d150..15da1325d1480 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -794,6 +794,7 @@ init_frame(InterpreterFrame *frame, PyFunctionObject *func, PyObject *locals) PyFrameObject* _PyFrame_New_NoTrack(PyCodeObject *code) { + CALL_STAT_INC(frame_objects_created); int slots = code->co_nlocalsplus + code->co_stacksize; PyFrameObject *f = PyObject_GC_NewVar(PyFrameObject, &PyFrame_Type, slots); if (f == NULL) { diff --git a/Python/ceval.c b/Python/ceval.c index b69d5aa9d3206..70748e8911f9f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2242,6 +2242,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr if (new_frame == NULL) { goto error; } + CALL_STAT_INC(frames_pushed); _PyFrame_InitializeSpecials(new_frame, getitem, NULL, code->co_nlocalsplus); STACK_SHRINK(2); @@ -4660,6 +4661,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr if (new_frame == NULL) { goto error; } + CALL_STAT_INC(inlined_py_calls); STACK_SHRINK(argcount); for (int i = 0; i < argcount; i++) { new_frame->localsplus[i] = stack_pointer[i]; @@ -4690,6 +4692,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr if (new_frame == NULL) { goto error; } + CALL_STAT_INC(inlined_py_calls); STACK_SHRINK(argcount); for (int i = 0; i < argcount; i++) { new_frame->localsplus[i] = stack_pointer[i]; @@ -4708,7 +4711,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr _PyFrame_SetStackPointer(frame, stack_pointer); new_frame->previous = frame; frame = cframe.current_frame = new_frame; - CALL_STAT_INC(inlined_py_calls); goto start_frame; } @@ -6078,6 +6080,7 @@ _PyEvalFramePushAndInit(PyThreadState *tstate, PyFunctionObject *func, { PyCodeObject * code = (PyCodeObject *)func->func_code; size_t size = code->co_nlocalsplus + code->co_stacksize + FRAME_SPECIALS_SIZE; + CALL_STAT_INC(frames_pushed); InterpreterFrame *frame = _PyThreadState_BumpFramePointer(tstate, size); if (frame == NULL) { goto fail; diff --git a/Python/frame.c b/Python/frame.c index 771de7583be79..ca7c5f9c94e07 100644 --- a/Python/frame.c +++ b/Python/frame.c @@ -1,6 +1,7 @@ #include "Python.h" #include "frameobject.h" +#include "pycore_code.h" // stats #include "pycore_frame.h" #include "pycore_object.h" // _PyObject_GC_UNTRACK() #include "opcode.h" @@ -113,6 +114,7 @@ _PyFrame_Push(PyThreadState *tstate, PyFunctionObject *func) { PyCodeObject *code = (PyCodeObject *)func->func_code; size_t size = code->co_nlocalsplus + code->co_stacksize + FRAME_SPECIALS_SIZE; + CALL_STAT_INC(frames_pushed); InterpreterFrame *new_frame = _PyThreadState_BumpFramePointer(tstate, size); if (new_frame == NULL) { return NULL; diff --git a/Python/pystate.c b/Python/pystate.c index 4378d78a8b781..77467944e2afb 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -3,6 +3,7 @@ #include "Python.h" #include "pycore_ceval.h" +#include "pycore_code.h" // stats #include "pycore_frame.h" #include "pycore_initconfig.h" #include "pycore_object.h" // _PyType_InitCache() @@ -2219,6 +2220,7 @@ _PyThreadState_PushFrame(PyThreadState *tstate, PyFunctionObject *func, PyObject int nlocalsplus = code->co_nlocalsplus; size_t size = nlocalsplus + code->co_stacksize + FRAME_SPECIALS_SIZE; + CALL_STAT_INC(frames_pushed); InterpreterFrame *frame = _PyThreadState_BumpFramePointer(tstate, size); if (frame == NULL) { return NULL; diff --git a/Python/specialize.c b/Python/specialize.c index 5771a41dcfd2c..9290fbe823956 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -169,6 +169,8 @@ print_call_stats(FILE *out, CallStats *stats) { fprintf(out, "Calls to PyEval_EvalDefault: %" PRIu64 "\n", stats->pyeval_calls); fprintf(out, "Calls to Python functions inlined: %" PRIu64 "\n", stats->inlined_py_calls); + fprintf(out, "Frames pushed: %" PRIu64 "\n", stats->frames_pushed); + fprintf(out, "Frame objects created: %" PRIu64 "\n", stats->frame_objects_created); } static void diff --git a/Tools/scripts/summarize_stats.py b/Tools/scripts/summarize_stats.py index 2761dcb50985b..319b251c854a8 100644 --- a/Tools/scripts/summarize_stats.py +++ b/Tools/scripts/summarize_stats.py @@ -106,6 +106,9 @@ def main(): for key, value in stats.items(): if "Calls to" in key: print(f" {key}: {value} {100*value/total:0.1f}%") + for key, value in stats.items(): + if key.startswith("Frame"): + print(f" {key}: {value} {100*value/total:0.1f}%") print("Object stats:") total = stats.get("Object new values") for key, value in stats.items(): From webhook-mailer at python.org Wed Feb 2 07:38:50 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 02 Feb 2022 12:38:50 -0000 Subject: [Python-checkins] bpo-43012: remove `pathlib._Accessor` (GH-25701) Message-ID: https://github.com/python/cpython/commit/08f8301b21648d58d053e1a513db8ed32fbf37dd commit: 08f8301b21648d58d053e1a513db8ed32fbf37dd branch: main author: Barney Gale committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-02T04:38:25-08:00 summary: bpo-43012: remove `pathlib._Accessor` (GH-25701) Per Pitrou: > The original intent for the ?accessor? thing was to have a variant that did all accesses under a filesystem tree in a race condition-free way using openat and friends. It turned out to be much too hairy to actually implement, so was entirely abandoned, but the accessor abstraction was left there. https://discuss.python.org/t/make-pathlib-extensible/3428/2 Accessors are: - Lacking any internal purpose - '_NormalAccessor' is the only implementation - Lacking any firm conceptual difference to `Path` objects themselves (inc. subclasses) - Non-public, i.e. underscore prefixed - '_Accessor' and '_NormalAccessor' - Unofficially used to implement customized `Path` objects, but once once [bpo-24132]() is addressed there will be a supported route for that. This patch preserves all existing behaviour. files: A Misc/NEWS.d/next/Library/2022-01-05-03-09-29.bpo-43012.RVhLIL.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 1603325180795..920e1f425a0c0 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -275,93 +275,6 @@ def make_uri(self, path): _posix_flavour = _PosixFlavour() -class _Accessor: - """An accessor implements a particular (system-specific or not) way of - accessing paths on the filesystem.""" - - -class _NormalAccessor(_Accessor): - - stat = os.stat - - open = io.open - - listdir = os.listdir - - scandir = os.scandir - - chmod = os.chmod - - mkdir = os.mkdir - - unlink = os.unlink - - if hasattr(os, "link"): - link = os.link - else: - def link(self, src, dst): - raise NotImplementedError("os.link() not available on this system") - - rmdir = os.rmdir - - rename = os.rename - - replace = os.replace - - if hasattr(os, "symlink"): - symlink = os.symlink - else: - def symlink(self, src, dst, target_is_directory=False): - raise NotImplementedError("os.symlink() not available on this system") - - def touch(self, path, mode=0o666, exist_ok=True): - if exist_ok: - # First try to bump modification time - # Implementation note: GNU touch uses the UTIME_NOW option of - # the utimensat() / futimens() functions. - try: - os.utime(path, None) - except OSError: - # Avoid exception chaining - pass - else: - return - flags = os.O_CREAT | os.O_WRONLY - if not exist_ok: - flags |= os.O_EXCL - fd = os.open(path, flags, mode) - os.close(fd) - - if hasattr(os, "readlink"): - readlink = os.readlink - else: - def readlink(self, path): - raise NotImplementedError("os.readlink() not available on this system") - - def owner(self, path): - try: - import pwd - return pwd.getpwuid(self.stat(path).st_uid).pw_name - except ImportError: - raise NotImplementedError("Path.owner() is unsupported on this system") - - def group(self, path): - try: - import grp - return grp.getgrgid(self.stat(path).st_gid).gr_name - except ImportError: - raise NotImplementedError("Path.group() is unsupported on this system") - - getcwd = os.getcwd - - expanduser = staticmethod(os.path.expanduser) - - realpath = staticmethod(os.path.realpath) - - -_normal_accessor = _NormalAccessor() - - # # Globbing helpers # @@ -402,7 +315,7 @@ def select_from(self, parent_path): path_cls = type(parent_path) is_dir = path_cls.is_dir exists = path_cls.exists - scandir = parent_path._accessor.scandir + scandir = path_cls._scandir if not is_dir(parent_path): return iter([]) return self._select_from(parent_path, is_dir, exists, scandir) @@ -949,7 +862,6 @@ class Path(PurePath): object. You can also instantiate a PosixPath or WindowsPath directly, but cannot instantiate a WindowsPath on a POSIX system or vice versa. """ - _accessor = _normal_accessor __slots__ = () def __new__(cls, *args, **kwargs): @@ -988,7 +900,7 @@ def cwd(cls): """Return a new path pointing to the current working directory (as returned by os.getcwd()). """ - return cls(cls._accessor.getcwd()) + return cls(os.getcwd()) @classmethod def home(cls): @@ -1005,16 +917,22 @@ def samefile(self, other_path): try: other_st = other_path.stat() except AttributeError: - other_st = self._accessor.stat(other_path) + other_st = self.__class__(other_path).stat() return os.path.samestat(st, other_st) def iterdir(self): """Iterate over the files in this directory. Does not yield any result for the special paths '.' and '..'. """ - for name in self._accessor.listdir(self): + for name in os.listdir(self): yield self._make_child_relpath(name) + def _scandir(self): + # bpo-24132: a future version of pathlib will support subclassing of + # pathlib.Path to customize how the filesystem is accessed. This + # includes scandir(), which is used to implement glob(). + return os.scandir(self) + def glob(self, pattern): """Iterate over this subtree and yield all existing files (of any kind, including directories) matching the given relative pattern. @@ -1050,7 +968,7 @@ def absolute(self): """ if self.is_absolute(): return self - return self._from_parts([self._accessor.getcwd()] + self._parts) + return self._from_parts([self.cwd()] + self._parts) def resolve(self, strict=False): """ @@ -1064,7 +982,7 @@ def check_eloop(e): raise RuntimeError("Symlink loop from %r" % e.filename) try: - s = self._accessor.realpath(self, strict=strict) + s = os.path.realpath(self, strict=strict) except OSError as e: check_eloop(e) raise @@ -1084,19 +1002,28 @@ def stat(self, *, follow_symlinks=True): Return the result of the stat() system call on this path, like os.stat() does. """ - return self._accessor.stat(self, follow_symlinks=follow_symlinks) + return os.stat(self, follow_symlinks=follow_symlinks) def owner(self): """ Return the login name of the file owner. """ - return self._accessor.owner(self) + try: + import pwd + return pwd.getpwuid(self.stat().st_uid).pw_name + except ImportError: + raise NotImplementedError("Path.owner() is unsupported on this system") def group(self): """ Return the group name of the file gid. """ - return self._accessor.group(self) + + try: + import grp + return grp.getgrgid(self.stat().st_gid).gr_name + except ImportError: + raise NotImplementedError("Path.group() is unsupported on this system") def open(self, mode='r', buffering=-1, encoding=None, errors=None, newline=None): @@ -1106,8 +1033,7 @@ def open(self, mode='r', buffering=-1, encoding=None, """ if "b" not in mode: encoding = io.text_encoding(encoding) - return self._accessor.open(self, mode, buffering, encoding, errors, - newline) + return io.open(self, mode, buffering, encoding, errors, newline) def read_bytes(self): """ @@ -1148,21 +1074,38 @@ def readlink(self): """ Return the path to which the symbolic link points. """ - path = self._accessor.readlink(self) - return self._from_parts((path,)) + if not hasattr(os, "readlink"): + raise NotImplementedError("os.readlink() not available on this system") + return self._from_parts((os.readlink(self),)) def touch(self, mode=0o666, exist_ok=True): """ Create this file with the given access mode, if it doesn't exist. """ - self._accessor.touch(self, mode, exist_ok) + + if exist_ok: + # First try to bump modification time + # Implementation note: GNU touch uses the UTIME_NOW option of + # the utimensat() / futimens() functions. + try: + os.utime(self, None) + except OSError: + # Avoid exception chaining + pass + else: + return + flags = os.O_CREAT | os.O_WRONLY + if not exist_ok: + flags |= os.O_EXCL + fd = os.open(self, flags, mode) + os.close(fd) def mkdir(self, mode=0o777, parents=False, exist_ok=False): """ Create a new directory at this given path. """ try: - self._accessor.mkdir(self, mode) + os.mkdir(self, mode) except FileNotFoundError: if not parents or self.parent == self: raise @@ -1178,7 +1121,7 @@ def chmod(self, mode, *, follow_symlinks=True): """ Change the permissions of the path, like os.chmod(). """ - self._accessor.chmod(self, mode, follow_symlinks=follow_symlinks) + os.chmod(self, mode, follow_symlinks=follow_symlinks) def lchmod(self, mode): """ @@ -1193,7 +1136,7 @@ def unlink(self, missing_ok=False): If the path is a directory, use rmdir() instead. """ try: - self._accessor.unlink(self) + os.unlink(self) except FileNotFoundError: if not missing_ok: raise @@ -1202,7 +1145,7 @@ def rmdir(self): """ Remove this directory. The directory must be empty. """ - self._accessor.rmdir(self) + os.rmdir(self) def lstat(self): """ @@ -1221,7 +1164,7 @@ def rename(self, target): Returns the new Path instance pointing to the target path. """ - self._accessor.rename(self, target) + os.rename(self, target) return self.__class__(target) def replace(self, target): @@ -1234,7 +1177,7 @@ def replace(self, target): Returns the new Path instance pointing to the target path. """ - self._accessor.replace(self, target) + os.replace(self, target) return self.__class__(target) def symlink_to(self, target, target_is_directory=False): @@ -1242,7 +1185,9 @@ def symlink_to(self, target, target_is_directory=False): Make this path a symlink pointing to the target path. Note the order of arguments (link, target) is the reverse of os.symlink. """ - self._accessor.symlink(target, self, target_is_directory) + if not hasattr(os, "symlink"): + raise NotImplementedError("os.symlink() not available on this system") + os.symlink(target, self, target_is_directory) def hardlink_to(self, target): """ @@ -1250,7 +1195,9 @@ def hardlink_to(self, target): Note the order of arguments (self, target) is the reverse of os.link's. """ - self._accessor.link(target, self) + if not hasattr(os, "link"): + raise NotImplementedError("os.link() not available on this system") + os.link(target, self) def link_to(self, target): """ @@ -1268,7 +1215,7 @@ def link_to(self, target): "for removal in Python 3.12. " "Use pathlib.Path.hardlink_to() instead.", DeprecationWarning, stacklevel=2) - self._accessor.link(self, target) + self.__class__(target).hardlink_to(self) # Convenience functions for querying the stat results @@ -1425,7 +1372,7 @@ def expanduser(self): """ if (not (self._drv or self._root) and self._parts and self._parts[0][:1] == '~'): - homedir = self._accessor.expanduser(self._parts[0]) + homedir = os.path.expanduser(self._parts[0]) if homedir[:1] == "~": raise RuntimeError("Could not determine home directory.") return self._from_parts([homedir] + self._parts[1:]) diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 3fbf1d1f7cd9d..5e46b4ffeae10 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1,3 +1,4 @@ +import contextlib import collections.abc import io import os @@ -1459,7 +1460,7 @@ def test_cwd(self): def test_absolute_common(self): P = self.cls - with mock.patch("pathlib._normal_accessor.getcwd") as getcwd: + with mock.patch("os.getcwd") as getcwd: getcwd.return_value = BASE # Simple relative paths. @@ -1738,21 +1739,18 @@ def test_glob_permissions(self): # Patching is needed to avoid relying on the filesystem # to return the order of the files as the error will not # happen if the symlink is the last item. - - with mock.patch("os.scandir") as scandir: - scandir.return_value = sorted(os.scandir(base)) + real_scandir = os.scandir + def my_scandir(path): + with real_scandir(path) as scandir_it: + entries = list(scandir_it) + entries.sort(key=lambda entry: entry.name) + return contextlib.nullcontext(entries) + + with mock.patch("os.scandir", my_scandir): self.assertEqual(len(set(base.glob("*"))), 3) - - subdir.mkdir() - - with mock.patch("os.scandir") as scandir: - scandir.return_value = sorted(os.scandir(base)) + subdir.mkdir() self.assertEqual(len(set(base.glob("*"))), 4) - - subdir.chmod(000) - - with mock.patch("os.scandir") as scandir: - scandir.return_value = sorted(os.scandir(base)) + subdir.chmod(000) self.assertEqual(len(set(base.glob("*"))), 4) def _check_resolve(self, p, expected, strict=True): @@ -2199,6 +2197,7 @@ def test_mkdir_concurrent_parent_creation(self): p = self.cls(BASE, 'dirCPC%d' % pattern_num) self.assertFalse(p.exists()) + real_mkdir = os.mkdir def my_mkdir(path, mode=0o777): path = str(path) # Emulate another process that would create the directory @@ -2207,15 +2206,15 @@ def my_mkdir(path, mode=0o777): # function is called at most 5 times (dirCPC/dir1/dir2, # dirCPC/dir1, dirCPC, dirCPC/dir1, dirCPC/dir1/dir2). if pattern.pop(): - os.mkdir(path, mode) # From another process. + real_mkdir(path, mode) # From another process. concurrently_created.add(path) - os.mkdir(path, mode) # Our real call. + real_mkdir(path, mode) # Our real call. pattern = [bool(pattern_num & (1 << n)) for n in range(5)] concurrently_created = set() p12 = p / 'dir1' / 'dir2' try: - with mock.patch("pathlib._normal_accessor.mkdir", my_mkdir): + with mock.patch("os.mkdir", my_mkdir): p12.mkdir(parents=True, exist_ok=False) except FileExistsError: self.assertIn(str(p12), concurrently_created) @@ -2676,7 +2675,7 @@ def test_absolute(self): self.assertEqual(str(P(share + 'a\\b').absolute()), share + 'a\\b') # UNC relative paths. - with mock.patch("pathlib._normal_accessor.getcwd") as getcwd: + with mock.patch("os.getcwd") as getcwd: getcwd.return_value = share self.assertEqual(str(P().absolute()), share) diff --git a/Misc/NEWS.d/next/Library/2022-01-05-03-09-29.bpo-43012.RVhLIL.rst b/Misc/NEWS.d/next/Library/2022-01-05-03-09-29.bpo-43012.RVhLIL.rst new file mode 100644 index 0000000000000..c6a6723a96b34 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-05-03-09-29.bpo-43012.RVhLIL.rst @@ -0,0 +1,2 @@ +The pathlib module's obsolete and internal ``_Accessor`` class has been +removed to prepare the terrain for upcoming enhancements to the module. From webhook-mailer at python.org Wed Feb 2 08:50:56 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 02 Feb 2022 13:50:56 -0000 Subject: [Python-checkins] [3.9] bpo-45703: Invalidate _NamespacePath cache on importlib.invalidate_cache (GH-29384) (GH-30922) (GH-31076) Message-ID: https://github.com/python/cpython/commit/8d239bfdcc98f4e4a592d9cda569380a9c15a5c0 commit: 8d239bfdcc98f4e4a592d9cda569380a9c15a5c0 branch: 3.9 author: Petr Viktorin committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-02T05:50:43-08:00 summary: [3.9] bpo-45703: Invalidate _NamespacePath cache on importlib.invalidate_cache (GH-29384) (GH-30922) (GH-31076) Consider the following directory structure: . ??? PATH1 ??? namespace ??? sub1 ??? __init__.py And both PATH1 and PATH2 in sys path: $ PYTHONPATH=PATH1:PATH2 python3.11 >>> import namespace >>> import namespace.sub1 >>> namespace.__path__ _NamespacePath(['.../PATH1/namespace']) >>> ... While this interpreter still runs, PATH2/namespace/sub2 is created: . ??? PATH1 ? ??? namespace ? ??? sub1 ? ??? __init__.py ??? PATH2 ??? namespace ??? sub2 ??? __init__.py The newly created module cannot be imported: >>> ... >>> namespace.__path__ _NamespacePath(['.../PATH1/namespace']) >>> import namespace.sub2 Traceback (most recent call last): File "", line 1, in ModuleNotFoundError: No module named 'namespace.sub2' Calling importlib.invalidate_caches() now newly allows to import it: >>> import importlib >>> importlib.invalidate_caches() >>> namespace.__path__ _NamespacePath(['.../PATH1/namespace']) >>> import namespace.sub2 >>> namespace.__path__ _NamespacePath(['.../PATH1/namespace', '.../PATH2/namespace']) This was not previously possible. Co-Authored-By: Miro Hron?ok Automerge-Triggered-By: GH:encukou files: A Misc/NEWS.d/next/Library/2021-11-03-13-41-49.bpo-45703.35AagL.rst M Lib/importlib/_bootstrap_external.py M Lib/test/test_importlib/test_namespace_pkgs.py M Python/importlib_external.h diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index fe31f437dac2ab..f3828b10e1c1ba 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -1209,10 +1209,15 @@ class _NamespacePath: using path_finder. For top-level modules, the parent module's path is sys.path.""" + # When invalidate_caches() is called, this epoch is incremented + # https://bugs.python.org/issue45703 + _epoch = 0 + def __init__(self, name, path, path_finder): self._name = name self._path = path self._last_parent_path = tuple(self._get_parent_path()) + self._last_epoch = self._epoch self._path_finder = path_finder def _find_parent_path_names(self): @@ -1232,7 +1237,7 @@ def _get_parent_path(self): def _recalculate(self): # If the parent's path has changed, recalculate _path parent_path = tuple(self._get_parent_path()) # Make a copy - if parent_path != self._last_parent_path: + if parent_path != self._last_parent_path or self._epoch != self._last_epoch: spec = self._path_finder(self._name, parent_path) # Note that no changes are made if a loader is returned, but we # do remember the new parent path @@ -1240,6 +1245,7 @@ def _recalculate(self): if spec.submodule_search_locations: self._path = spec.submodule_search_locations self._last_parent_path = parent_path # Save the copy + self._last_epoch = self._epoch return self._path def __iter__(self): @@ -1320,6 +1326,9 @@ def invalidate_caches(cls): del sys.path_importer_cache[name] elif hasattr(finder, 'invalidate_caches'): finder.invalidate_caches() + # Also invalidate the caches of _NamespacePaths + # https://bugs.python.org/issue45703 + _NamespacePath._epoch += 1 @classmethod def _path_hooks(cls, path): diff --git a/Lib/test/test_importlib/test_namespace_pkgs.py b/Lib/test/test_importlib/test_namespace_pkgs.py index a8f95a035e2450..92771e71e70106 100644 --- a/Lib/test/test_importlib/test_namespace_pkgs.py +++ b/Lib/test/test_importlib/test_namespace_pkgs.py @@ -2,6 +2,7 @@ import importlib import os import sys +import tempfile import unittest from test.test_importlib import util @@ -124,6 +125,40 @@ def test_imports(self): self.assertEqual(foo.two.attr, 'portion2 foo two') +class SeparatedNamespacePackagesCreatedWhileRunning(NamespacePackageTest): + paths = ['portion1'] + + def test_invalidate_caches(self): + with tempfile.TemporaryDirectory() as temp_dir: + # we manipulate sys.path before anything is imported to avoid + # accidental cache invalidation when changing it + sys.path.append(temp_dir) + + import foo.one + self.assertEqual(foo.one.attr, 'portion1 foo one') + + # the module does not exist, so it cannot be imported + with self.assertRaises(ImportError): + import foo.just_created + + # util.create_modules() manipulates sys.path + # so we must create the modules manually instead + namespace_path = os.path.join(temp_dir, 'foo') + os.mkdir(namespace_path) + module_path = os.path.join(namespace_path, 'just_created.py') + with open(module_path, 'w', encoding='utf-8') as file: + file.write('attr = "just_created foo"') + + # the module is not known, so it cannot be imported yet + with self.assertRaises(ImportError): + import foo.just_created + + # but after explicit cache invalidation, it is importable + importlib.invalidate_caches() + import foo.just_created + self.assertEqual(foo.just_created.attr, 'just_created foo') + + class SeparatedOverlappingNamespacePackages(NamespacePackageTest): paths = ['portion1', 'both_portions'] diff --git a/Misc/NEWS.d/next/Library/2021-11-03-13-41-49.bpo-45703.35AagL.rst b/Misc/NEWS.d/next/Library/2021-11-03-13-41-49.bpo-45703.35AagL.rst new file mode 100644 index 00000000000000..9fa9be56b8327a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-11-03-13-41-49.bpo-45703.35AagL.rst @@ -0,0 +1,5 @@ +When a namespace package is imported before another module from the same +namespace is created/installed in a different :data:`sys.path` location +while the program is running, calling the +:func:`importlib.invalidate_caches` function will now also guarantee the new +module is noticed. diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 6d40249e9cd76e..23af2cd20b9250 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -1882,944 +1882,951 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 4,6,8,9,8,4,8,3,8,8,8,6,8,6,8,4, 8,4,2,1,114,19,1,0,0,99,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,0, - 0,0,115,104,0,0,0,101,0,90,1,100,0,90,2,100, - 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, - 0,90,5,100,6,100,7,132,0,90,6,100,8,100,9,132, - 0,90,7,100,10,100,11,132,0,90,8,100,12,100,13,132, - 0,90,9,100,14,100,15,132,0,90,10,100,16,100,17,132, - 0,90,11,100,18,100,19,132,0,90,12,100,20,100,21,132, - 0,90,13,100,22,100,23,132,0,90,14,100,24,83,0,41, - 25,218,14,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,97,38,1,0,0,82,101,112,114,101,115,101,110,116,115, - 32,97,32,110,97,109,101,115,112,97,99,101,32,112,97,99, - 107,97,103,101,39,115,32,112,97,116,104,46,32,32,73,116, - 32,117,115,101,115,32,116,104,101,32,109,111,100,117,108,101, - 32,110,97,109,101,10,32,32,32,32,116,111,32,102,105,110, - 100,32,105,116,115,32,112,97,114,101,110,116,32,109,111,100, - 117,108,101,44,32,97,110,100,32,102,114,111,109,32,116,104, - 101,114,101,32,105,116,32,108,111,111,107,115,32,117,112,32, - 116,104,101,32,112,97,114,101,110,116,39,115,10,32,32,32, - 32,95,95,112,97,116,104,95,95,46,32,32,87,104,101,110, - 32,116,104,105,115,32,99,104,97,110,103,101,115,44,32,116, - 104,101,32,109,111,100,117,108,101,39,115,32,111,119,110,32, - 112,97,116,104,32,105,115,32,114,101,99,111,109,112,117,116, - 101,100,44,10,32,32,32,32,117,115,105,110,103,32,112,97, - 116,104,95,102,105,110,100,101,114,46,32,32,70,111,114,32, - 116,111,112,45,108,101,118,101,108,32,109,111,100,117,108,101, - 115,44,32,116,104,101,32,112,97,114,101,110,116,32,109,111, - 100,117,108,101,39,115,32,112,97,116,104,10,32,32,32,32, - 105,115,32,115,121,115,46,112,97,116,104,46,99,4,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0, - 0,67,0,0,0,115,36,0,0,0,124,1,124,0,95,0, - 124,2,124,0,95,1,116,2,124,0,160,3,161,0,131,1, - 124,0,95,4,124,3,124,0,95,5,100,0,83,0,114,69, - 0,0,0,41,6,218,5,95,110,97,109,101,218,5,95,112, - 97,116,104,114,135,0,0,0,218,16,95,103,101,116,95,112, - 97,114,101,110,116,95,112,97,116,104,218,17,95,108,97,115, - 116,95,112,97,114,101,110,116,95,112,97,116,104,218,12,95, - 112,97,116,104,95,102,105,110,100,101,114,169,4,114,142,0, - 0,0,114,140,0,0,0,114,65,0,0,0,90,11,112,97, - 116,104,95,102,105,110,100,101,114,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,232,0,0,0,188,4,0, - 0,115,8,0,0,0,0,1,6,1,6,1,14,1,122,23, - 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95, - 95,105,110,105,116,95,95,99,1,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0, - 115,38,0,0,0,124,0,106,0,160,1,100,1,161,1,92, - 3,125,1,125,2,125,3,124,2,100,2,107,2,114,30,100, - 3,83,0,124,1,100,4,102,2,83,0,41,5,122,62,82, - 101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,111, - 102,32,40,112,97,114,101,110,116,45,109,111,100,117,108,101, - 45,110,97,109,101,44,32,112,97,114,101,110,116,45,112,97, - 116,104,45,97,116,116,114,45,110,97,109,101,41,114,96,0, - 0,0,114,14,0,0,0,41,2,114,21,0,0,0,114,65, - 0,0,0,90,8,95,95,112,97,116,104,95,95,41,2,114, - 46,1,0,0,114,103,0,0,0,41,4,114,142,0,0,0, - 114,38,1,0,0,218,3,100,111,116,90,2,109,101,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,23,95, - 102,105,110,100,95,112,97,114,101,110,116,95,112,97,116,104, - 95,110,97,109,101,115,194,4,0,0,115,8,0,0,0,0, - 2,18,1,8,2,4,3,122,38,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,46,95,102,105,110,100,95,112,97, - 114,101,110,116,95,112,97,116,104,95,110,97,109,101,115,99, - 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,67,0,0,0,115,28,0,0,0,124,0,160, - 0,161,0,92,2,125,1,125,2,116,1,116,2,106,3,124, - 1,25,0,124,2,131,2,83,0,114,69,0,0,0,41,4, - 114,53,1,0,0,114,154,0,0,0,114,21,0,0,0,218, - 7,109,111,100,117,108,101,115,41,3,114,142,0,0,0,90, - 18,112,97,114,101,110,116,95,109,111,100,117,108,101,95,110, - 97,109,101,90,14,112,97,116,104,95,97,116,116,114,95,110, - 97,109,101,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,48,1,0,0,204,4,0,0,115,4,0,0,0, - 0,1,12,1,122,31,95,78,97,109,101,115,112,97,99,101, - 80,97,116,104,46,95,103,101,116,95,112,97,114,101,110,116, - 95,112,97,116,104,99,1,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,80, - 0,0,0,116,0,124,0,160,1,161,0,131,1,125,1,124, - 1,124,0,106,2,107,3,114,74,124,0,160,3,124,0,106, - 4,124,1,161,2,125,2,124,2,100,0,117,1,114,68,124, - 2,106,5,100,0,117,0,114,68,124,2,106,6,114,68,124, - 2,106,6,124,0,95,7,124,1,124,0,95,2,124,0,106, - 7,83,0,114,69,0,0,0,41,8,114,135,0,0,0,114, - 48,1,0,0,114,49,1,0,0,114,50,1,0,0,114,46, - 1,0,0,114,164,0,0,0,114,202,0,0,0,114,47,1, - 0,0,41,3,114,142,0,0,0,90,11,112,97,114,101,110, - 116,95,112,97,116,104,114,210,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,12,95,114,101,99, - 97,108,99,117,108,97,116,101,208,4,0,0,115,16,0,0, - 0,0,2,12,1,10,1,14,3,18,1,6,1,8,1,6, - 1,122,27,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,46,95,114,101,99,97,108,99,117,108,97,116,101,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,12,0,0,0,116,0,124,0, - 160,1,161,0,131,1,83,0,114,69,0,0,0,41,2,114, - 29,1,0,0,114,55,1,0,0,114,13,1,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,8,95, - 95,105,116,101,114,95,95,221,4,0,0,115,2,0,0,0, - 0,1,122,23,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,46,95,95,105,116,101,114,95,95,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0, - 67,0,0,0,115,12,0,0,0,124,0,160,0,161,0,124, - 1,25,0,83,0,114,69,0,0,0,169,1,114,55,1,0, - 0,41,2,114,142,0,0,0,218,5,105,110,100,101,120,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,11, - 95,95,103,101,116,105,116,101,109,95,95,224,4,0,0,115, - 2,0,0,0,0,1,122,26,95,78,97,109,101,115,112,97, - 99,101,80,97,116,104,46,95,95,103,101,116,105,116,101,109, - 95,95,99,3,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,3,0,0,0,67,0,0,0,115,14,0,0,0, - 124,2,124,0,106,0,124,1,60,0,100,0,83,0,114,69, - 0,0,0,41,1,114,47,1,0,0,41,3,114,142,0,0, - 0,114,58,1,0,0,114,65,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,11,95,95,115,101, - 116,105,116,101,109,95,95,227,4,0,0,115,2,0,0,0, - 0,1,122,26,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,46,95,95,115,101,116,105,116,101,109,95,95,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,12,0,0,0,116,0,124,0, - 160,1,161,0,131,1,83,0,114,69,0,0,0,41,2,114, - 6,0,0,0,114,55,1,0,0,114,13,1,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,7,95, - 95,108,101,110,95,95,230,4,0,0,115,2,0,0,0,0, - 1,122,22,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,46,95,95,108,101,110,95,95,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, - 0,0,115,12,0,0,0,100,1,160,0,124,0,106,1,161, - 1,83,0,41,2,78,122,20,95,78,97,109,101,115,112,97, - 99,101,80,97,116,104,40,123,33,114,125,41,41,2,114,88, - 0,0,0,114,47,1,0,0,114,13,1,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,8,95,95, - 114,101,112,114,95,95,233,4,0,0,115,2,0,0,0,0, - 1,122,23,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,46,95,95,114,101,112,114,95,95,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,12,0,0,0,124,1,124,0,160,0,161,0, - 118,0,83,0,114,69,0,0,0,114,57,1,0,0,169,2, - 114,142,0,0,0,218,4,105,116,101,109,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,12,95,95,99,111, - 110,116,97,105,110,115,95,95,236,4,0,0,115,2,0,0, - 0,0,1,122,27,95,78,97,109,101,115,112,97,99,101,80, - 97,116,104,46,95,95,99,111,110,116,97,105,110,115,95,95, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,3,0,0,0,67,0,0,0,115,16,0,0,0,124,0, - 106,0,160,1,124,1,161,1,1,0,100,0,83,0,114,69, - 0,0,0,41,2,114,47,1,0,0,114,61,0,0,0,114, - 63,1,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,61,0,0,0,239,4,0,0,115,2,0,0, - 0,0,1,122,21,95,78,97,109,101,115,112,97,99,101,80, - 97,116,104,46,97,112,112,101,110,100,78,41,15,114,149,0, - 0,0,114,148,0,0,0,114,150,0,0,0,114,151,0,0, - 0,114,232,0,0,0,114,53,1,0,0,114,48,1,0,0, - 114,55,1,0,0,114,56,1,0,0,114,59,1,0,0,114, - 60,1,0,0,114,61,1,0,0,114,62,1,0,0,114,65, - 1,0,0,114,61,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,45,1,0, - 0,181,4,0,0,115,24,0,0,0,8,1,4,6,8,6, - 8,10,8,4,8,13,8,3,8,3,8,3,8,3,8,3, - 8,3,114,45,1,0,0,99,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,64,0,0,0, - 115,80,0,0,0,101,0,90,1,100,0,90,2,100,1,100, - 2,132,0,90,3,101,4,100,3,100,4,132,0,131,1,90, - 5,100,5,100,6,132,0,90,6,100,7,100,8,132,0,90, - 7,100,9,100,10,132,0,90,8,100,11,100,12,132,0,90, - 9,100,13,100,14,132,0,90,10,100,15,100,16,132,0,90, - 11,100,17,83,0,41,18,218,16,95,78,97,109,101,115,112, - 97,99,101,76,111,97,100,101,114,99,4,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,0, - 0,0,115,18,0,0,0,116,0,124,1,124,2,124,3,131, - 3,124,0,95,1,100,0,83,0,114,69,0,0,0,41,2, - 114,45,1,0,0,114,47,1,0,0,114,51,1,0,0,114, + 0,0,115,108,0,0,0,101,0,90,1,100,0,90,2,100, + 1,90,3,100,2,90,4,100,3,100,4,132,0,90,5,100, + 5,100,6,132,0,90,6,100,7,100,8,132,0,90,7,100, + 9,100,10,132,0,90,8,100,11,100,12,132,0,90,9,100, + 13,100,14,132,0,90,10,100,15,100,16,132,0,90,11,100, + 17,100,18,132,0,90,12,100,19,100,20,132,0,90,13,100, + 21,100,22,132,0,90,14,100,23,100,24,132,0,90,15,100, + 25,83,0,41,26,218,14,95,78,97,109,101,115,112,97,99, + 101,80,97,116,104,97,38,1,0,0,82,101,112,114,101,115, + 101,110,116,115,32,97,32,110,97,109,101,115,112,97,99,101, + 32,112,97,99,107,97,103,101,39,115,32,112,97,116,104,46, + 32,32,73,116,32,117,115,101,115,32,116,104,101,32,109,111, + 100,117,108,101,32,110,97,109,101,10,32,32,32,32,116,111, + 32,102,105,110,100,32,105,116,115,32,112,97,114,101,110,116, + 32,109,111,100,117,108,101,44,32,97,110,100,32,102,114,111, + 109,32,116,104,101,114,101,32,105,116,32,108,111,111,107,115, + 32,117,112,32,116,104,101,32,112,97,114,101,110,116,39,115, + 10,32,32,32,32,95,95,112,97,116,104,95,95,46,32,32, + 87,104,101,110,32,116,104,105,115,32,99,104,97,110,103,101, + 115,44,32,116,104,101,32,109,111,100,117,108,101,39,115,32, + 111,119,110,32,112,97,116,104,32,105,115,32,114,101,99,111, + 109,112,117,116,101,100,44,10,32,32,32,32,117,115,105,110, + 103,32,112,97,116,104,95,102,105,110,100,101,114,46,32,32, + 70,111,114,32,116,111,112,45,108,101,118,101,108,32,109,111, + 100,117,108,101,115,44,32,116,104,101,32,112,97,114,101,110, + 116,32,109,111,100,117,108,101,39,115,32,112,97,116,104,10, + 32,32,32,32,105,115,32,115,121,115,46,112,97,116,104,46, + 114,0,0,0,0,99,4,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,3,0,0,0,67,0,0,0,115,44, + 0,0,0,124,1,124,0,95,0,124,2,124,0,95,1,116, + 2,124,0,160,3,161,0,131,1,124,0,95,4,124,0,106, + 5,124,0,95,6,124,3,124,0,95,7,100,0,83,0,114, + 69,0,0,0,41,8,218,5,95,110,97,109,101,218,5,95, + 112,97,116,104,114,135,0,0,0,218,16,95,103,101,116,95, + 112,97,114,101,110,116,95,112,97,116,104,218,17,95,108,97, + 115,116,95,112,97,114,101,110,116,95,112,97,116,104,218,6, + 95,101,112,111,99,104,218,11,95,108,97,115,116,95,101,112, + 111,99,104,218,12,95,112,97,116,104,95,102,105,110,100,101, + 114,169,4,114,142,0,0,0,114,140,0,0,0,114,65,0, + 0,0,90,11,112,97,116,104,95,102,105,110,100,101,114,114, 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,232, - 0,0,0,245,4,0,0,115,2,0,0,0,0,1,122,25, - 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, - 46,95,95,105,110,105,116,95,95,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0, - 0,0,115,12,0,0,0,100,1,160,0,124,1,106,1,161, - 1,83,0,41,2,122,115,82,101,116,117,114,110,32,114,101, - 112,114,32,102,111,114,32,116,104,101,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,32,32,32,32,84,104,101,32, - 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,32,32,84,104,101,32,105,109,112,111,114, - 116,32,109,97,99,104,105,110,101,114,121,32,100,111,101,115, - 32,116,104,101,32,106,111,98,32,105,116,115,101,108,102,46, - 10,10,32,32,32,32,32,32,32,32,122,25,60,109,111,100, - 117,108,101,32,123,33,114,125,32,40,110,97,109,101,115,112, - 97,99,101,41,62,41,2,114,88,0,0,0,114,149,0,0, - 0,41,2,114,216,0,0,0,114,239,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,11,109,111, - 100,117,108,101,95,114,101,112,114,248,4,0,0,115,2,0, - 0,0,0,7,122,28,95,78,97,109,101,115,112,97,99,101, - 76,111,97,100,101,114,46,109,111,100,117,108,101,95,114,101, - 112,114,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,78,84,114,10,0,0,0,114,242,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,206,0,0,0,1,5,0,0,115,2,0,0,0,0, - 1,122,27,95,78,97,109,101,115,112,97,99,101,76,111,97, - 100,101,114,46,105,115,95,112,97,99,107,97,103,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, - 41,2,78,114,14,0,0,0,114,10,0,0,0,114,242,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,252,0,0,0,4,5,0,0,115,2,0,0,0,0, - 1,122,27,95,78,97,109,101,115,112,97,99,101,76,111,97, - 100,101,114,46,103,101,116,95,115,111,117,114,99,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,6, - 0,0,0,67,0,0,0,115,16,0,0,0,116,0,100,1, - 100,2,100,3,100,4,100,5,141,4,83,0,41,6,78,114, - 14,0,0,0,122,8,60,115,116,114,105,110,103,62,114,238, - 0,0,0,84,41,1,114,254,0,0,0,41,1,114,255,0, - 0,0,114,242,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,236,0,0,0,7,5,0,0,115, - 2,0,0,0,0,1,122,25,95,78,97,109,101,115,112,97, - 99,101,76,111,97,100,101,114,46,103,101,116,95,99,111,100, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,114,233,0,0,0,114,10,0,0,0,114,234,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,235,0,0,0,10,5,0,0,115,2,0,0,0,0, - 1,122,30,95,78,97,109,101,115,112,97,99,101,76,111,97, - 100,101,114,46,99,114,101,97,116,101,95,109,111,100,117,108, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 0,83,0,114,69,0,0,0,114,10,0,0,0,114,20,1, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,240,0,0,0,13,5,0,0,115,2,0,0,0,0, - 1,122,28,95,78,97,109,101,115,112,97,99,101,76,111,97, - 100,101,114,46,101,120,101,99,95,109,111,100,117,108,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,67,0,0,0,115,26,0,0,0,116,0,160, - 1,100,1,124,0,106,2,161,2,1,0,116,0,160,3,124, - 0,124,1,161,2,83,0,41,2,122,98,76,111,97,100,32, - 97,32,110,97,109,101,115,112,97,99,101,32,109,111,100,117, - 108,101,46,10,10,32,32,32,32,32,32,32,32,84,104,105, - 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,46,32,32,85,115,101,32,101,120,101, - 99,95,109,111,100,117,108,101,40,41,32,105,110,115,116,101, - 97,100,46,10,10,32,32,32,32,32,32,32,32,122,38,110, - 97,109,101,115,112,97,99,101,32,109,111,100,117,108,101,32, - 108,111,97,100,101,100,32,119,105,116,104,32,112,97,116,104, - 32,123,33,114,125,41,4,114,158,0,0,0,114,173,0,0, - 0,114,47,1,0,0,114,241,0,0,0,114,242,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 243,0,0,0,16,5,0,0,115,8,0,0,0,0,7,6, - 1,4,255,4,2,122,28,95,78,97,109,101,115,112,97,99, - 101,76,111,97,100,101,114,46,108,111,97,100,95,109,111,100, - 117,108,101,78,41,12,114,149,0,0,0,114,148,0,0,0, - 114,150,0,0,0,114,232,0,0,0,114,230,0,0,0,114, - 67,1,0,0,114,206,0,0,0,114,252,0,0,0,114,236, - 0,0,0,114,235,0,0,0,114,240,0,0,0,114,243,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,66,1,0,0,244,4,0,0,115, - 18,0,0,0,8,1,8,3,2,1,10,8,8,3,8,3, - 8,3,8,3,8,3,114,66,1,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 64,0,0,0,115,118,0,0,0,101,0,90,1,100,0,90, - 2,100,1,90,3,101,4,100,2,100,3,132,0,131,1,90, - 5,101,4,100,4,100,5,132,0,131,1,90,6,101,4,100, - 6,100,7,132,0,131,1,90,7,101,4,100,8,100,9,132, - 0,131,1,90,8,101,4,100,19,100,11,100,12,132,1,131, - 1,90,9,101,4,100,20,100,13,100,14,132,1,131,1,90, - 10,101,4,100,21,100,15,100,16,132,1,131,1,90,11,101, - 4,100,17,100,18,132,0,131,1,90,12,100,10,83,0,41, - 22,218,10,80,97,116,104,70,105,110,100,101,114,122,62,77, - 101,116,97,32,112,97,116,104,32,102,105,110,100,101,114,32, - 102,111,114,32,115,121,115,46,112,97,116,104,32,97,110,100, - 32,112,97,99,107,97,103,101,32,95,95,112,97,116,104,95, - 95,32,97,116,116,114,105,98,117,116,101,115,46,99,1,0, + 0,0,0,192,4,0,0,115,10,0,0,0,0,1,6,1, + 6,1,14,1,8,1,122,23,95,78,97,109,101,115,112,97, + 99,101,80,97,116,104,46,95,95,105,110,105,116,95,95,99, + 1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 3,0,0,0,67,0,0,0,115,38,0,0,0,124,0,106, + 0,160,1,100,1,161,1,92,3,125,1,125,2,125,3,124, + 2,100,2,107,2,114,30,100,3,83,0,124,1,100,4,102, + 2,83,0,41,5,122,62,82,101,116,117,114,110,115,32,97, + 32,116,117,112,108,101,32,111,102,32,40,112,97,114,101,110, + 116,45,109,111,100,117,108,101,45,110,97,109,101,44,32,112, + 97,114,101,110,116,45,112,97,116,104,45,97,116,116,114,45, + 110,97,109,101,41,114,96,0,0,0,114,14,0,0,0,41, + 2,114,21,0,0,0,114,65,0,0,0,90,8,95,95,112, + 97,116,104,95,95,41,2,114,46,1,0,0,114,103,0,0, + 0,41,4,114,142,0,0,0,114,38,1,0,0,218,3,100, + 111,116,90,2,109,101,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,23,95,102,105,110,100,95,112,97,114, + 101,110,116,95,112,97,116,104,95,110,97,109,101,115,199,4, + 0,0,115,8,0,0,0,0,2,18,1,8,2,4,3,122, + 38,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,102,105,110,100,95,112,97,114,101,110,116,95,112,97,116, + 104,95,110,97,109,101,115,99,1,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, + 115,28,0,0,0,124,0,160,0,161,0,92,2,125,1,125, + 2,116,1,116,2,106,3,124,1,25,0,124,2,131,2,83, + 0,114,69,0,0,0,41,4,114,55,1,0,0,114,154,0, + 0,0,114,21,0,0,0,218,7,109,111,100,117,108,101,115, + 41,3,114,142,0,0,0,90,18,112,97,114,101,110,116,95, + 109,111,100,117,108,101,95,110,97,109,101,90,14,112,97,116, + 104,95,97,116,116,114,95,110,97,109,101,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,48,1,0,0,209, + 4,0,0,115,4,0,0,0,0,1,12,1,122,31,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,95,103,101, + 116,95,112,97,114,101,110,116,95,112,97,116,104,99,1,0, 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, - 0,0,67,0,0,0,115,64,0,0,0,116,0,116,1,106, - 2,160,3,161,0,131,1,68,0,93,44,92,2,125,1,125, - 2,124,2,100,1,117,0,114,40,116,1,106,2,124,1,61, - 0,113,14,116,4,124,2,100,2,131,2,114,14,124,2,160, - 5,161,0,1,0,113,14,100,1,83,0,41,3,122,125,67, - 97,108,108,32,116,104,101,32,105,110,118,97,108,105,100,97, - 116,101,95,99,97,99,104,101,115,40,41,32,109,101,116,104, - 111,100,32,111,110,32,97,108,108,32,112,97,116,104,32,101, - 110,116,114,121,32,102,105,110,100,101,114,115,10,32,32,32, - 32,32,32,32,32,115,116,111,114,101,100,32,105,110,32,115, - 121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,114, - 95,99,97,99,104,101,115,32,40,119,104,101,114,101,32,105, - 109,112,108,101,109,101,110,116,101,100,41,46,78,218,17,105, - 110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115, - 41,6,218,4,108,105,115,116,114,21,0,0,0,218,19,112, - 97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99, - 104,101,218,5,105,116,101,109,115,114,152,0,0,0,114,69, - 1,0,0,41,3,114,216,0,0,0,114,140,0,0,0,218, - 6,102,105,110,100,101,114,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,69,1,0,0,34,5,0,0,115, - 10,0,0,0,0,4,22,1,8,1,10,1,10,1,122,28, - 80,97,116,104,70,105,110,100,101,114,46,105,110,118,97,108, - 105,100,97,116,101,95,99,97,99,104,101,115,99,2,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,9,0,0, - 0,67,0,0,0,115,82,0,0,0,116,0,106,1,100,1, - 117,1,114,28,116,0,106,1,115,28,116,2,160,3,100,2, - 116,4,161,2,1,0,116,0,106,1,68,0,93,42,125,2, - 122,14,124,2,124,1,131,1,87,0,2,0,1,0,83,0, - 4,0,116,5,121,74,1,0,1,0,1,0,89,0,113,34, - 89,0,113,34,48,0,113,34,100,1,83,0,41,3,122,46, - 83,101,97,114,99,104,32,115,121,115,46,112,97,116,104,95, - 104,111,111,107,115,32,102,111,114,32,97,32,102,105,110,100, - 101,114,32,102,111,114,32,39,112,97,116,104,39,46,78,122, - 23,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32, - 105,115,32,101,109,112,116,121,41,6,114,21,0,0,0,218, - 10,112,97,116,104,95,104,111,111,107,115,114,98,0,0,0, - 114,99,0,0,0,114,162,0,0,0,114,141,0,0,0,41, - 3,114,216,0,0,0,114,65,0,0,0,90,4,104,111,111, - 107,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,11,95,112,97,116,104,95,104,111,111,107,115,44,5,0, - 0,115,16,0,0,0,0,3,16,1,12,1,10,1,2,1, - 14,1,12,1,12,2,122,22,80,97,116,104,70,105,110,100, - 101,114,46,95,112,97,116,104,95,104,111,111,107,115,99,2, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8, - 0,0,0,67,0,0,0,115,100,0,0,0,124,1,100,1, - 107,2,114,42,122,12,116,0,160,1,161,0,125,1,87,0, - 110,20,4,0,116,2,121,40,1,0,1,0,1,0,89,0, - 100,2,83,0,48,0,122,14,116,3,106,4,124,1,25,0, - 125,2,87,0,110,38,4,0,116,5,121,94,1,0,1,0, - 1,0,124,0,160,6,124,1,161,1,125,2,124,2,116,3, - 106,4,124,1,60,0,89,0,110,2,48,0,124,2,83,0, - 41,3,122,210,71,101,116,32,116,104,101,32,102,105,110,100, - 101,114,32,102,111,114,32,116,104,101,32,112,97,116,104,32, - 101,110,116,114,121,32,102,114,111,109,32,115,121,115,46,112, - 97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99, - 104,101,46,10,10,32,32,32,32,32,32,32,32,73,102,32, - 116,104,101,32,112,97,116,104,32,101,110,116,114,121,32,105, - 115,32,110,111,116,32,105,110,32,116,104,101,32,99,97,99, - 104,101,44,32,102,105,110,100,32,116,104,101,32,97,112,112, - 114,111,112,114,105,97,116,101,32,102,105,110,100,101,114,10, - 32,32,32,32,32,32,32,32,97,110,100,32,99,97,99,104, - 101,32,105,116,46,32,73,102,32,110,111,32,102,105,110,100, - 101,114,32,105,115,32,97,118,97,105,108,97,98,108,101,44, - 32,115,116,111,114,101,32,78,111,110,101,46,10,10,32,32, - 32,32,32,32,32,32,114,14,0,0,0,78,41,7,114,24, - 0,0,0,114,81,0,0,0,114,26,1,0,0,114,21,0, - 0,0,114,71,1,0,0,218,8,75,101,121,69,114,114,111, - 114,114,75,1,0,0,41,3,114,216,0,0,0,114,65,0, - 0,0,114,73,1,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,20,95,112,97,116,104,95,105,109, - 112,111,114,116,101,114,95,99,97,99,104,101,57,5,0,0, - 115,22,0,0,0,0,8,8,1,2,1,12,1,12,3,8, - 1,2,1,14,1,12,1,10,1,16,1,122,31,80,97,116, - 104,70,105,110,100,101,114,46,95,112,97,116,104,95,105,109, - 112,111,114,116,101,114,95,99,97,99,104,101,99,3,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0, - 0,67,0,0,0,115,82,0,0,0,116,0,124,2,100,1, - 131,2,114,26,124,2,160,1,124,1,161,1,92,2,125,3, - 125,4,110,14,124,2,160,2,124,1,161,1,125,3,103,0, - 125,4,124,3,100,0,117,1,114,60,116,3,160,4,124,1, - 124,3,161,2,83,0,116,3,160,5,124,1,100,0,161,2, - 125,5,124,4,124,5,95,6,124,5,83,0,41,2,78,114, - 161,0,0,0,41,7,114,152,0,0,0,114,161,0,0,0, - 114,229,0,0,0,114,158,0,0,0,114,224,0,0,0,114, - 207,0,0,0,114,202,0,0,0,41,6,114,216,0,0,0, - 114,163,0,0,0,114,73,1,0,0,114,164,0,0,0,114, - 165,0,0,0,114,210,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,16,95,108,101,103,97,99, - 121,95,103,101,116,95,115,112,101,99,79,5,0,0,115,18, - 0,0,0,0,4,10,1,16,2,10,1,4,1,8,1,12, - 1,12,1,6,1,122,27,80,97,116,104,70,105,110,100,101, - 114,46,95,108,101,103,97,99,121,95,103,101,116,95,115,112, - 101,99,78,99,4,0,0,0,0,0,0,0,0,0,0,0, - 9,0,0,0,5,0,0,0,67,0,0,0,115,166,0,0, - 0,103,0,125,4,124,2,68,0,93,134,125,5,116,0,124, - 5,116,1,116,2,102,2,131,2,115,28,113,8,124,0,160, - 3,124,5,161,1,125,6,124,6,100,1,117,1,114,8,116, - 4,124,6,100,2,131,2,114,70,124,6,160,5,124,1,124, - 3,161,2,125,7,110,12,124,0,160,6,124,1,124,6,161, - 2,125,7,124,7,100,1,117,0,114,92,113,8,124,7,106, - 7,100,1,117,1,114,110,124,7,2,0,1,0,83,0,124, - 7,106,8,125,8,124,8,100,1,117,0,114,132,116,9,100, - 3,131,1,130,1,124,4,160,10,124,8,161,1,1,0,113, - 8,116,11,160,12,124,1,100,1,161,2,125,7,124,4,124, - 7,95,8,124,7,83,0,41,4,122,63,70,105,110,100,32, - 116,104,101,32,108,111,97,100,101,114,32,111,114,32,110,97, - 109,101,115,112,97,99,101,95,112,97,116,104,32,102,111,114, - 32,116,104,105,115,32,109,111,100,117,108,101,47,112,97,99, - 107,97,103,101,32,110,97,109,101,46,78,114,226,0,0,0, - 122,19,115,112,101,99,32,109,105,115,115,105,110,103,32,108, - 111,97,100,101,114,41,13,114,185,0,0,0,114,108,0,0, - 0,218,5,98,121,116,101,115,114,77,1,0,0,114,152,0, - 0,0,114,226,0,0,0,114,78,1,0,0,114,164,0,0, - 0,114,202,0,0,0,114,141,0,0,0,114,191,0,0,0, - 114,158,0,0,0,114,207,0,0,0,41,9,114,216,0,0, - 0,114,163,0,0,0,114,65,0,0,0,114,225,0,0,0, - 218,14,110,97,109,101,115,112,97,99,101,95,112,97,116,104, - 90,5,101,110,116,114,121,114,73,1,0,0,114,210,0,0, - 0,114,165,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,9,95,103,101,116,95,115,112,101,99, - 94,5,0,0,115,40,0,0,0,0,5,4,1,8,1,14, - 1,2,1,10,1,8,1,10,1,14,2,12,1,8,1,2, - 1,10,1,8,1,6,1,8,1,8,5,12,2,12,1,6, - 1,122,20,80,97,116,104,70,105,110,100,101,114,46,95,103, - 101,116,95,115,112,101,99,99,4,0,0,0,0,0,0,0, - 0,0,0,0,6,0,0,0,5,0,0,0,67,0,0,0, - 115,100,0,0,0,124,2,100,1,117,0,114,14,116,0,106, - 1,125,2,124,0,160,2,124,1,124,2,124,3,161,3,125, - 4,124,4,100,1,117,0,114,40,100,1,83,0,124,4,106, - 3,100,1,117,0,114,92,124,4,106,4,125,5,124,5,114, - 86,100,1,124,4,95,5,116,6,124,1,124,5,124,0,106, - 2,131,3,124,4,95,4,124,4,83,0,100,1,83,0,110, - 4,124,4,83,0,100,1,83,0,41,2,122,141,84,114,121, - 32,116,111,32,102,105,110,100,32,97,32,115,112,101,99,32, - 102,111,114,32,39,102,117,108,108,110,97,109,101,39,32,111, - 110,32,115,121,115,46,112,97,116,104,32,111,114,32,39,112, - 97,116,104,39,46,10,10,32,32,32,32,32,32,32,32,84, - 104,101,32,115,101,97,114,99,104,32,105,115,32,98,97,115, - 101,100,32,111,110,32,115,121,115,46,112,97,116,104,95,104, - 111,111,107,115,32,97,110,100,32,115,121,115,46,112,97,116, + 0,0,67,0,0,0,115,100,0,0,0,116,0,124,0,160, + 1,161,0,131,1,125,1,124,1,124,0,106,2,107,3,115, + 34,124,0,106,3,124,0,106,4,107,3,114,94,124,0,160, + 5,124,0,106,6,124,1,161,2,125,2,124,2,100,0,117, + 1,114,80,124,2,106,7,100,0,117,0,114,80,124,2,106, + 8,114,80,124,2,106,8,124,0,95,9,124,1,124,0,95, + 2,124,0,106,3,124,0,95,4,124,0,106,9,83,0,114, + 69,0,0,0,41,10,114,135,0,0,0,114,48,1,0,0, + 114,49,1,0,0,114,50,1,0,0,114,51,1,0,0,114, + 52,1,0,0,114,46,1,0,0,114,164,0,0,0,114,202, + 0,0,0,114,47,1,0,0,41,3,114,142,0,0,0,90, + 11,112,97,114,101,110,116,95,112,97,116,104,114,210,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,12,95,114,101,99,97,108,99,117,108,97,116,101,213,4, + 0,0,115,18,0,0,0,0,2,12,1,22,1,14,3,18, + 1,6,1,8,1,6,1,8,1,122,27,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,46,95,114,101,99,97,108, + 99,117,108,97,116,101,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 12,0,0,0,116,0,124,0,160,1,161,0,131,1,83,0, + 114,69,0,0,0,41,2,114,29,1,0,0,114,57,1,0, + 0,114,13,1,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,8,95,95,105,116,101,114,95,95,227, + 4,0,0,115,2,0,0,0,0,1,122,23,95,78,97,109, + 101,115,112,97,99,101,80,97,116,104,46,95,95,105,116,101, + 114,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,2,0,0,0,67,0,0,0,115,12,0,0, + 0,124,0,160,0,161,0,124,1,25,0,83,0,114,69,0, + 0,0,169,1,114,57,1,0,0,41,2,114,142,0,0,0, + 218,5,105,110,100,101,120,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,11,95,95,103,101,116,105,116,101, + 109,95,95,230,4,0,0,115,2,0,0,0,0,1,122,26, + 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95, + 95,103,101,116,105,116,101,109,95,95,99,3,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, + 0,0,0,115,14,0,0,0,124,2,124,0,106,0,124,1, + 60,0,100,0,83,0,114,69,0,0,0,41,1,114,47,1, + 0,0,41,3,114,142,0,0,0,114,60,1,0,0,114,65, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,11,95,95,115,101,116,105,116,101,109,95,95,233, + 4,0,0,115,2,0,0,0,0,1,122,26,95,78,97,109, + 101,115,112,97,99,101,80,97,116,104,46,95,95,115,101,116, + 105,116,101,109,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 12,0,0,0,116,0,124,0,160,1,161,0,131,1,83,0, + 114,69,0,0,0,41,2,114,6,0,0,0,114,57,1,0, + 0,114,13,1,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,7,95,95,108,101,110,95,95,236,4, + 0,0,115,2,0,0,0,0,1,122,22,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,46,95,95,108,101,110,95, + 95,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,100, + 1,160,0,124,0,106,1,161,1,83,0,41,2,78,122,20, + 95,78,97,109,101,115,112,97,99,101,80,97,116,104,40,123, + 33,114,125,41,41,2,114,88,0,0,0,114,47,1,0,0, + 114,13,1,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,8,95,95,114,101,112,114,95,95,239,4, + 0,0,115,2,0,0,0,0,1,122,23,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,46,95,95,114,101,112,114, + 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, + 124,1,124,0,160,0,161,0,118,0,83,0,114,69,0,0, + 0,114,59,1,0,0,169,2,114,142,0,0,0,218,4,105, + 116,101,109,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,12,95,95,99,111,110,116,97,105,110,115,95,95, + 242,4,0,0,115,2,0,0,0,0,1,122,27,95,78,97, + 109,101,115,112,97,99,101,80,97,116,104,46,95,95,99,111, + 110,116,97,105,110,115,95,95,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, + 0,115,16,0,0,0,124,0,106,0,160,1,124,1,161,1, + 1,0,100,0,83,0,114,69,0,0,0,41,2,114,47,1, + 0,0,114,61,0,0,0,114,65,1,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,61,0,0,0, + 245,4,0,0,115,2,0,0,0,0,1,122,21,95,78,97, + 109,101,115,112,97,99,101,80,97,116,104,46,97,112,112,101, + 110,100,78,41,16,114,149,0,0,0,114,148,0,0,0,114, + 150,0,0,0,114,151,0,0,0,114,50,1,0,0,114,232, + 0,0,0,114,55,1,0,0,114,48,1,0,0,114,57,1, + 0,0,114,58,1,0,0,114,61,1,0,0,114,62,1,0, + 0,114,63,1,0,0,114,64,1,0,0,114,67,1,0,0, + 114,61,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,45,1,0,0,181,4, + 0,0,115,26,0,0,0,8,1,4,8,4,2,8,7,8, + 10,8,4,8,14,8,3,8,3,8,3,8,3,8,3,8, + 3,114,45,1,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, + 80,0,0,0,101,0,90,1,100,0,90,2,100,1,100,2, + 132,0,90,3,101,4,100,3,100,4,132,0,131,1,90,5, + 100,5,100,6,132,0,90,6,100,7,100,8,132,0,90,7, + 100,9,100,10,132,0,90,8,100,11,100,12,132,0,90,9, + 100,13,100,14,132,0,90,10,100,15,100,16,132,0,90,11, + 100,17,83,0,41,18,218,16,95,78,97,109,101,115,112,97, + 99,101,76,111,97,100,101,114,99,4,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, + 0,115,18,0,0,0,116,0,124,1,124,2,124,3,131,3, + 124,0,95,1,100,0,83,0,114,69,0,0,0,41,2,114, + 45,1,0,0,114,47,1,0,0,114,53,1,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,232,0, + 0,0,251,4,0,0,115,2,0,0,0,0,1,122,25,95, + 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46, + 95,95,105,110,105,116,95,95,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, + 0,115,12,0,0,0,100,1,160,0,124,1,106,1,161,1, + 83,0,41,2,122,115,82,101,116,117,114,110,32,114,101,112, + 114,32,102,111,114,32,116,104,101,32,109,111,100,117,108,101, + 46,10,10,32,32,32,32,32,32,32,32,84,104,101,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,84,104,101,32,105,109,112,111,114,116, + 32,109,97,99,104,105,110,101,114,121,32,100,111,101,115,32, + 116,104,101,32,106,111,98,32,105,116,115,101,108,102,46,10, + 10,32,32,32,32,32,32,32,32,122,25,60,109,111,100,117, + 108,101,32,123,33,114,125,32,40,110,97,109,101,115,112,97, + 99,101,41,62,41,2,114,88,0,0,0,114,149,0,0,0, + 41,2,114,216,0,0,0,114,239,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,11,109,111,100, + 117,108,101,95,114,101,112,114,254,4,0,0,115,2,0,0, + 0,0,7,122,28,95,78,97,109,101,115,112,97,99,101,76, + 111,97,100,101,114,46,109,111,100,117,108,101,95,114,101,112, + 114,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,41,2,78,84,114,10,0,0,0,114,242,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,206,0,0,0,7,5,0,0,115,2,0,0,0,0,1, + 122,27,95,78,97,109,101,115,112,97,99,101,76,111,97,100, + 101,114,46,105,115,95,112,97,99,107,97,103,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,78,114,14,0,0,0,114,10,0,0,0,114,242,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,252,0,0,0,10,5,0,0,115,2,0,0,0,0,1, + 122,27,95,78,97,109,101,115,112,97,99,101,76,111,97,100, + 101,114,46,103,101,116,95,115,111,117,114,99,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,6,0, + 0,0,67,0,0,0,115,16,0,0,0,116,0,100,1,100, + 2,100,3,100,4,100,5,141,4,83,0,41,6,78,114,14, + 0,0,0,122,8,60,115,116,114,105,110,103,62,114,238,0, + 0,0,84,41,1,114,254,0,0,0,41,1,114,255,0,0, + 0,114,242,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,236,0,0,0,13,5,0,0,115,2, + 0,0,0,0,1,122,25,95,78,97,109,101,115,112,97,99, + 101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, + 83,0,114,233,0,0,0,114,10,0,0,0,114,234,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,235,0,0,0,16,5,0,0,115,2,0,0,0,0,1, + 122,30,95,78,97,109,101,115,112,97,99,101,76,111,97,100, + 101,114,46,99,114,101,97,116,101,95,109,111,100,117,108,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,0, + 83,0,114,69,0,0,0,114,10,0,0,0,114,20,1,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,240,0,0,0,19,5,0,0,115,2,0,0,0,0,1, + 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100, + 101,114,46,101,120,101,99,95,109,111,100,117,108,101,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, + 0,0,0,67,0,0,0,115,26,0,0,0,116,0,160,1, + 100,1,124,0,106,2,161,2,1,0,116,0,160,3,124,0, + 124,1,161,2,83,0,41,2,122,98,76,111,97,100,32,97, + 32,110,97,109,101,115,112,97,99,101,32,109,111,100,117,108, + 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, + 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,99, + 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97, + 100,46,10,10,32,32,32,32,32,32,32,32,122,38,110,97, + 109,101,115,112,97,99,101,32,109,111,100,117,108,101,32,108, + 111,97,100,101,100,32,119,105,116,104,32,112,97,116,104,32, + 123,33,114,125,41,4,114,158,0,0,0,114,173,0,0,0, + 114,47,1,0,0,114,241,0,0,0,114,242,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,243, + 0,0,0,22,5,0,0,115,8,0,0,0,0,7,6,1, + 4,255,4,2,122,28,95,78,97,109,101,115,112,97,99,101, + 76,111,97,100,101,114,46,108,111,97,100,95,109,111,100,117, + 108,101,78,41,12,114,149,0,0,0,114,148,0,0,0,114, + 150,0,0,0,114,232,0,0,0,114,230,0,0,0,114,69, + 1,0,0,114,206,0,0,0,114,252,0,0,0,114,236,0, + 0,0,114,235,0,0,0,114,240,0,0,0,114,243,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,68,1,0,0,250,4,0,0,115,18, + 0,0,0,8,1,8,3,2,1,10,8,8,3,8,3,8, + 3,8,3,8,3,114,68,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, + 0,0,0,115,118,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,101,4,100,2,100,3,132,0,131,1,90,5, + 101,4,100,4,100,5,132,0,131,1,90,6,101,4,100,6, + 100,7,132,0,131,1,90,7,101,4,100,8,100,9,132,0, + 131,1,90,8,101,4,100,19,100,11,100,12,132,1,131,1, + 90,9,101,4,100,20,100,13,100,14,132,1,131,1,90,10, + 101,4,100,21,100,15,100,16,132,1,131,1,90,11,101,4, + 100,17,100,18,132,0,131,1,90,12,100,10,83,0,41,22, + 218,10,80,97,116,104,70,105,110,100,101,114,122,62,77,101, + 116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,102, + 111,114,32,115,121,115,46,112,97,116,104,32,97,110,100,32, + 112,97,99,107,97,103,101,32,95,95,112,97,116,104,95,95, + 32,97,116,116,114,105,98,117,116,101,115,46,99,1,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, + 0,67,0,0,0,115,78,0,0,0,116,0,116,1,106,2, + 160,3,161,0,131,1,68,0,93,44,92,2,125,1,125,2, + 124,2,100,1,117,0,114,40,116,1,106,2,124,1,61,0, + 113,14,116,4,124,2,100,2,131,2,114,14,124,2,160,5, + 161,0,1,0,113,14,116,6,4,0,106,7,100,3,55,0, + 2,0,95,7,100,1,83,0,41,4,122,125,67,97,108,108, + 32,116,104,101,32,105,110,118,97,108,105,100,97,116,101,95, + 99,97,99,104,101,115,40,41,32,109,101,116,104,111,100,32, + 111,110,32,97,108,108,32,112,97,116,104,32,101,110,116,114, + 121,32,102,105,110,100,101,114,115,10,32,32,32,32,32,32, + 32,32,115,116,111,114,101,100,32,105,110,32,115,121,115,46, + 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, + 99,104,101,115,32,40,119,104,101,114,101,32,105,109,112,108, + 101,109,101,110,116,101,100,41,46,78,218,17,105,110,118,97, + 108,105,100,97,116,101,95,99,97,99,104,101,115,114,4,0, + 0,0,41,8,218,4,108,105,115,116,114,21,0,0,0,218, + 19,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, + 97,99,104,101,218,5,105,116,101,109,115,114,152,0,0,0, + 114,71,1,0,0,114,45,1,0,0,114,50,1,0,0,41, + 3,114,216,0,0,0,114,140,0,0,0,218,6,102,105,110, + 100,101,114,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,71,1,0,0,40,5,0,0,115,12,0,0,0, + 0,4,22,1,8,1,10,1,10,1,10,3,122,28,80,97, + 116,104,70,105,110,100,101,114,46,105,110,118,97,108,105,100, + 97,116,101,95,99,97,99,104,101,115,99,2,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,9,0,0,0,67, + 0,0,0,115,82,0,0,0,116,0,106,1,100,1,117,1, + 114,28,116,0,106,1,115,28,116,2,160,3,100,2,116,4, + 161,2,1,0,116,0,106,1,68,0,93,42,125,2,122,14, + 124,2,124,1,131,1,87,0,2,0,1,0,83,0,4,0, + 116,5,121,74,1,0,1,0,1,0,89,0,113,34,89,0, + 113,34,48,0,113,34,100,1,83,0,41,3,122,46,83,101, + 97,114,99,104,32,115,121,115,46,112,97,116,104,95,104,111, + 111,107,115,32,102,111,114,32,97,32,102,105,110,100,101,114, + 32,102,111,114,32,39,112,97,116,104,39,46,78,122,23,115, + 121,115,46,112,97,116,104,95,104,111,111,107,115,32,105,115, + 32,101,109,112,116,121,41,6,114,21,0,0,0,218,10,112, + 97,116,104,95,104,111,111,107,115,114,98,0,0,0,114,99, + 0,0,0,114,162,0,0,0,114,141,0,0,0,41,3,114, + 216,0,0,0,114,65,0,0,0,90,4,104,111,111,107,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,11, + 95,112,97,116,104,95,104,111,111,107,115,53,5,0,0,115, + 16,0,0,0,0,3,16,1,12,1,10,1,2,1,14,1, + 12,1,12,2,122,22,80,97,116,104,70,105,110,100,101,114, + 46,95,112,97,116,104,95,104,111,111,107,115,99,2,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0, + 0,67,0,0,0,115,100,0,0,0,124,1,100,1,107,2, + 114,42,122,12,116,0,160,1,161,0,125,1,87,0,110,20, + 4,0,116,2,121,40,1,0,1,0,1,0,89,0,100,2, + 83,0,48,0,122,14,116,3,106,4,124,1,25,0,125,2, + 87,0,110,38,4,0,116,5,121,94,1,0,1,0,1,0, + 124,0,160,6,124,1,161,1,125,2,124,2,116,3,106,4, + 124,1,60,0,89,0,110,2,48,0,124,2,83,0,41,3, + 122,210,71,101,116,32,116,104,101,32,102,105,110,100,101,114, + 32,102,111,114,32,116,104,101,32,112,97,116,104,32,101,110, + 116,114,121,32,102,114,111,109,32,115,121,115,46,112,97,116, 104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,101, - 46,10,32,32,32,32,32,32,32,32,78,41,7,114,21,0, - 0,0,114,65,0,0,0,114,81,1,0,0,114,164,0,0, - 0,114,202,0,0,0,114,205,0,0,0,114,45,1,0,0, - 41,6,114,216,0,0,0,114,163,0,0,0,114,65,0,0, - 0,114,225,0,0,0,114,210,0,0,0,114,80,1,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 226,0,0,0,126,5,0,0,115,26,0,0,0,0,6,8, - 1,6,1,14,1,8,1,4,1,10,1,6,1,4,3,6, - 1,16,1,4,2,6,2,122,20,80,97,116,104,70,105,110, - 100,101,114,46,102,105,110,100,95,115,112,101,99,99,3,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, - 0,0,67,0,0,0,115,30,0,0,0,124,0,160,0,124, - 1,124,2,161,2,125,3,124,3,100,1,117,0,114,24,100, - 1,83,0,124,3,106,1,83,0,41,2,122,170,102,105,110, - 100,32,116,104,101,32,109,111,100,117,108,101,32,111,110,32, + 46,10,10,32,32,32,32,32,32,32,32,73,102,32,116,104, + 101,32,112,97,116,104,32,101,110,116,114,121,32,105,115,32, + 110,111,116,32,105,110,32,116,104,101,32,99,97,99,104,101, + 44,32,102,105,110,100,32,116,104,101,32,97,112,112,114,111, + 112,114,105,97,116,101,32,102,105,110,100,101,114,10,32,32, + 32,32,32,32,32,32,97,110,100,32,99,97,99,104,101,32, + 105,116,46,32,73,102,32,110,111,32,102,105,110,100,101,114, + 32,105,115,32,97,118,97,105,108,97,98,108,101,44,32,115, + 116,111,114,101,32,78,111,110,101,46,10,10,32,32,32,32, + 32,32,32,32,114,14,0,0,0,78,41,7,114,24,0,0, + 0,114,81,0,0,0,114,26,1,0,0,114,21,0,0,0, + 114,73,1,0,0,218,8,75,101,121,69,114,114,111,114,114, + 77,1,0,0,41,3,114,216,0,0,0,114,65,0,0,0, + 114,75,1,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,20,95,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,66,5,0,0,115,22, + 0,0,0,0,8,8,1,2,1,12,1,12,3,8,1,2, + 1,14,1,12,1,10,1,16,1,122,31,80,97,116,104,70, + 105,110,100,101,114,46,95,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,99,3,0,0,0,0, + 0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,67, + 0,0,0,115,82,0,0,0,116,0,124,2,100,1,131,2, + 114,26,124,2,160,1,124,1,161,1,92,2,125,3,125,4, + 110,14,124,2,160,2,124,1,161,1,125,3,103,0,125,4, + 124,3,100,0,117,1,114,60,116,3,160,4,124,1,124,3, + 161,2,83,0,116,3,160,5,124,1,100,0,161,2,125,5, + 124,4,124,5,95,6,124,5,83,0,41,2,78,114,161,0, + 0,0,41,7,114,152,0,0,0,114,161,0,0,0,114,229, + 0,0,0,114,158,0,0,0,114,224,0,0,0,114,207,0, + 0,0,114,202,0,0,0,41,6,114,216,0,0,0,114,163, + 0,0,0,114,75,1,0,0,114,164,0,0,0,114,165,0, + 0,0,114,210,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,16,95,108,101,103,97,99,121,95, + 103,101,116,95,115,112,101,99,88,5,0,0,115,18,0,0, + 0,0,4,10,1,16,2,10,1,4,1,8,1,12,1,12, + 1,6,1,122,27,80,97,116,104,70,105,110,100,101,114,46, + 95,108,101,103,97,99,121,95,103,101,116,95,115,112,101,99, + 78,99,4,0,0,0,0,0,0,0,0,0,0,0,9,0, + 0,0,5,0,0,0,67,0,0,0,115,166,0,0,0,103, + 0,125,4,124,2,68,0,93,134,125,5,116,0,124,5,116, + 1,116,2,102,2,131,2,115,28,113,8,124,0,160,3,124, + 5,161,1,125,6,124,6,100,1,117,1,114,8,116,4,124, + 6,100,2,131,2,114,70,124,6,160,5,124,1,124,3,161, + 2,125,7,110,12,124,0,160,6,124,1,124,6,161,2,125, + 7,124,7,100,1,117,0,114,92,113,8,124,7,106,7,100, + 1,117,1,114,110,124,7,2,0,1,0,83,0,124,7,106, + 8,125,8,124,8,100,1,117,0,114,132,116,9,100,3,131, + 1,130,1,124,4,160,10,124,8,161,1,1,0,113,8,116, + 11,160,12,124,1,100,1,161,2,125,7,124,4,124,7,95, + 8,124,7,83,0,41,4,122,63,70,105,110,100,32,116,104, + 101,32,108,111,97,100,101,114,32,111,114,32,110,97,109,101, + 115,112,97,99,101,95,112,97,116,104,32,102,111,114,32,116, + 104,105,115,32,109,111,100,117,108,101,47,112,97,99,107,97, + 103,101,32,110,97,109,101,46,78,114,226,0,0,0,122,19, + 115,112,101,99,32,109,105,115,115,105,110,103,32,108,111,97, + 100,101,114,41,13,114,185,0,0,0,114,108,0,0,0,218, + 5,98,121,116,101,115,114,79,1,0,0,114,152,0,0,0, + 114,226,0,0,0,114,80,1,0,0,114,164,0,0,0,114, + 202,0,0,0,114,141,0,0,0,114,191,0,0,0,114,158, + 0,0,0,114,207,0,0,0,41,9,114,216,0,0,0,114, + 163,0,0,0,114,65,0,0,0,114,225,0,0,0,218,14, + 110,97,109,101,115,112,97,99,101,95,112,97,116,104,90,5, + 101,110,116,114,121,114,75,1,0,0,114,210,0,0,0,114, + 165,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,9,95,103,101,116,95,115,112,101,99,103,5, + 0,0,115,40,0,0,0,0,5,4,1,8,1,14,1,2, + 1,10,1,8,1,10,1,14,2,12,1,8,1,2,1,10, + 1,8,1,6,1,8,1,8,5,12,2,12,1,6,1,122, + 20,80,97,116,104,70,105,110,100,101,114,46,95,103,101,116, + 95,115,112,101,99,99,4,0,0,0,0,0,0,0,0,0, + 0,0,6,0,0,0,5,0,0,0,67,0,0,0,115,100, + 0,0,0,124,2,100,1,117,0,114,14,116,0,106,1,125, + 2,124,0,160,2,124,1,124,2,124,3,161,3,125,4,124, + 4,100,1,117,0,114,40,100,1,83,0,124,4,106,3,100, + 1,117,0,114,92,124,4,106,4,125,5,124,5,114,86,100, + 1,124,4,95,5,116,6,124,1,124,5,124,0,106,2,131, + 3,124,4,95,4,124,4,83,0,100,1,83,0,110,4,124, + 4,83,0,100,1,83,0,41,2,122,141,84,114,121,32,116, + 111,32,102,105,110,100,32,97,32,115,112,101,99,32,102,111, + 114,32,39,102,117,108,108,110,97,109,101,39,32,111,110,32, 115,121,115,46,112,97,116,104,32,111,114,32,39,112,97,116, - 104,39,32,98,97,115,101,100,32,111,110,32,115,121,115,46, - 112,97,116,104,95,104,111,111,107,115,32,97,110,100,10,32, - 32,32,32,32,32,32,32,115,121,115,46,112,97,116,104,95, + 104,39,46,10,10,32,32,32,32,32,32,32,32,84,104,101, + 32,115,101,97,114,99,104,32,105,115,32,98,97,115,101,100, + 32,111,110,32,115,121,115,46,112,97,116,104,95,104,111,111, + 107,115,32,97,110,100,32,115,121,115,46,112,97,116,104,95, 105,109,112,111,114,116,101,114,95,99,97,99,104,101,46,10, - 10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,32,32,85,115,101,32,102,105,110,100,95,115,112, - 101,99,40,41,32,105,110,115,116,101,97,100,46,10,10,32, - 32,32,32,32,32,32,32,78,114,227,0,0,0,114,228,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,229,0,0,0,150,5,0,0,115,8,0,0,0,0, - 8,12,1,8,1,4,1,122,22,80,97,116,104,70,105,110, - 100,101,114,46,102,105,110,100,95,109,111,100,117,108,101,99, - 1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 4,0,0,0,79,0,0,0,115,28,0,0,0,100,1,100, - 2,108,0,109,1,125,3,1,0,124,3,106,2,124,1,105, - 0,124,2,164,1,142,1,83,0,41,3,97,32,1,0,0, - 10,32,32,32,32,32,32,32,32,70,105,110,100,32,100,105, - 115,116,114,105,98,117,116,105,111,110,115,46,10,10,32,32, - 32,32,32,32,32,32,82,101,116,117,114,110,32,97,110,32, - 105,116,101,114,97,98,108,101,32,111,102,32,97,108,108,32, - 68,105,115,116,114,105,98,117,116,105,111,110,32,105,110,115, - 116,97,110,99,101,115,32,99,97,112,97,98,108,101,32,111, - 102,10,32,32,32,32,32,32,32,32,108,111,97,100,105,110, - 103,32,116,104,101,32,109,101,116,97,100,97,116,97,32,102, - 111,114,32,112,97,99,107,97,103,101,115,32,109,97,116,99, - 104,105,110,103,32,96,96,99,111,110,116,101,120,116,46,110, - 97,109,101,96,96,10,32,32,32,32,32,32,32,32,40,111, - 114,32,97,108,108,32,110,97,109,101,115,32,105,102,32,96, - 96,78,111,110,101,96,96,32,105,110,100,105,99,97,116,101, - 100,41,32,97,108,111,110,103,32,116,104,101,32,112,97,116, - 104,115,32,105,110,32,116,104,101,32,108,105,115,116,10,32, - 32,32,32,32,32,32,32,111,102,32,100,105,114,101,99,116, - 111,114,105,101,115,32,96,96,99,111,110,116,101,120,116,46, - 112,97,116,104,96,96,46,10,32,32,32,32,32,32,32,32, - 114,0,0,0,0,41,1,218,18,77,101,116,97,100,97,116, - 97,80,97,116,104,70,105,110,100,101,114,41,3,90,18,105, - 109,112,111,114,116,108,105,98,46,109,101,116,97,100,97,116, - 97,114,82,1,0,0,218,18,102,105,110,100,95,100,105,115, - 116,114,105,98,117,116,105,111,110,115,41,4,114,216,0,0, - 0,114,143,0,0,0,114,144,0,0,0,114,82,1,0,0, + 32,32,32,32,32,32,32,32,78,41,7,114,21,0,0,0, + 114,65,0,0,0,114,83,1,0,0,114,164,0,0,0,114, + 202,0,0,0,114,205,0,0,0,114,45,1,0,0,41,6, + 114,216,0,0,0,114,163,0,0,0,114,65,0,0,0,114, + 225,0,0,0,114,210,0,0,0,114,82,1,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,226,0, + 0,0,135,5,0,0,115,26,0,0,0,0,6,8,1,6, + 1,14,1,8,1,4,1,10,1,6,1,4,3,6,1,16, + 1,4,2,6,2,122,20,80,97,116,104,70,105,110,100,101, + 114,46,102,105,110,100,95,115,112,101,99,99,3,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0, + 67,0,0,0,115,30,0,0,0,124,0,160,0,124,1,124, + 2,161,2,125,3,124,3,100,1,117,0,114,24,100,1,83, + 0,124,3,106,1,83,0,41,2,122,170,102,105,110,100,32, + 116,104,101,32,109,111,100,117,108,101,32,111,110,32,115,121, + 115,46,112,97,116,104,32,111,114,32,39,112,97,116,104,39, + 32,98,97,115,101,100,32,111,110,32,115,121,115,46,112,97, + 116,104,95,104,111,111,107,115,32,97,110,100,10,32,32,32, + 32,32,32,32,32,115,121,115,46,112,97,116,104,95,105,109, + 112,111,114,116,101,114,95,99,97,99,104,101,46,10,10,32, + 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,85,115,101,32,102,105,110,100,95,115,112,101,99, + 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, + 32,32,32,32,32,78,114,227,0,0,0,114,228,0,0,0, 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 83,1,0,0,163,5,0,0,115,4,0,0,0,0,10,12, - 1,122,29,80,97,116,104,70,105,110,100,101,114,46,102,105, - 110,100,95,100,105,115,116,114,105,98,117,116,105,111,110,115, - 41,1,78,41,2,78,78,41,1,78,41,13,114,149,0,0, - 0,114,148,0,0,0,114,150,0,0,0,114,151,0,0,0, - 114,230,0,0,0,114,69,1,0,0,114,75,1,0,0,114, - 77,1,0,0,114,78,1,0,0,114,81,1,0,0,114,226, - 0,0,0,114,229,0,0,0,114,83,1,0,0,114,10,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,68,1,0,0,30,5,0,0,115,34,0,0,0,8, - 2,4,2,2,1,10,9,2,1,10,12,2,1,10,21,2, - 1,10,14,2,1,12,31,2,1,12,23,2,1,12,12,2, - 1,114,68,1,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, - 90,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, - 101,6,90,7,100,6,100,7,132,0,90,8,100,8,100,9, - 132,0,90,9,100,19,100,11,100,12,132,1,90,10,100,13, - 100,14,132,0,90,11,101,12,100,15,100,16,132,0,131,1, - 90,13,100,17,100,18,132,0,90,14,100,10,83,0,41,20, - 218,10,70,105,108,101,70,105,110,100,101,114,122,172,70,105, - 108,101,45,98,97,115,101,100,32,102,105,110,100,101,114,46, - 10,10,32,32,32,32,73,110,116,101,114,97,99,116,105,111, - 110,115,32,119,105,116,104,32,116,104,101,32,102,105,108,101, - 32,115,121,115,116,101,109,32,97,114,101,32,99,97,99,104, - 101,100,32,102,111,114,32,112,101,114,102,111,114,109,97,110, - 99,101,44,32,98,101,105,110,103,10,32,32,32,32,114,101, - 102,114,101,115,104,101,100,32,119,104,101,110,32,116,104,101, - 32,100,105,114,101,99,116,111,114,121,32,116,104,101,32,102, - 105,110,100,101,114,32,105,115,32,104,97,110,100,108,105,110, - 103,32,104,97,115,32,98,101,101,110,32,109,111,100,105,102, - 105,101,100,46,10,10,32,32,32,32,99,2,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,7, - 0,0,0,115,112,0,0,0,103,0,125,3,124,2,68,0, - 93,32,92,2,137,0,125,4,124,3,160,0,135,0,102,1, - 100,1,100,2,132,8,124,4,68,0,131,1,161,1,1,0, - 113,8,124,3,124,0,95,1,124,1,112,54,100,3,124,0, - 95,2,116,3,124,0,106,2,131,1,115,86,116,4,116,5, - 160,6,161,0,124,0,106,2,131,2,124,0,95,2,100,4, - 124,0,95,7,116,8,131,0,124,0,95,9,116,8,131,0, - 124,0,95,10,100,5,83,0,41,6,122,154,73,110,105,116, - 105,97,108,105,122,101,32,119,105,116,104,32,116,104,101,32, - 112,97,116,104,32,116,111,32,115,101,97,114,99,104,32,111, - 110,32,97,110,100,32,97,32,118,97,114,105,97,98,108,101, - 32,110,117,109,98,101,114,32,111,102,10,32,32,32,32,32, - 32,32,32,50,45,116,117,112,108,101,115,32,99,111,110,116, - 97,105,110,105,110,103,32,116,104,101,32,108,111,97,100,101, - 114,32,97,110,100,32,116,104,101,32,102,105,108,101,32,115, - 117,102,102,105,120,101,115,32,116,104,101,32,108,111,97,100, - 101,114,10,32,32,32,32,32,32,32,32,114,101,99,111,103, - 110,105,122,101,115,46,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,51,0,0,0,115, - 22,0,0,0,124,0,93,14,125,1,124,1,136,0,102,2, - 86,0,1,0,113,2,100,0,83,0,114,69,0,0,0,114, - 10,0,0,0,114,40,1,0,0,169,1,114,164,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,12,0,0,0,192, - 5,0,0,114,13,0,0,0,122,38,70,105,108,101,70,105, - 110,100,101,114,46,95,95,105,110,105,116,95,95,46,60,108, - 111,99,97,108,115,62,46,60,103,101,110,101,120,112,114,62, - 114,96,0,0,0,114,129,0,0,0,78,41,11,114,191,0, - 0,0,218,8,95,108,111,97,100,101,114,115,114,65,0,0, - 0,114,85,0,0,0,114,67,0,0,0,114,24,0,0,0, - 114,81,0,0,0,218,11,95,112,97,116,104,95,109,116,105, - 109,101,218,3,115,101,116,218,11,95,112,97,116,104,95,99, - 97,99,104,101,218,19,95,114,101,108,97,120,101,100,95,112, - 97,116,104,95,99,97,99,104,101,41,5,114,142,0,0,0, - 114,65,0,0,0,218,14,108,111,97,100,101,114,95,100,101, - 116,97,105,108,115,90,7,108,111,97,100,101,114,115,114,212, - 0,0,0,114,10,0,0,0,114,85,1,0,0,114,11,0, - 0,0,114,232,0,0,0,186,5,0,0,115,20,0,0,0, - 0,4,4,1,12,1,26,1,6,2,10,1,10,1,18,1, - 6,1,8,1,122,19,70,105,108,101,70,105,110,100,101,114, - 46,95,95,105,110,105,116,95,95,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,2,0,0,0,67,0, - 0,0,115,10,0,0,0,100,1,124,0,95,0,100,2,83, - 0,41,3,122,31,73,110,118,97,108,105,100,97,116,101,32, - 116,104,101,32,100,105,114,101,99,116,111,114,121,32,109,116, - 105,109,101,46,114,129,0,0,0,78,41,1,114,87,1,0, - 0,114,13,1,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,69,1,0,0,202,5,0,0,115,2, - 0,0,0,0,2,122,28,70,105,108,101,70,105,110,100,101, - 114,46,105,110,118,97,108,105,100,97,116,101,95,99,97,99, - 104,101,115,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,3,0,0,0,67,0,0,0,115,42,0,0, - 0,124,0,160,0,124,1,161,1,125,2,124,2,100,1,117, - 0,114,26,100,1,103,0,102,2,83,0,124,2,106,1,124, - 2,106,2,112,38,103,0,102,2,83,0,41,2,122,197,84, - 114,121,32,116,111,32,102,105,110,100,32,97,32,108,111,97, - 100,101,114,32,102,111,114,32,116,104,101,32,115,112,101,99, - 105,102,105,101,100,32,109,111,100,117,108,101,44,32,111,114, - 32,116,104,101,32,110,97,109,101,115,112,97,99,101,10,32, - 32,32,32,32,32,32,32,112,97,99,107,97,103,101,32,112, - 111,114,116,105,111,110,115,46,32,82,101,116,117,114,110,115, - 32,40,108,111,97,100,101,114,44,32,108,105,115,116,45,111, - 102,45,112,111,114,116,105,111,110,115,41,46,10,10,32,32, - 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,85,115,101,32,102,105,110,100,95,115,112,101,99,40, - 41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32, - 32,32,32,32,78,41,3,114,226,0,0,0,114,164,0,0, - 0,114,202,0,0,0,41,3,114,142,0,0,0,114,163,0, - 0,0,114,210,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,161,0,0,0,208,5,0,0,115, - 8,0,0,0,0,7,10,1,8,1,8,1,122,22,70,105, - 108,101,70,105,110,100,101,114,46,102,105,110,100,95,108,111, - 97,100,101,114,99,6,0,0,0,0,0,0,0,0,0,0, - 0,7,0,0,0,6,0,0,0,67,0,0,0,115,26,0, - 0,0,124,1,124,2,124,3,131,2,125,6,116,0,124,2, - 124,3,124,6,124,4,100,1,141,4,83,0,41,2,78,114, - 201,0,0,0,41,1,114,213,0,0,0,41,7,114,142,0, - 0,0,114,211,0,0,0,114,163,0,0,0,114,65,0,0, - 0,90,4,115,109,115,108,114,225,0,0,0,114,164,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,81,1,0,0,220,5,0,0,115,8,0,0,0,0,1, - 10,1,8,1,2,255,122,20,70,105,108,101,70,105,110,100, - 101,114,46,95,103,101,116,95,115,112,101,99,78,99,3,0, - 0,0,0,0,0,0,0,0,0,0,14,0,0,0,9,0, - 0,0,67,0,0,0,115,126,1,0,0,100,1,125,3,124, - 1,160,0,100,2,161,1,100,3,25,0,125,4,122,24,116, - 1,124,0,106,2,112,34,116,3,160,4,161,0,131,1,106, - 5,125,5,87,0,110,22,4,0,116,6,121,64,1,0,1, - 0,1,0,100,4,125,5,89,0,110,2,48,0,124,5,124, - 0,106,7,107,3,114,90,124,0,160,8,161,0,1,0,124, - 5,124,0,95,7,116,9,131,0,114,112,124,0,106,10,125, - 6,124,4,160,11,161,0,125,7,110,10,124,0,106,12,125, - 6,124,4,125,7,124,7,124,6,118,0,114,216,116,13,124, - 0,106,2,124,4,131,2,125,8,124,0,106,14,68,0,93, - 58,92,2,125,9,125,10,100,5,124,9,23,0,125,11,116, - 13,124,8,124,11,131,2,125,12,116,15,124,12,131,1,114, - 148,124,0,160,16,124,10,124,1,124,12,124,8,103,1,124, - 2,161,5,2,0,1,0,83,0,113,148,116,17,124,8,131, - 1,125,3,124,0,106,14,68,0,93,112,92,2,125,9,125, - 10,122,20,116,13,124,0,106,2,124,4,124,9,23,0,131, - 2,125,12,87,0,110,24,4,0,116,18,144,1,121,18,1, - 0,1,0,1,0,89,0,1,0,100,6,83,0,48,0,116, - 19,106,20,100,7,124,12,100,3,100,8,141,3,1,0,124, - 7,124,9,23,0,124,6,118,0,114,222,116,15,124,12,131, - 1,114,222,124,0,160,16,124,10,124,1,124,12,100,6,124, - 2,161,5,2,0,1,0,83,0,113,222,124,3,144,1,114, - 122,116,19,160,20,100,9,124,8,161,2,1,0,116,19,160, - 21,124,1,100,6,161,2,125,13,124,8,103,1,124,13,95, - 22,124,13,83,0,100,6,83,0,41,10,122,111,84,114,121, - 32,116,111,32,102,105,110,100,32,97,32,115,112,101,99,32, - 102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101, - 100,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, - 32,32,32,82,101,116,117,114,110,115,32,116,104,101,32,109, - 97,116,99,104,105,110,103,32,115,112,101,99,44,32,111,114, - 32,78,111,110,101,32,105,102,32,110,111,116,32,102,111,117, - 110,100,46,10,32,32,32,32,32,32,32,32,70,114,96,0, - 0,0,114,45,0,0,0,114,129,0,0,0,114,232,0,0, - 0,78,122,9,116,114,121,105,110,103,32,123,125,41,1,90, - 9,118,101,114,98,111,115,105,116,121,122,25,112,111,115,115, - 105,98,108,101,32,110,97,109,101,115,112,97,99,101,32,102, - 111,114,32,123,125,41,23,114,103,0,0,0,114,75,0,0, - 0,114,65,0,0,0,114,24,0,0,0,114,81,0,0,0, - 114,33,1,0,0,114,76,0,0,0,114,87,1,0,0,218, - 11,95,102,105,108,108,95,99,97,99,104,101,114,27,0,0, - 0,114,90,1,0,0,114,130,0,0,0,114,89,1,0,0, - 114,67,0,0,0,114,86,1,0,0,114,80,0,0,0,114, - 81,1,0,0,114,82,0,0,0,114,110,0,0,0,114,158, - 0,0,0,114,173,0,0,0,114,207,0,0,0,114,202,0, - 0,0,41,14,114,142,0,0,0,114,163,0,0,0,114,225, - 0,0,0,90,12,105,115,95,110,97,109,101,115,112,97,99, - 101,90,11,116,97,105,108,95,109,111,100,117,108,101,114,193, - 0,0,0,90,5,99,97,99,104,101,90,12,99,97,99,104, - 101,95,109,111,100,117,108,101,90,9,98,97,115,101,95,112, - 97,116,104,114,41,1,0,0,114,211,0,0,0,90,13,105, - 110,105,116,95,102,105,108,101,110,97,109,101,90,9,102,117, - 108,108,95,112,97,116,104,114,210,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,226,0,0,0, - 225,5,0,0,115,78,0,0,0,0,5,4,1,14,1,2, - 1,24,1,12,1,10,1,10,1,8,1,6,2,6,1,6, - 1,10,2,6,1,4,2,8,1,12,1,14,1,8,1,10, - 1,8,1,26,4,8,2,14,1,2,1,20,1,14,1,10, - 1,16,1,12,1,8,1,10,1,4,255,10,2,6,1,12, - 1,12,1,8,1,4,1,122,20,70,105,108,101,70,105,110, - 100,101,114,46,102,105,110,100,95,115,112,101,99,99,1,0, - 0,0,0,0,0,0,0,0,0,0,9,0,0,0,10,0, - 0,0,67,0,0,0,115,188,0,0,0,124,0,106,0,125, - 1,122,22,116,1,160,2,124,1,112,22,116,1,160,3,161, - 0,161,1,125,2,87,0,110,28,4,0,116,4,116,5,116, - 6,102,3,121,56,1,0,1,0,1,0,103,0,125,2,89, - 0,110,2,48,0,116,7,106,8,160,9,100,1,161,1,115, - 82,116,10,124,2,131,1,124,0,95,11,110,74,116,10,131, - 0,125,3,124,2,68,0,93,56,125,4,124,4,160,12,100, - 2,161,1,92,3,125,5,125,6,125,7,124,6,114,134,100, - 3,160,13,124,5,124,7,160,14,161,0,161,2,125,8,110, - 4,124,5,125,8,124,3,160,15,124,8,161,1,1,0,113, - 92,124,3,124,0,95,11,116,7,106,8,160,9,116,16,161, - 1,114,184,100,4,100,5,132,0,124,2,68,0,131,1,124, - 0,95,17,100,6,83,0,41,7,122,68,70,105,108,108,32, - 116,104,101,32,99,97,99,104,101,32,111,102,32,112,111,116, - 101,110,116,105,97,108,32,109,111,100,117,108,101,115,32,97, - 110,100,32,112,97,99,107,97,103,101,115,32,102,111,114,32, - 116,104,105,115,32,100,105,114,101,99,116,111,114,121,46,114, - 20,0,0,0,114,96,0,0,0,114,87,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, - 0,0,0,83,0,0,0,115,20,0,0,0,104,0,124,0, - 93,12,125,1,124,1,160,0,161,0,146,2,113,4,83,0, - 114,10,0,0,0,41,1,114,130,0,0,0,41,2,114,8, - 0,0,0,90,2,102,110,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,19,0,0,0,49,6,0,0,114, - 13,0,0,0,122,41,70,105,108,101,70,105,110,100,101,114, - 46,95,102,105,108,108,95,99,97,99,104,101,46,60,108,111, - 99,97,108,115,62,46,60,115,101,116,99,111,109,112,62,78, - 41,18,114,65,0,0,0,114,24,0,0,0,114,30,1,0, - 0,114,81,0,0,0,114,26,1,0,0,218,15,80,101,114, - 109,105,115,115,105,111,110,69,114,114,111,114,218,18,78,111, - 116,65,68,105,114,101,99,116,111,114,121,69,114,114,111,114, - 114,21,0,0,0,114,28,0,0,0,114,29,0,0,0,114, - 88,1,0,0,114,89,1,0,0,114,125,0,0,0,114,88, - 0,0,0,114,130,0,0,0,218,3,97,100,100,114,30,0, - 0,0,114,90,1,0,0,41,9,114,142,0,0,0,114,65, - 0,0,0,114,31,1,0,0,90,21,108,111,119,101,114,95, - 115,117,102,102,105,120,95,99,111,110,116,101,110,116,115,114, - 64,1,0,0,114,140,0,0,0,114,52,1,0,0,114,41, - 1,0,0,90,8,110,101,119,95,110,97,109,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,92,1,0, - 0,20,6,0,0,115,34,0,0,0,0,2,6,1,2,1, - 22,1,18,3,10,3,12,1,12,7,6,1,8,1,16,1, - 4,1,18,2,4,1,12,1,6,1,12,1,122,22,70,105, - 108,101,70,105,110,100,101,114,46,95,102,105,108,108,95,99, - 97,99,104,101,99,1,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,3,0,0,0,7,0,0,0,115,18,0, - 0,0,135,0,135,1,102,2,100,1,100,2,132,8,125,2, - 124,2,83,0,41,3,97,20,1,0,0,65,32,99,108,97, - 115,115,32,109,101,116,104,111,100,32,119,104,105,99,104,32, - 114,101,116,117,114,110,115,32,97,32,99,108,111,115,117,114, - 101,32,116,111,32,117,115,101,32,111,110,32,115,121,115,46, - 112,97,116,104,95,104,111,111,107,10,32,32,32,32,32,32, - 32,32,119,104,105,99,104,32,119,105,108,108,32,114,101,116, - 117,114,110,32,97,110,32,105,110,115,116,97,110,99,101,32, - 117,115,105,110,103,32,116,104,101,32,115,112,101,99,105,102, - 105,101,100,32,108,111,97,100,101,114,115,32,97,110,100,32, - 116,104,101,32,112,97,116,104,10,32,32,32,32,32,32,32, - 32,99,97,108,108,101,100,32,111,110,32,116,104,101,32,99, - 108,111,115,117,114,101,46,10,10,32,32,32,32,32,32,32, - 32,73,102,32,116,104,101,32,112,97,116,104,32,99,97,108, - 108,101,100,32,111,110,32,116,104,101,32,99,108,111,115,117, - 114,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101, - 99,116,111,114,121,44,32,73,109,112,111,114,116,69,114,114, - 111,114,32,105,115,10,32,32,32,32,32,32,32,32,114,97, - 105,115,101,100,46,10,10,32,32,32,32,32,32,32,32,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 4,0,0,0,19,0,0,0,115,36,0,0,0,116,0,124, - 0,131,1,115,20,116,1,100,1,124,0,100,2,141,2,130, - 1,136,0,124,0,103,1,136,1,162,1,82,0,142,0,83, - 0,41,3,122,45,80,97,116,104,32,104,111,111,107,32,102, - 111,114,32,105,109,112,111,114,116,108,105,98,46,109,97,99, - 104,105,110,101,114,121,46,70,105,108,101,70,105,110,100,101, - 114,46,122,30,111,110,108,121,32,100,105,114,101,99,116,111, - 114,105,101,115,32,97,114,101,32,115,117,112,112,111,114,116, - 101,100,114,71,0,0,0,41,2,114,82,0,0,0,114,141, - 0,0,0,114,71,0,0,0,169,2,114,216,0,0,0,114, - 91,1,0,0,114,10,0,0,0,114,11,0,0,0,218,24, - 112,97,116,104,95,104,111,111,107,95,102,111,114,95,70,105, - 108,101,70,105,110,100,101,114,61,6,0,0,115,6,0,0, - 0,0,2,8,1,12,1,122,54,70,105,108,101,70,105,110, - 100,101,114,46,112,97,116,104,95,104,111,111,107,46,60,108, - 111,99,97,108,115,62,46,112,97,116,104,95,104,111,111,107, - 95,102,111,114,95,70,105,108,101,70,105,110,100,101,114,114, - 10,0,0,0,41,3,114,216,0,0,0,114,91,1,0,0, - 114,97,1,0,0,114,10,0,0,0,114,96,1,0,0,114, - 11,0,0,0,218,9,112,97,116,104,95,104,111,111,107,51, - 6,0,0,115,4,0,0,0,0,10,14,6,122,20,70,105, - 108,101,70,105,110,100,101,114,46,112,97,116,104,95,104,111, - 111,107,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, - 100,1,160,0,124,0,106,1,161,1,83,0,41,2,78,122, - 16,70,105,108,101,70,105,110,100,101,114,40,123,33,114,125, - 41,41,2,114,88,0,0,0,114,65,0,0,0,114,13,1, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,62,1,0,0,69,6,0,0,115,2,0,0,0,0, - 1,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95, - 114,101,112,114,95,95,41,1,78,41,15,114,149,0,0,0, - 114,148,0,0,0,114,150,0,0,0,114,151,0,0,0,114, - 232,0,0,0,114,69,1,0,0,114,167,0,0,0,114,229, - 0,0,0,114,161,0,0,0,114,81,1,0,0,114,226,0, - 0,0,114,92,1,0,0,114,230,0,0,0,114,98,1,0, - 0,114,62,1,0,0,114,10,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,84,1,0,0,177, - 5,0,0,115,22,0,0,0,8,2,4,7,8,16,8,4, - 4,2,8,12,8,5,10,51,8,31,2,1,10,17,114,84, - 1,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0, - 6,0,0,0,8,0,0,0,67,0,0,0,115,144,0,0, - 0,124,0,160,0,100,1,161,1,125,4,124,0,160,0,100, - 2,161,1,125,5,124,4,115,66,124,5,114,36,124,5,106, - 1,125,4,110,30,124,2,124,3,107,2,114,56,116,2,124, - 1,124,2,131,2,125,4,110,10,116,3,124,1,124,2,131, - 2,125,4,124,5,115,84,116,4,124,1,124,2,124,4,100, - 3,141,3,125,5,122,36,124,5,124,0,100,2,60,0,124, - 4,124,0,100,1,60,0,124,2,124,0,100,4,60,0,124, - 3,124,0,100,5,60,0,87,0,110,18,4,0,116,5,121, - 138,1,0,1,0,1,0,89,0,110,2,48,0,100,0,83, - 0,41,6,78,218,10,95,95,108,111,97,100,101,114,95,95, - 218,8,95,95,115,112,101,99,95,95,114,85,1,0,0,90, - 8,95,95,102,105,108,101,95,95,90,10,95,95,99,97,99, - 104,101,100,95,95,41,6,218,3,103,101,116,114,164,0,0, - 0,114,39,1,0,0,114,32,1,0,0,114,213,0,0,0, - 218,9,69,120,99,101,112,116,105,111,110,41,6,90,2,110, - 115,114,140,0,0,0,90,8,112,97,116,104,110,97,109,101, - 90,9,99,112,97,116,104,110,97,109,101,114,164,0,0,0, + 229,0,0,0,159,5,0,0,115,8,0,0,0,0,8,12, + 1,8,1,4,1,122,22,80,97,116,104,70,105,110,100,101, + 114,46,102,105,110,100,95,109,111,100,117,108,101,99,1,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, + 0,0,79,0,0,0,115,28,0,0,0,100,1,100,2,108, + 0,109,1,125,3,1,0,124,3,106,2,124,1,105,0,124, + 2,164,1,142,1,83,0,41,3,97,32,1,0,0,10,32, + 32,32,32,32,32,32,32,70,105,110,100,32,100,105,115,116, + 114,105,98,117,116,105,111,110,115,46,10,10,32,32,32,32, + 32,32,32,32,82,101,116,117,114,110,32,97,110,32,105,116, + 101,114,97,98,108,101,32,111,102,32,97,108,108,32,68,105, + 115,116,114,105,98,117,116,105,111,110,32,105,110,115,116,97, + 110,99,101,115,32,99,97,112,97,98,108,101,32,111,102,10, + 32,32,32,32,32,32,32,32,108,111,97,100,105,110,103,32, + 116,104,101,32,109,101,116,97,100,97,116,97,32,102,111,114, + 32,112,97,99,107,97,103,101,115,32,109,97,116,99,104,105, + 110,103,32,96,96,99,111,110,116,101,120,116,46,110,97,109, + 101,96,96,10,32,32,32,32,32,32,32,32,40,111,114,32, + 97,108,108,32,110,97,109,101,115,32,105,102,32,96,96,78, + 111,110,101,96,96,32,105,110,100,105,99,97,116,101,100,41, + 32,97,108,111,110,103,32,116,104,101,32,112,97,116,104,115, + 32,105,110,32,116,104,101,32,108,105,115,116,10,32,32,32, + 32,32,32,32,32,111,102,32,100,105,114,101,99,116,111,114, + 105,101,115,32,96,96,99,111,110,116,101,120,116,46,112,97, + 116,104,96,96,46,10,32,32,32,32,32,32,32,32,114,0, + 0,0,0,41,1,218,18,77,101,116,97,100,97,116,97,80, + 97,116,104,70,105,110,100,101,114,41,3,90,18,105,109,112, + 111,114,116,108,105,98,46,109,101,116,97,100,97,116,97,114, + 84,1,0,0,218,18,102,105,110,100,95,100,105,115,116,114, + 105,98,117,116,105,111,110,115,41,4,114,216,0,0,0,114, + 143,0,0,0,114,144,0,0,0,114,84,1,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,85,1, + 0,0,172,5,0,0,115,4,0,0,0,0,10,12,1,122, + 29,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100, + 95,100,105,115,116,114,105,98,117,116,105,111,110,115,41,1, + 78,41,2,78,78,41,1,78,41,13,114,149,0,0,0,114, + 148,0,0,0,114,150,0,0,0,114,151,0,0,0,114,230, + 0,0,0,114,71,1,0,0,114,77,1,0,0,114,79,1, + 0,0,114,80,1,0,0,114,83,1,0,0,114,226,0,0, + 0,114,229,0,0,0,114,85,1,0,0,114,10,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 70,1,0,0,36,5,0,0,115,34,0,0,0,8,2,4, + 2,2,1,10,12,2,1,10,12,2,1,10,21,2,1,10, + 14,2,1,12,31,2,1,12,23,2,1,12,12,2,1,114, + 70,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,64,0,0,0,115,90,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, + 100,3,132,0,90,4,100,4,100,5,132,0,90,5,101,6, + 90,7,100,6,100,7,132,0,90,8,100,8,100,9,132,0, + 90,9,100,19,100,11,100,12,132,1,90,10,100,13,100,14, + 132,0,90,11,101,12,100,15,100,16,132,0,131,1,90,13, + 100,17,100,18,132,0,90,14,100,10,83,0,41,20,218,10, + 70,105,108,101,70,105,110,100,101,114,122,172,70,105,108,101, + 45,98,97,115,101,100,32,102,105,110,100,101,114,46,10,10, + 32,32,32,32,73,110,116,101,114,97,99,116,105,111,110,115, + 32,119,105,116,104,32,116,104,101,32,102,105,108,101,32,115, + 121,115,116,101,109,32,97,114,101,32,99,97,99,104,101,100, + 32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101, + 44,32,98,101,105,110,103,10,32,32,32,32,114,101,102,114, + 101,115,104,101,100,32,119,104,101,110,32,116,104,101,32,100, + 105,114,101,99,116,111,114,121,32,116,104,101,32,102,105,110, + 100,101,114,32,105,115,32,104,97,110,100,108,105,110,103,32, + 104,97,115,32,98,101,101,110,32,109,111,100,105,102,105,101, + 100,46,10,10,32,32,32,32,99,2,0,0,0,0,0,0, + 0,0,0,0,0,5,0,0,0,6,0,0,0,7,0,0, + 0,115,112,0,0,0,103,0,125,3,124,2,68,0,93,32, + 92,2,137,0,125,4,124,3,160,0,135,0,102,1,100,1, + 100,2,132,8,124,4,68,0,131,1,161,1,1,0,113,8, + 124,3,124,0,95,1,124,1,112,54,100,3,124,0,95,2, + 116,3,124,0,106,2,131,1,115,86,116,4,116,5,160,6, + 161,0,124,0,106,2,131,2,124,0,95,2,100,4,124,0, + 95,7,116,8,131,0,124,0,95,9,116,8,131,0,124,0, + 95,10,100,5,83,0,41,6,122,154,73,110,105,116,105,97, + 108,105,122,101,32,119,105,116,104,32,116,104,101,32,112,97, + 116,104,32,116,111,32,115,101,97,114,99,104,32,111,110,32, + 97,110,100,32,97,32,118,97,114,105,97,98,108,101,32,110, + 117,109,98,101,114,32,111,102,10,32,32,32,32,32,32,32, + 32,50,45,116,117,112,108,101,115,32,99,111,110,116,97,105, + 110,105,110,103,32,116,104,101,32,108,111,97,100,101,114,32, + 97,110,100,32,116,104,101,32,102,105,108,101,32,115,117,102, + 102,105,120,101,115,32,116,104,101,32,108,111,97,100,101,114, + 10,32,32,32,32,32,32,32,32,114,101,99,111,103,110,105, + 122,101,115,46,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,51,0,0,0,115,22,0, + 0,0,124,0,93,14,125,1,124,1,136,0,102,2,86,0, + 1,0,113,2,100,0,83,0,114,69,0,0,0,114,10,0, + 0,0,114,40,1,0,0,169,1,114,164,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,12,0,0,0,201,5,0, + 0,114,13,0,0,0,122,38,70,105,108,101,70,105,110,100, + 101,114,46,95,95,105,110,105,116,95,95,46,60,108,111,99, + 97,108,115,62,46,60,103,101,110,101,120,112,114,62,114,96, + 0,0,0,114,129,0,0,0,78,41,11,114,191,0,0,0, + 218,8,95,108,111,97,100,101,114,115,114,65,0,0,0,114, + 85,0,0,0,114,67,0,0,0,114,24,0,0,0,114,81, + 0,0,0,218,11,95,112,97,116,104,95,109,116,105,109,101, + 218,3,115,101,116,218,11,95,112,97,116,104,95,99,97,99, + 104,101,218,19,95,114,101,108,97,120,101,100,95,112,97,116, + 104,95,99,97,99,104,101,41,5,114,142,0,0,0,114,65, + 0,0,0,218,14,108,111,97,100,101,114,95,100,101,116,97, + 105,108,115,90,7,108,111,97,100,101,114,115,114,212,0,0, + 0,114,10,0,0,0,114,87,1,0,0,114,11,0,0,0, + 114,232,0,0,0,195,5,0,0,115,20,0,0,0,0,4, + 4,1,12,1,26,1,6,2,10,1,10,1,18,1,6,1, + 8,1,122,19,70,105,108,101,70,105,110,100,101,114,46,95, + 95,105,110,105,116,95,95,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,2,0,0,0,67,0,0,0, + 115,10,0,0,0,100,1,124,0,95,0,100,2,83,0,41, + 3,122,31,73,110,118,97,108,105,100,97,116,101,32,116,104, + 101,32,100,105,114,101,99,116,111,114,121,32,109,116,105,109, + 101,46,114,129,0,0,0,78,41,1,114,89,1,0,0,114, + 13,1,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,71,1,0,0,211,5,0,0,115,2,0,0, + 0,0,2,122,28,70,105,108,101,70,105,110,100,101,114,46, + 105,110,118,97,108,105,100,97,116,101,95,99,97,99,104,101, + 115,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,3,0,0,0,67,0,0,0,115,42,0,0,0,124, + 0,160,0,124,1,161,1,125,2,124,2,100,1,117,0,114, + 26,100,1,103,0,102,2,83,0,124,2,106,1,124,2,106, + 2,112,38,103,0,102,2,83,0,41,2,122,197,84,114,121, + 32,116,111,32,102,105,110,100,32,97,32,108,111,97,100,101, + 114,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102, + 105,101,100,32,109,111,100,117,108,101,44,32,111,114,32,116, + 104,101,32,110,97,109,101,115,112,97,99,101,10,32,32,32, + 32,32,32,32,32,112,97,99,107,97,103,101,32,112,111,114, + 116,105,111,110,115,46,32,82,101,116,117,114,110,115,32,40, + 108,111,97,100,101,114,44,32,108,105,115,116,45,111,102,45, + 112,111,114,116,105,111,110,115,41,46,10,10,32,32,32,32, + 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, + 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32, + 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, + 32,32,78,41,3,114,226,0,0,0,114,164,0,0,0,114, + 202,0,0,0,41,3,114,142,0,0,0,114,163,0,0,0, 114,210,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,14,95,102,105,120,95,117,112,95,109,111, - 100,117,108,101,75,6,0,0,115,34,0,0,0,0,2,10, - 1,10,1,4,1,4,1,8,1,8,1,12,2,10,1,4, - 1,14,1,2,1,8,1,8,1,8,1,12,1,12,2,114, - 103,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,3,0,0,0,67,0,0,0,115,38,0, - 0,0,116,0,116,1,160,2,161,0,102,2,125,0,116,3, - 116,4,102,2,125,1,116,5,116,6,102,2,125,2,124,0, - 124,1,124,2,103,3,83,0,41,1,122,95,82,101,116,117, - 114,110,115,32,97,32,108,105,115,116,32,111,102,32,102,105, - 108,101,45,98,97,115,101,100,32,109,111,100,117,108,101,32, - 108,111,97,100,101,114,115,46,10,10,32,32,32,32,69,97, - 99,104,32,105,116,101,109,32,105,115,32,97,32,116,117,112, - 108,101,32,40,108,111,97,100,101,114,44,32,115,117,102,102, - 105,120,101,115,41,46,10,32,32,32,32,41,7,114,19,1, - 0,0,114,187,0,0,0,218,18,101,120,116,101,110,115,105, - 111,110,95,115,117,102,102,105,120,101,115,114,32,1,0,0, - 114,126,0,0,0,114,39,1,0,0,114,112,0,0,0,41, - 3,90,10,101,120,116,101,110,115,105,111,110,115,90,6,115, - 111,117,114,99,101,90,8,98,121,116,101,99,111,100,101,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,208, - 0,0,0,98,6,0,0,115,8,0,0,0,0,5,12,1, - 8,1,8,1,114,208,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,10,0,0,0,9,0,0,0,67,0, - 0,0,115,132,1,0,0,124,0,97,0,116,0,106,1,97, - 1,116,0,106,2,97,2,116,1,106,3,116,4,25,0,125, - 1,100,1,100,2,103,1,102,2,100,3,100,4,100,2,103, - 2,102,2,102,2,125,2,124,2,68,0,93,108,92,2,125, - 3,125,4,116,5,100,5,100,6,132,0,124,4,68,0,131, - 1,131,1,115,82,74,0,130,1,124,4,100,7,25,0,125, - 5,124,3,116,1,106,3,118,0,114,116,116,1,106,3,124, - 3,25,0,125,6,1,0,113,170,113,52,122,20,116,0,160, - 6,124,3,161,1,125,6,87,0,1,0,113,170,87,0,113, - 52,4,0,116,7,121,158,1,0,1,0,1,0,89,0,113, - 52,89,0,113,52,48,0,113,52,116,7,100,8,131,1,130, - 1,116,8,124,1,100,9,124,6,131,3,1,0,116,8,124, - 1,100,10,124,5,131,3,1,0,116,8,124,1,100,11,100, - 12,160,9,124,4,161,1,131,3,1,0,116,8,124,1,100, - 13,100,14,100,15,132,0,124,4,68,0,131,1,131,3,1, - 0,103,0,100,16,162,1,125,7,124,3,100,3,107,2,144, - 1,114,6,124,7,160,10,100,17,161,1,1,0,124,7,68, - 0,93,52,125,8,124,8,116,1,106,3,118,1,144,1,114, - 38,116,0,160,6,124,8,161,1,125,9,110,10,116,1,106, - 3,124,8,25,0,125,9,116,8,124,1,124,8,124,9,131, - 3,1,0,144,1,113,10,116,8,124,1,100,18,116,11,131, - 0,131,3,1,0,116,12,160,13,116,2,160,14,161,0,161, - 1,1,0,124,3,100,3,107,2,144,1,114,128,116,15,160, - 10,100,19,161,1,1,0,100,20,116,12,118,0,144,1,114, - 128,100,21,116,16,95,17,100,22,83,0,41,23,122,205,83, - 101,116,117,112,32,116,104,101,32,112,97,116,104,45,98,97, - 115,101,100,32,105,109,112,111,114,116,101,114,115,32,102,111, - 114,32,105,109,112,111,114,116,108,105,98,32,98,121,32,105, - 109,112,111,114,116,105,110,103,32,110,101,101,100,101,100,10, - 32,32,32,32,98,117,105,108,116,45,105,110,32,109,111,100, - 117,108,101,115,32,97,110,100,32,105,110,106,101,99,116,105, - 110,103,32,116,104,101,109,32,105,110,116,111,32,116,104,101, - 32,103,108,111,98,97,108,32,110,97,109,101,115,112,97,99, - 101,46,10,10,32,32,32,32,79,116,104,101,114,32,99,111, - 109,112,111,110,101,110,116,115,32,97,114,101,32,101,120,116, - 114,97,99,116,101,100,32,102,114,111,109,32,116,104,101,32, - 99,111,114,101,32,98,111,111,116,115,116,114,97,112,32,109, - 111,100,117,108,101,46,10,10,32,32,32,32,218,5,112,111, - 115,105,120,114,2,0,0,0,218,2,110,116,114,1,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,115,0,0,0,115,26,0,0,0,124, - 0,93,18,125,1,116,0,124,1,131,1,100,0,107,2,86, - 0,1,0,113,2,100,1,83,0,114,3,0,0,0,114,5, - 0,0,0,114,7,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,12,0,0,0,127,6,0,0, - 114,13,0,0,0,122,25,95,115,101,116,117,112,46,60,108, - 111,99,97,108,115,62,46,60,103,101,110,101,120,112,114,62, - 114,0,0,0,0,122,30,105,109,112,111,114,116,108,105,98, - 32,114,101,113,117,105,114,101,115,32,112,111,115,105,120,32, - 111,114,32,110,116,114,24,0,0,0,114,59,0,0,0,114, - 50,0,0,0,114,14,0,0,0,218,20,95,112,97,116,104, - 115,101,112,115,95,119,105,116,104,95,99,111,108,111,110,99, + 11,0,0,0,114,161,0,0,0,217,5,0,0,115,8,0, + 0,0,0,7,10,1,8,1,8,1,122,22,70,105,108,101, + 70,105,110,100,101,114,46,102,105,110,100,95,108,111,97,100, + 101,114,99,6,0,0,0,0,0,0,0,0,0,0,0,7, + 0,0,0,6,0,0,0,67,0,0,0,115,26,0,0,0, + 124,1,124,2,124,3,131,2,125,6,116,0,124,2,124,3, + 124,6,124,4,100,1,141,4,83,0,41,2,78,114,201,0, + 0,0,41,1,114,213,0,0,0,41,7,114,142,0,0,0, + 114,211,0,0,0,114,163,0,0,0,114,65,0,0,0,90, + 4,115,109,115,108,114,225,0,0,0,114,164,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,83, + 1,0,0,229,5,0,0,115,8,0,0,0,0,1,10,1, + 8,1,2,255,122,20,70,105,108,101,70,105,110,100,101,114, + 46,95,103,101,116,95,115,112,101,99,78,99,3,0,0,0, + 0,0,0,0,0,0,0,0,14,0,0,0,9,0,0,0, + 67,0,0,0,115,126,1,0,0,100,1,125,3,124,1,160, + 0,100,2,161,1,100,3,25,0,125,4,122,24,116,1,124, + 0,106,2,112,34,116,3,160,4,161,0,131,1,106,5,125, + 5,87,0,110,22,4,0,116,6,121,64,1,0,1,0,1, + 0,100,4,125,5,89,0,110,2,48,0,124,5,124,0,106, + 7,107,3,114,90,124,0,160,8,161,0,1,0,124,5,124, + 0,95,7,116,9,131,0,114,112,124,0,106,10,125,6,124, + 4,160,11,161,0,125,7,110,10,124,0,106,12,125,6,124, + 4,125,7,124,7,124,6,118,0,114,216,116,13,124,0,106, + 2,124,4,131,2,125,8,124,0,106,14,68,0,93,58,92, + 2,125,9,125,10,100,5,124,9,23,0,125,11,116,13,124, + 8,124,11,131,2,125,12,116,15,124,12,131,1,114,148,124, + 0,160,16,124,10,124,1,124,12,124,8,103,1,124,2,161, + 5,2,0,1,0,83,0,113,148,116,17,124,8,131,1,125, + 3,124,0,106,14,68,0,93,112,92,2,125,9,125,10,122, + 20,116,13,124,0,106,2,124,4,124,9,23,0,131,2,125, + 12,87,0,110,24,4,0,116,18,144,1,121,18,1,0,1, + 0,1,0,89,0,1,0,100,6,83,0,48,0,116,19,106, + 20,100,7,124,12,100,3,100,8,141,3,1,0,124,7,124, + 9,23,0,124,6,118,0,114,222,116,15,124,12,131,1,114, + 222,124,0,160,16,124,10,124,1,124,12,100,6,124,2,161, + 5,2,0,1,0,83,0,113,222,124,3,144,1,114,122,116, + 19,160,20,100,9,124,8,161,2,1,0,116,19,160,21,124, + 1,100,6,161,2,125,13,124,8,103,1,124,13,95,22,124, + 13,83,0,100,6,83,0,41,10,122,111,84,114,121,32,116, + 111,32,102,105,110,100,32,97,32,115,112,101,99,32,102,111, + 114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,82,101,116,117,114,110,115,32,116,104,101,32,109,97,116, + 99,104,105,110,103,32,115,112,101,99,44,32,111,114,32,78, + 111,110,101,32,105,102,32,110,111,116,32,102,111,117,110,100, + 46,10,32,32,32,32,32,32,32,32,70,114,96,0,0,0, + 114,45,0,0,0,114,129,0,0,0,114,232,0,0,0,78, + 122,9,116,114,121,105,110,103,32,123,125,41,1,90,9,118, + 101,114,98,111,115,105,116,121,122,25,112,111,115,115,105,98, + 108,101,32,110,97,109,101,115,112,97,99,101,32,102,111,114, + 32,123,125,41,23,114,103,0,0,0,114,75,0,0,0,114, + 65,0,0,0,114,24,0,0,0,114,81,0,0,0,114,33, + 1,0,0,114,76,0,0,0,114,89,1,0,0,218,11,95, + 102,105,108,108,95,99,97,99,104,101,114,27,0,0,0,114, + 92,1,0,0,114,130,0,0,0,114,91,1,0,0,114,67, + 0,0,0,114,88,1,0,0,114,80,0,0,0,114,83,1, + 0,0,114,82,0,0,0,114,110,0,0,0,114,158,0,0, + 0,114,173,0,0,0,114,207,0,0,0,114,202,0,0,0, + 41,14,114,142,0,0,0,114,163,0,0,0,114,225,0,0, + 0,90,12,105,115,95,110,97,109,101,115,112,97,99,101,90, + 11,116,97,105,108,95,109,111,100,117,108,101,114,193,0,0, + 0,90,5,99,97,99,104,101,90,12,99,97,99,104,101,95, + 109,111,100,117,108,101,90,9,98,97,115,101,95,112,97,116, + 104,114,41,1,0,0,114,211,0,0,0,90,13,105,110,105, + 116,95,102,105,108,101,110,97,109,101,90,9,102,117,108,108, + 95,112,97,116,104,114,210,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,226,0,0,0,234,5, + 0,0,115,78,0,0,0,0,5,4,1,14,1,2,1,24, + 1,12,1,10,1,10,1,8,1,6,2,6,1,6,1,10, + 2,6,1,4,2,8,1,12,1,14,1,8,1,10,1,8, + 1,26,4,8,2,14,1,2,1,20,1,14,1,10,1,16, + 1,12,1,8,1,10,1,4,255,10,2,6,1,12,1,12, + 1,8,1,4,1,122,20,70,105,108,101,70,105,110,100,101, + 114,46,102,105,110,100,95,115,112,101,99,99,1,0,0,0, + 0,0,0,0,0,0,0,0,9,0,0,0,10,0,0,0, + 67,0,0,0,115,188,0,0,0,124,0,106,0,125,1,122, + 22,116,1,160,2,124,1,112,22,116,1,160,3,161,0,161, + 1,125,2,87,0,110,28,4,0,116,4,116,5,116,6,102, + 3,121,56,1,0,1,0,1,0,103,0,125,2,89,0,110, + 2,48,0,116,7,106,8,160,9,100,1,161,1,115,82,116, + 10,124,2,131,1,124,0,95,11,110,74,116,10,131,0,125, + 3,124,2,68,0,93,56,125,4,124,4,160,12,100,2,161, + 1,92,3,125,5,125,6,125,7,124,6,114,134,100,3,160, + 13,124,5,124,7,160,14,161,0,161,2,125,8,110,4,124, + 5,125,8,124,3,160,15,124,8,161,1,1,0,113,92,124, + 3,124,0,95,11,116,7,106,8,160,9,116,16,161,1,114, + 184,100,4,100,5,132,0,124,2,68,0,131,1,124,0,95, + 17,100,6,83,0,41,7,122,68,70,105,108,108,32,116,104, + 101,32,99,97,99,104,101,32,111,102,32,112,111,116,101,110, + 116,105,97,108,32,109,111,100,117,108,101,115,32,97,110,100, + 32,112,97,99,107,97,103,101,115,32,102,111,114,32,116,104, + 105,115,32,100,105,114,101,99,116,111,114,121,46,114,20,0, + 0,0,114,96,0,0,0,114,87,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, + 0,83,0,0,0,115,20,0,0,0,104,0,124,0,93,12, + 125,1,124,1,160,0,161,0,146,2,113,4,83,0,114,10, + 0,0,0,41,1,114,130,0,0,0,41,2,114,8,0,0, + 0,90,2,102,110,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,19,0,0,0,58,6,0,0,114,13,0, + 0,0,122,41,70,105,108,101,70,105,110,100,101,114,46,95, + 102,105,108,108,95,99,97,99,104,101,46,60,108,111,99,97, + 108,115,62,46,60,115,101,116,99,111,109,112,62,78,41,18, + 114,65,0,0,0,114,24,0,0,0,114,30,1,0,0,114, + 81,0,0,0,114,26,1,0,0,218,15,80,101,114,109,105, + 115,115,105,111,110,69,114,114,111,114,218,18,78,111,116,65, + 68,105,114,101,99,116,111,114,121,69,114,114,111,114,114,21, + 0,0,0,114,28,0,0,0,114,29,0,0,0,114,90,1, + 0,0,114,91,1,0,0,114,125,0,0,0,114,88,0,0, + 0,114,130,0,0,0,218,3,97,100,100,114,30,0,0,0, + 114,92,1,0,0,41,9,114,142,0,0,0,114,65,0,0, + 0,114,31,1,0,0,90,21,108,111,119,101,114,95,115,117, + 102,102,105,120,95,99,111,110,116,101,110,116,115,114,66,1, + 0,0,114,140,0,0,0,114,54,1,0,0,114,41,1,0, + 0,90,8,110,101,119,95,110,97,109,101,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,94,1,0,0,29, + 6,0,0,115,34,0,0,0,0,2,6,1,2,1,22,1, + 18,3,10,3,12,1,12,7,6,1,8,1,16,1,4,1, + 18,2,4,1,12,1,6,1,12,1,122,22,70,105,108,101, + 70,105,110,100,101,114,46,95,102,105,108,108,95,99,97,99, + 104,101,99,1,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,3,0,0,0,7,0,0,0,115,18,0,0,0, + 135,0,135,1,102,2,100,1,100,2,132,8,125,2,124,2, + 83,0,41,3,97,20,1,0,0,65,32,99,108,97,115,115, + 32,109,101,116,104,111,100,32,119,104,105,99,104,32,114,101, + 116,117,114,110,115,32,97,32,99,108,111,115,117,114,101,32, + 116,111,32,117,115,101,32,111,110,32,115,121,115,46,112,97, + 116,104,95,104,111,111,107,10,32,32,32,32,32,32,32,32, + 119,104,105,99,104,32,119,105,108,108,32,114,101,116,117,114, + 110,32,97,110,32,105,110,115,116,97,110,99,101,32,117,115, + 105,110,103,32,116,104,101,32,115,112,101,99,105,102,105,101, + 100,32,108,111,97,100,101,114,115,32,97,110,100,32,116,104, + 101,32,112,97,116,104,10,32,32,32,32,32,32,32,32,99, + 97,108,108,101,100,32,111,110,32,116,104,101,32,99,108,111, + 115,117,114,101,46,10,10,32,32,32,32,32,32,32,32,73, + 102,32,116,104,101,32,112,97,116,104,32,99,97,108,108,101, + 100,32,111,110,32,116,104,101,32,99,108,111,115,117,114,101, + 32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116, + 111,114,121,44,32,73,109,112,111,114,116,69,114,114,111,114, + 32,105,115,10,32,32,32,32,32,32,32,32,114,97,105,115, + 101,100,46,10,10,32,32,32,32,32,32,32,32,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, + 0,0,19,0,0,0,115,36,0,0,0,116,0,124,0,131, + 1,115,20,116,1,100,1,124,0,100,2,141,2,130,1,136, + 0,124,0,103,1,136,1,162,1,82,0,142,0,83,0,41, + 3,122,45,80,97,116,104,32,104,111,111,107,32,102,111,114, + 32,105,109,112,111,114,116,108,105,98,46,109,97,99,104,105, + 110,101,114,121,46,70,105,108,101,70,105,110,100,101,114,46, + 122,30,111,110,108,121,32,100,105,114,101,99,116,111,114,105, + 101,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100, + 114,71,0,0,0,41,2,114,82,0,0,0,114,141,0,0, + 0,114,71,0,0,0,169,2,114,216,0,0,0,114,93,1, + 0,0,114,10,0,0,0,114,11,0,0,0,218,24,112,97, + 116,104,95,104,111,111,107,95,102,111,114,95,70,105,108,101, + 70,105,110,100,101,114,70,6,0,0,115,6,0,0,0,0, + 2,8,1,12,1,122,54,70,105,108,101,70,105,110,100,101, + 114,46,112,97,116,104,95,104,111,111,107,46,60,108,111,99, + 97,108,115,62,46,112,97,116,104,95,104,111,111,107,95,102, + 111,114,95,70,105,108,101,70,105,110,100,101,114,114,10,0, + 0,0,41,3,114,216,0,0,0,114,93,1,0,0,114,99, + 1,0,0,114,10,0,0,0,114,98,1,0,0,114,11,0, + 0,0,218,9,112,97,116,104,95,104,111,111,107,60,6,0, + 0,115,4,0,0,0,0,10,14,6,122,20,70,105,108,101, + 70,105,110,100,101,114,46,112,97,116,104,95,104,111,111,107, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,3,0,0,0,67,0,0,0,115,12,0,0,0,100,1, + 160,0,124,0,106,1,161,1,83,0,41,2,78,122,16,70, + 105,108,101,70,105,110,100,101,114,40,123,33,114,125,41,41, + 2,114,88,0,0,0,114,65,0,0,0,114,13,1,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 64,1,0,0,78,6,0,0,115,2,0,0,0,0,1,122, + 19,70,105,108,101,70,105,110,100,101,114,46,95,95,114,101, + 112,114,95,95,41,1,78,41,15,114,149,0,0,0,114,148, + 0,0,0,114,150,0,0,0,114,151,0,0,0,114,232,0, + 0,0,114,71,1,0,0,114,167,0,0,0,114,229,0,0, + 0,114,161,0,0,0,114,83,1,0,0,114,226,0,0,0, + 114,94,1,0,0,114,230,0,0,0,114,100,1,0,0,114, + 64,1,0,0,114,10,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,86,1,0,0,186,5,0, + 0,115,22,0,0,0,8,2,4,7,8,16,8,4,4,2, + 8,12,8,5,10,51,8,31,2,1,10,17,114,86,1,0, + 0,99,4,0,0,0,0,0,0,0,0,0,0,0,6,0, + 0,0,8,0,0,0,67,0,0,0,115,144,0,0,0,124, + 0,160,0,100,1,161,1,125,4,124,0,160,0,100,2,161, + 1,125,5,124,4,115,66,124,5,114,36,124,5,106,1,125, + 4,110,30,124,2,124,3,107,2,114,56,116,2,124,1,124, + 2,131,2,125,4,110,10,116,3,124,1,124,2,131,2,125, + 4,124,5,115,84,116,4,124,1,124,2,124,4,100,3,141, + 3,125,5,122,36,124,5,124,0,100,2,60,0,124,4,124, + 0,100,1,60,0,124,2,124,0,100,4,60,0,124,3,124, + 0,100,5,60,0,87,0,110,18,4,0,116,5,121,138,1, + 0,1,0,1,0,89,0,110,2,48,0,100,0,83,0,41, + 6,78,218,10,95,95,108,111,97,100,101,114,95,95,218,8, + 95,95,115,112,101,99,95,95,114,87,1,0,0,90,8,95, + 95,102,105,108,101,95,95,90,10,95,95,99,97,99,104,101, + 100,95,95,41,6,218,3,103,101,116,114,164,0,0,0,114, + 39,1,0,0,114,32,1,0,0,114,213,0,0,0,218,9, + 69,120,99,101,112,116,105,111,110,41,6,90,2,110,115,114, + 140,0,0,0,90,8,112,97,116,104,110,97,109,101,90,9, + 99,112,97,116,104,110,97,109,101,114,164,0,0,0,114,210, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,14,95,102,105,120,95,117,112,95,109,111,100,117, + 108,101,84,6,0,0,115,34,0,0,0,0,2,10,1,10, + 1,4,1,4,1,8,1,8,1,12,2,10,1,4,1,14, + 1,2,1,8,1,8,1,8,1,12,1,12,2,114,105,1, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, + 116,0,116,1,160,2,161,0,102,2,125,0,116,3,116,4, + 102,2,125,1,116,5,116,6,102,2,125,2,124,0,124,1, + 124,2,103,3,83,0,41,1,122,95,82,101,116,117,114,110, + 115,32,97,32,108,105,115,116,32,111,102,32,102,105,108,101, + 45,98,97,115,101,100,32,109,111,100,117,108,101,32,108,111, + 97,100,101,114,115,46,10,10,32,32,32,32,69,97,99,104, + 32,105,116,101,109,32,105,115,32,97,32,116,117,112,108,101, + 32,40,108,111,97,100,101,114,44,32,115,117,102,102,105,120, + 101,115,41,46,10,32,32,32,32,41,7,114,19,1,0,0, + 114,187,0,0,0,218,18,101,120,116,101,110,115,105,111,110, + 95,115,117,102,102,105,120,101,115,114,32,1,0,0,114,126, + 0,0,0,114,39,1,0,0,114,112,0,0,0,41,3,90, + 10,101,120,116,101,110,115,105,111,110,115,90,6,115,111,117, + 114,99,101,90,8,98,121,116,101,99,111,100,101,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,208,0,0, + 0,107,6,0,0,115,8,0,0,0,0,5,12,1,8,1, + 8,1,114,208,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,10,0,0,0,9,0,0,0,67,0,0,0, + 115,132,1,0,0,124,0,97,0,116,0,106,1,97,1,116, + 0,106,2,97,2,116,1,106,3,116,4,25,0,125,1,100, + 1,100,2,103,1,102,2,100,3,100,4,100,2,103,2,102, + 2,102,2,125,2,124,2,68,0,93,108,92,2,125,3,125, + 4,116,5,100,5,100,6,132,0,124,4,68,0,131,1,131, + 1,115,82,74,0,130,1,124,4,100,7,25,0,125,5,124, + 3,116,1,106,3,118,0,114,116,116,1,106,3,124,3,25, + 0,125,6,1,0,113,170,113,52,122,20,116,0,160,6,124, + 3,161,1,125,6,87,0,1,0,113,170,87,0,113,52,4, + 0,116,7,121,158,1,0,1,0,1,0,89,0,113,52,89, + 0,113,52,48,0,113,52,116,7,100,8,131,1,130,1,116, + 8,124,1,100,9,124,6,131,3,1,0,116,8,124,1,100, + 10,124,5,131,3,1,0,116,8,124,1,100,11,100,12,160, + 9,124,4,161,1,131,3,1,0,116,8,124,1,100,13,100, + 14,100,15,132,0,124,4,68,0,131,1,131,3,1,0,103, + 0,100,16,162,1,125,7,124,3,100,3,107,2,144,1,114, + 6,124,7,160,10,100,17,161,1,1,0,124,7,68,0,93, + 52,125,8,124,8,116,1,106,3,118,1,144,1,114,38,116, + 0,160,6,124,8,161,1,125,9,110,10,116,1,106,3,124, + 8,25,0,125,9,116,8,124,1,124,8,124,9,131,3,1, + 0,144,1,113,10,116,8,124,1,100,18,116,11,131,0,131, + 3,1,0,116,12,160,13,116,2,160,14,161,0,161,1,1, + 0,124,3,100,3,107,2,144,1,114,128,116,15,160,10,100, + 19,161,1,1,0,100,20,116,12,118,0,144,1,114,128,100, + 21,116,16,95,17,100,22,83,0,41,23,122,205,83,101,116, + 117,112,32,116,104,101,32,112,97,116,104,45,98,97,115,101, + 100,32,105,109,112,111,114,116,101,114,115,32,102,111,114,32, + 105,109,112,111,114,116,108,105,98,32,98,121,32,105,109,112, + 111,114,116,105,110,103,32,110,101,101,100,101,100,10,32,32, + 32,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,115,32,97,110,100,32,105,110,106,101,99,116,105,110,103, + 32,116,104,101,109,32,105,110,116,111,32,116,104,101,32,103, + 108,111,98,97,108,32,110,97,109,101,115,112,97,99,101,46, + 10,10,32,32,32,32,79,116,104,101,114,32,99,111,109,112, + 111,110,101,110,116,115,32,97,114,101,32,101,120,116,114,97, + 99,116,101,100,32,102,114,111,109,32,116,104,101,32,99,111, + 114,101,32,98,111,111,116,115,116,114,97,112,32,109,111,100, + 117,108,101,46,10,10,32,32,32,32,218,5,112,111,115,105, + 120,114,2,0,0,0,218,2,110,116,114,1,0,0,0,99, 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,83,0,0,0,115,22,0,0,0,104,0,124, - 0,93,14,125,1,100,0,124,1,155,0,157,2,146,2,113, - 4,83,0,114,15,0,0,0,114,10,0,0,0,114,17,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,19,0,0,0,144,6,0,0,114,13,0,0,0,122, - 25,95,115,101,116,117,112,46,60,108,111,99,97,108,115,62, - 46,60,115,101,116,99,111,109,112,62,41,3,114,90,0,0, - 0,114,98,0,0,0,114,184,0,0,0,114,215,0,0,0, - 114,27,0,0,0,122,4,46,112,121,119,122,6,95,100,46, - 112,121,100,84,78,41,18,114,158,0,0,0,114,21,0,0, - 0,114,187,0,0,0,114,54,1,0,0,114,149,0,0,0, - 218,3,97,108,108,90,18,95,98,117,105,108,116,105,110,95, - 102,114,111,109,95,110,97,109,101,114,141,0,0,0,114,153, - 0,0,0,114,62,0,0,0,114,61,0,0,0,114,32,0, - 0,0,114,44,1,0,0,114,191,0,0,0,114,104,1,0, - 0,114,126,0,0,0,114,214,0,0,0,114,218,0,0,0, - 41,10,218,17,95,98,111,111,116,115,116,114,97,112,95,109, - 111,100,117,108,101,90,11,115,101,108,102,95,109,111,100,117, - 108,101,90,10,111,115,95,100,101,116,97,105,108,115,90,10, - 98,117,105,108,116,105,110,95,111,115,114,50,0,0,0,114, - 59,0,0,0,90,9,111,115,95,109,111,100,117,108,101,90, - 13,98,117,105,108,116,105,110,95,110,97,109,101,115,90,12, - 98,117,105,108,116,105,110,95,110,97,109,101,90,14,98,117, - 105,108,116,105,110,95,109,111,100,117,108,101,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,6,95,115,101, - 116,117,112,109,6,0,0,115,70,0,0,0,0,8,4,1, - 6,1,6,2,10,3,22,1,12,2,22,1,8,1,10,1, - 10,1,6,2,2,1,10,1,10,1,12,1,12,2,8,2, - 12,1,12,1,18,1,22,3,8,1,10,1,10,1,8,1, - 12,1,12,2,10,1,16,3,14,1,14,1,10,1,10,1, - 10,1,114,110,1,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,4,0,0,0,67,0,0,0, - 115,50,0,0,0,116,0,124,0,131,1,1,0,116,1,131, - 0,125,1,116,2,106,3,160,4,116,5,106,6,124,1,142, - 0,103,1,161,1,1,0,116,2,106,7,160,8,116,9,161, - 1,1,0,100,1,83,0,41,2,122,41,73,110,115,116,97, - 108,108,32,116,104,101,32,112,97,116,104,45,98,97,115,101, - 100,32,105,109,112,111,114,116,32,99,111,109,112,111,110,101, - 110,116,115,46,78,41,10,114,110,1,0,0,114,208,0,0, - 0,114,21,0,0,0,114,74,1,0,0,114,191,0,0,0, - 114,84,1,0,0,114,98,1,0,0,218,9,109,101,116,97, - 95,112,97,116,104,114,61,0,0,0,114,68,1,0,0,41, - 2,114,109,1,0,0,90,17,115,117,112,112,111,114,116,101, - 100,95,108,111,97,100,101,114,115,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,8,95,105,110,115,116,97, - 108,108,166,6,0,0,115,8,0,0,0,0,2,8,1,6, - 1,20,1,114,112,1,0,0,41,1,114,86,0,0,0,41, - 1,78,41,3,78,78,78,41,2,114,0,0,0,0,114,0, - 0,0,0,41,1,84,41,1,78,41,1,78,41,81,114,151, - 0,0,0,114,187,0,0,0,114,90,0,0,0,114,21,0, - 0,0,114,98,0,0,0,114,184,0,0,0,114,28,0,0, - 0,90,11,95,77,83,95,87,73,78,68,79,87,83,114,106, - 1,0,0,114,24,0,0,0,114,215,0,0,0,114,105,1, - 0,0,114,50,0,0,0,114,108,1,0,0,114,59,0,0, - 0,114,135,0,0,0,114,57,0,0,0,114,62,0,0,0, - 114,107,1,0,0,114,31,0,0,0,90,37,95,67,65,83, - 69,95,73,78,83,69,78,83,73,84,73,86,69,95,80,76, - 65,84,70,79,82,77,83,95,66,89,84,69,83,95,75,69, - 89,114,30,0,0,0,114,32,0,0,0,114,39,0,0,0, - 114,44,0,0,0,114,46,0,0,0,114,67,0,0,0,114, - 74,0,0,0,114,75,0,0,0,114,79,0,0,0,114,80, - 0,0,0,114,82,0,0,0,114,85,0,0,0,114,94,0, - 0,0,218,4,116,121,112,101,218,8,95,95,99,111,100,101, - 95,95,114,186,0,0,0,114,37,0,0,0,114,172,0,0, - 0,114,36,0,0,0,114,41,0,0,0,114,3,1,0,0, - 114,115,0,0,0,114,111,0,0,0,114,126,0,0,0,114, - 112,0,0,0,90,23,68,69,66,85,71,95,66,89,84,69, - 67,79,68,69,95,83,85,70,70,73,88,69,83,90,27,79, - 80,84,73,77,73,90,69,68,95,66,89,84,69,67,79,68, - 69,95,83,85,70,70,73,88,69,83,114,120,0,0,0,114, - 127,0,0,0,114,134,0,0,0,114,136,0,0,0,114,138, - 0,0,0,114,160,0,0,0,114,167,0,0,0,114,176,0, - 0,0,114,180,0,0,0,114,182,0,0,0,114,189,0,0, - 0,114,194,0,0,0,114,195,0,0,0,114,200,0,0,0, - 218,6,111,98,106,101,99,116,114,209,0,0,0,114,213,0, - 0,0,114,214,0,0,0,114,231,0,0,0,114,244,0,0, - 0,114,6,1,0,0,114,32,1,0,0,114,39,1,0,0, - 114,44,1,0,0,114,19,1,0,0,114,45,1,0,0,114, - 66,1,0,0,114,68,1,0,0,114,84,1,0,0,114,103, - 1,0,0,114,208,0,0,0,114,110,1,0,0,114,112,1, - 0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,8,60,109,111,100,117,108,101,62, - 1,0,0,0,115,170,0,0,0,4,22,8,1,8,1,8, - 1,8,1,8,3,10,1,4,1,8,1,10,2,8,3,4, - 1,10,2,6,2,22,1,8,1,8,1,10,1,14,4,4, - 1,4,1,2,1,2,255,4,4,8,17,8,5,8,5,8, - 6,4,1,10,30,8,6,8,8,8,10,8,9,8,5,8, - 7,6,1,10,8,8,5,10,22,10,127,0,20,16,1,12, - 2,4,1,4,2,6,2,6,2,8,2,16,71,8,40,8, - 19,8,12,8,12,8,28,8,17,8,33,8,28,8,24,10, - 13,10,10,10,11,8,14,6,3,4,1,2,255,12,68,14, - 64,14,29,16,127,0,17,14,72,18,45,18,26,4,3,18, - 58,14,63,14,42,14,127,0,20,14,127,0,27,10,23,8, - 11,8,57, + 3,0,0,0,115,0,0,0,115,26,0,0,0,124,0,93, + 18,125,1,116,0,124,1,131,1,100,0,107,2,86,0,1, + 0,113,2,100,1,83,0,114,3,0,0,0,114,5,0,0, + 0,114,7,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,12,0,0,0,136,6,0,0,114,13, + 0,0,0,122,25,95,115,101,116,117,112,46,60,108,111,99, + 97,108,115,62,46,60,103,101,110,101,120,112,114,62,114,0, + 0,0,0,122,30,105,109,112,111,114,116,108,105,98,32,114, + 101,113,117,105,114,101,115,32,112,111,115,105,120,32,111,114, + 32,110,116,114,24,0,0,0,114,59,0,0,0,114,50,0, + 0,0,114,14,0,0,0,218,20,95,112,97,116,104,115,101, + 112,115,95,119,105,116,104,95,99,111,108,111,110,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, + 0,0,83,0,0,0,115,22,0,0,0,104,0,124,0,93, + 14,125,1,100,0,124,1,155,0,157,2,146,2,113,4,83, + 0,114,15,0,0,0,114,10,0,0,0,114,17,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 19,0,0,0,153,6,0,0,114,13,0,0,0,122,25,95, + 115,101,116,117,112,46,60,108,111,99,97,108,115,62,46,60, + 115,101,116,99,111,109,112,62,41,3,114,90,0,0,0,114, + 98,0,0,0,114,184,0,0,0,114,215,0,0,0,114,27, + 0,0,0,122,4,46,112,121,119,122,6,95,100,46,112,121, + 100,84,78,41,18,114,158,0,0,0,114,21,0,0,0,114, + 187,0,0,0,114,56,1,0,0,114,149,0,0,0,218,3, + 97,108,108,90,18,95,98,117,105,108,116,105,110,95,102,114, + 111,109,95,110,97,109,101,114,141,0,0,0,114,153,0,0, + 0,114,62,0,0,0,114,61,0,0,0,114,32,0,0,0, + 114,44,1,0,0,114,191,0,0,0,114,106,1,0,0,114, + 126,0,0,0,114,214,0,0,0,114,218,0,0,0,41,10, + 218,17,95,98,111,111,116,115,116,114,97,112,95,109,111,100, + 117,108,101,90,11,115,101,108,102,95,109,111,100,117,108,101, + 90,10,111,115,95,100,101,116,97,105,108,115,90,10,98,117, + 105,108,116,105,110,95,111,115,114,50,0,0,0,114,59,0, + 0,0,90,9,111,115,95,109,111,100,117,108,101,90,13,98, + 117,105,108,116,105,110,95,110,97,109,101,115,90,12,98,117, + 105,108,116,105,110,95,110,97,109,101,90,14,98,117,105,108, + 116,105,110,95,109,111,100,117,108,101,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,6,95,115,101,116,117, + 112,118,6,0,0,115,70,0,0,0,0,8,4,1,6,1, + 6,2,10,3,22,1,12,2,22,1,8,1,10,1,10,1, + 6,2,2,1,10,1,10,1,12,1,12,2,8,2,12,1, + 12,1,18,1,22,3,8,1,10,1,10,1,8,1,12,1, + 12,2,10,1,16,3,14,1,14,1,10,1,10,1,10,1, + 114,112,1,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,4,0,0,0,67,0,0,0,115,50, + 0,0,0,116,0,124,0,131,1,1,0,116,1,131,0,125, + 1,116,2,106,3,160,4,116,5,106,6,124,1,142,0,103, + 1,161,1,1,0,116,2,106,7,160,8,116,9,161,1,1, + 0,100,1,83,0,41,2,122,41,73,110,115,116,97,108,108, + 32,116,104,101,32,112,97,116,104,45,98,97,115,101,100,32, + 105,109,112,111,114,116,32,99,111,109,112,111,110,101,110,116, + 115,46,78,41,10,114,112,1,0,0,114,208,0,0,0,114, + 21,0,0,0,114,76,1,0,0,114,191,0,0,0,114,86, + 1,0,0,114,100,1,0,0,218,9,109,101,116,97,95,112, + 97,116,104,114,61,0,0,0,114,70,1,0,0,41,2,114, + 111,1,0,0,90,17,115,117,112,112,111,114,116,101,100,95, + 108,111,97,100,101,114,115,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,8,95,105,110,115,116,97,108,108, + 175,6,0,0,115,8,0,0,0,0,2,8,1,6,1,20, + 1,114,114,1,0,0,41,1,114,86,0,0,0,41,1,78, + 41,3,78,78,78,41,2,114,0,0,0,0,114,0,0,0, + 0,41,1,84,41,1,78,41,1,78,41,81,114,151,0,0, + 0,114,187,0,0,0,114,90,0,0,0,114,21,0,0,0, + 114,98,0,0,0,114,184,0,0,0,114,28,0,0,0,90, + 11,95,77,83,95,87,73,78,68,79,87,83,114,108,1,0, + 0,114,24,0,0,0,114,215,0,0,0,114,107,1,0,0, + 114,50,0,0,0,114,110,1,0,0,114,59,0,0,0,114, + 135,0,0,0,114,57,0,0,0,114,62,0,0,0,114,109, + 1,0,0,114,31,0,0,0,90,37,95,67,65,83,69,95, + 73,78,83,69,78,83,73,84,73,86,69,95,80,76,65,84, + 70,79,82,77,83,95,66,89,84,69,83,95,75,69,89,114, + 30,0,0,0,114,32,0,0,0,114,39,0,0,0,114,44, + 0,0,0,114,46,0,0,0,114,67,0,0,0,114,74,0, + 0,0,114,75,0,0,0,114,79,0,0,0,114,80,0,0, + 0,114,82,0,0,0,114,85,0,0,0,114,94,0,0,0, + 218,4,116,121,112,101,218,8,95,95,99,111,100,101,95,95, + 114,186,0,0,0,114,37,0,0,0,114,172,0,0,0,114, + 36,0,0,0,114,41,0,0,0,114,3,1,0,0,114,115, + 0,0,0,114,111,0,0,0,114,126,0,0,0,114,112,0, + 0,0,90,23,68,69,66,85,71,95,66,89,84,69,67,79, + 68,69,95,83,85,70,70,73,88,69,83,90,27,79,80,84, + 73,77,73,90,69,68,95,66,89,84,69,67,79,68,69,95, + 83,85,70,70,73,88,69,83,114,120,0,0,0,114,127,0, + 0,0,114,134,0,0,0,114,136,0,0,0,114,138,0,0, + 0,114,160,0,0,0,114,167,0,0,0,114,176,0,0,0, + 114,180,0,0,0,114,182,0,0,0,114,189,0,0,0,114, + 194,0,0,0,114,195,0,0,0,114,200,0,0,0,218,6, + 111,98,106,101,99,116,114,209,0,0,0,114,213,0,0,0, + 114,214,0,0,0,114,231,0,0,0,114,244,0,0,0,114, + 6,1,0,0,114,32,1,0,0,114,39,1,0,0,114,44, + 1,0,0,114,19,1,0,0,114,45,1,0,0,114,68,1, + 0,0,114,70,1,0,0,114,86,1,0,0,114,105,1,0, + 0,114,208,0,0,0,114,112,1,0,0,114,114,1,0,0, + 114,10,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,8,60,109,111,100,117,108,101,62,1,0, + 0,0,115,170,0,0,0,4,22,8,1,8,1,8,1,8, + 1,8,3,10,1,4,1,8,1,10,2,8,3,4,1,10, + 2,6,2,22,1,8,1,8,1,10,1,14,4,4,1,4, + 1,2,1,2,255,4,4,8,17,8,5,8,5,8,6,4, + 1,10,30,8,6,8,8,8,10,8,9,8,5,8,7,6, + 1,10,8,8,5,10,22,10,127,0,20,16,1,12,2,4, + 1,4,2,6,2,6,2,8,2,16,71,8,40,8,19,8, + 12,8,12,8,28,8,17,8,33,8,28,8,24,10,13,10, + 10,10,11,8,14,6,3,4,1,2,255,12,68,14,64,14, + 29,16,127,0,17,14,72,18,45,18,26,4,3,18,58,14, + 69,14,42,14,127,0,23,14,127,0,27,10,23,8,11,8, + 57, }; From webhook-mailer at python.org Wed Feb 2 10:03:19 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 02 Feb 2022 15:03:19 -0000 Subject: [Python-checkins] bpo-45459: Add Py_buffer to limited API (GH-29991) Message-ID: https://github.com/python/cpython/commit/f66c857572a308822c70fd25e0197b6e0dec6e34 commit: f66c857572a308822c70fd25e0197b6e0dec6e34 branch: main author: Christian Heimes committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-02T07:03:10-08:00 summary: bpo-45459: Add Py_buffer to limited API (GH-29991) - [x] ``Py_buffer`` struct - [x] ``PyBuffer_*()`` API functions - [x] ``PyBUF_*`` constants - [x] ``Py_bf_getbuffer`` and ``Py_bf_releasebuffer`` type slots - [x] ``PyMemoryView_FromBuffer()`` API - [x] tests for limited API - [x] ``make regen-limited-abi`` - [x] documentation update - [ ] export ``PyPickleBuffer*()`` API ??? files: A Include/buffer.h A Misc/NEWS.d/next/C API/2021-10-18-16-54-24.bpo-45459.Y1pEZs.rst M Doc/c-api/buffer.rst M Doc/c-api/type.rst M Doc/data/stable_abi.dat M Doc/whatsnew/3.11.rst M Include/Python.h M Include/cpython/abstract.h M Include/cpython/object.h M Include/memoryobject.h M Include/typeslots.h M Lib/test/test_stable_abi_ctypes.py M Lib/test/test_xxlimited.py M Makefile.pre.in M Misc/stable_abi.txt M Modules/xxlimited.c M PC/python3dll.c diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst index 820a3a6f990ef..05e131d06b909 100644 --- a/Doc/c-api/buffer.rst +++ b/Doc/c-api/buffer.rst @@ -499,6 +499,13 @@ Buffer-related functions This function fails if *len* != *src->len*. +.. c:function:: int PyObject_CopyData(Py_buffer *dest, Py_buffer *src) + + Copy data from *src* to *dest* buffer. Can convert between C-style and + or Fortran-style buffers. + + ``0`` is returned on success, ``-1`` on error. + .. c:function:: void PyBuffer_FillContiguousStrides(int ndims, Py_ssize_t *shape, Py_ssize_t *strides, int itemsize, char order) Fill the *strides* array with byte-strides of a :term:`contiguous` (C-style if diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index f96886985e932..97a818ab2ccd0 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -272,12 +272,6 @@ The following functions and structs are used to create * :c:member:`~PyTypeObject.tp_vectorcall_offset` (see :ref:`PyMemberDef `) - The following fields cannot be set using :c:type:`PyType_Spec` and - :c:type:`PyType_Slot` under the limited API: - - * :c:member:`~PyBufferProcs.bf_getbuffer` - * :c:member:`~PyBufferProcs.bf_releasebuffer` - Setting :c:data:`Py_tp_bases` or :c:data:`Py_tp_base` may be problematic on some platforms. To avoid issues, use the *bases* argument of @@ -287,6 +281,11 @@ The following functions and structs are used to create Slots in :c:type:`PyBufferProcs` in may be set in the unlimited API. + .. versionchanged:: 3.11 + :c:member:`~PyBufferProcs.bf_getbuffer` and + :c:member:`~PyBufferProcs.bf_releasebuffer` are now available + under limited API. + .. c:member:: void *PyType_Slot.pfunc The desired value of the slot. In most cases, this is a pointer diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index 02e54e5d7f14a..18bbf03187b30 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -10,6 +10,14 @@ function,PyArg_ValidateKeywordArguments,3.2, var,PyBaseObject_Type,3.2, function,PyBool_FromLong,3.2, var,PyBool_Type,3.2, +function,PyBuffer_FillContiguousStrides,3.11, +function,PyBuffer_FillInfo,3.11, +function,PyBuffer_FromContiguous,3.11, +function,PyBuffer_GetPointer,3.11, +function,PyBuffer_IsContiguous,3.11, +function,PyBuffer_Release,3.11, +function,PyBuffer_SizeFromFormat,3.11, +function,PyBuffer_ToContiguous,3.11, var,PyByteArrayIter_Type,3.2, function,PyByteArray_AsString,3.2, function,PyByteArray_Concat,3.2, @@ -375,6 +383,7 @@ function,PyMem_Malloc,3.2, function,PyMem_Realloc,3.2, type,PyMemberDef,3.2, var,PyMemberDescr_Type,3.2, +function,PyMemoryView_FromBuffer,3.11, function,PyMemoryView_FromMemory,3.7, function,PyMemoryView_FromObject,3.2, function,PyMemoryView_GetContiguous,3.2, @@ -476,8 +485,10 @@ function,PyObject_CallMethodObjArgs,3.2, function,PyObject_CallNoArgs,3.10, function,PyObject_CallObject,3.2, function,PyObject_Calloc,3.7, +function,PyObject_CheckBuffer,3.11, function,PyObject_CheckReadBuffer,3.2, function,PyObject_ClearWeakRefs,3.2, +function,PyObject_CopyData,3.11, function,PyObject_DelItem,3.2, function,PyObject_DelItemString,3.2, function,PyObject_Dir,3.2, @@ -495,6 +506,7 @@ function,PyObject_GenericSetDict,3.7, function,PyObject_GetAIter,3.10, function,PyObject_GetAttr,3.2, function,PyObject_GetAttrString,3.2, +function,PyObject_GetBuffer,3.11, function,PyObject_GetItem,3.2, function,PyObject_GetIter,3.2, function,PyObject_HasAttr,3.2, @@ -832,6 +844,7 @@ var,Py_UTF8Mode,3.8, function,Py_VaBuildValue,3.2, var,Py_Version,3.11, function,Py_XNewRef,3.10, +type,Py_buffer,3.11, type,Py_intptr_t,3.2, type,Py_ssize_t,3.2, type,Py_uintptr_t,3.2, diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index e7f3dab2b51db..3458ad63c9df8 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -657,6 +657,26 @@ New Features :c:macro:`PY_VERSION_HEX`. (Contributed by Gabriele N. Tornetta in :issue:`43931`.) +* :c:type:`Py_buffer` and APIs are now part of the limited API and the stable + ABI: + + * :c:func:`PyObject_CheckBuffer` + * :c:func:`PyObject_GetBuffer` + * :c:func:`PyBuffer_GetPointer` + * :c:func:`PyBuffer_SizeFromFormat` + * :c:func:`PyBuffer_ToContiguous` + * :c:func:`PyBuffer_FromContiguous` + * :c:func:`PyBuffer_CopyData` + * :c:func:`PyBuffer_IsContiguous` + * :c:func:`PyBuffer_FillContiguousStrides` + * :c:func:`PyBuffer_FillInfo` + * :c:func:`PyBuffer_Release` + * :c:func:`PyMemoryView_FromBuffer` + * :c:member:`~PyBufferProcs.bf_getbuffer` and + :c:member:`~PyBufferProcs.bf_releasebuffer` type slots + + (Contributed by Christian Heimes in :issue:`45459`.) + Porting to Python 3.11 ---------------------- diff --git a/Include/Python.h b/Include/Python.h index 7260ae5cd0b4f..5416b04e4bfb3 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -50,6 +50,7 @@ #include "longobject.h" #include "cpython/longintrepr.h" #include "boolobject.h" +#include "buffer.h" #include "floatobject.h" #include "complexobject.h" #include "rangeobject.h" diff --git a/Include/buffer.h b/Include/buffer.h new file mode 100644 index 0000000000000..6893505e66e3e --- /dev/null +++ b/Include/buffer.h @@ -0,0 +1,142 @@ +/* Public Py_buffer API */ + +#ifndef Py_BUFFER_H +#define Py_BUFFER_H +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030b0000 + +/* === New Buffer API ============================================ + * Limited API and stable ABI since Python 3.11 + * + * Py_buffer struct layout and size is now part of the stable abi3. The + * struct layout and size must not be changed in any way, as it would + * break the ABI. + * + */ + +typedef struct { + void *buf; + PyObject *obj; /* owned reference */ + Py_ssize_t len; + Py_ssize_t itemsize; /* This is Py_ssize_t so it can be + pointed to by strides in simple case.*/ + int readonly; + int ndim; + char *format; + Py_ssize_t *shape; + Py_ssize_t *strides; + Py_ssize_t *suboffsets; + void *internal; +} Py_buffer; + +/* Return 1 if the getbuffer function is available, otherwise return 0. */ +PyAPI_FUNC(int) PyObject_CheckBuffer(PyObject *obj); + +/* This is a C-API version of the getbuffer function call. It checks + to make sure object has the required function pointer and issues the + call. + + Returns -1 and raises an error on failure and returns 0 on success. */ +PyAPI_FUNC(int) PyObject_GetBuffer(PyObject *obj, Py_buffer *view, + int flags); + +/* Get the memory area pointed to by the indices for the buffer given. + Note that view->ndim is the assumed size of indices. */ +PyAPI_FUNC(void *) PyBuffer_GetPointer(const Py_buffer *view, const Py_ssize_t *indices); + +/* Return the implied itemsize of the data-format area from a + struct-style description. */ +PyAPI_FUNC(Py_ssize_t) PyBuffer_SizeFromFormat(const char *format); + +/* Implementation in memoryobject.c */ +PyAPI_FUNC(int) PyBuffer_ToContiguous(void *buf, const Py_buffer *view, + Py_ssize_t len, char order); + +PyAPI_FUNC(int) PyBuffer_FromContiguous(const Py_buffer *view, const void *buf, + Py_ssize_t len, char order); + +/* Copy len bytes of data from the contiguous chunk of memory + pointed to by buf into the buffer exported by obj. Return + 0 on success and return -1 and raise a PyBuffer_Error on + error (i.e. the object does not have a buffer interface or + it is not working). + + If fort is 'F', then if the object is multi-dimensional, + then the data will be copied into the array in + Fortran-style (first dimension varies the fastest). If + fort is 'C', then the data will be copied into the array + in C-style (last dimension varies the fastest). If fort + is 'A', then it does not matter and the copy will be made + in whatever way is more efficient. */ +PyAPI_FUNC(int) PyObject_CopyData(PyObject *dest, PyObject *src); + +/* Copy the data from the src buffer to the buffer of destination. */ +PyAPI_FUNC(int) PyBuffer_IsContiguous(const Py_buffer *view, char fort); + +/*Fill the strides array with byte-strides of a contiguous + (Fortran-style if fort is 'F' or C-style otherwise) + array of the given shape with the given number of bytes + per element. */ +PyAPI_FUNC(void) PyBuffer_FillContiguousStrides(int ndims, + Py_ssize_t *shape, + Py_ssize_t *strides, + int itemsize, + char fort); + +/* Fills in a buffer-info structure correctly for an exporter + that can only share a contiguous chunk of memory of + "unsigned bytes" of the given length. + + Returns 0 on success and -1 (with raising an error) on error. */ +PyAPI_FUNC(int) PyBuffer_FillInfo(Py_buffer *view, PyObject *o, void *buf, + Py_ssize_t len, int readonly, + int flags); + +/* Releases a Py_buffer obtained from getbuffer ParseTuple's "s*". */ +PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view); + +/* Maximum number of dimensions */ +#define PyBUF_MAX_NDIM 64 + +/* Flags for getting buffers */ +#define PyBUF_SIMPLE 0 +#define PyBUF_WRITABLE 0x0001 + +#ifndef Py_LIMITED_API +/* we used to include an E, backwards compatible alias */ +#define PyBUF_WRITEABLE PyBUF_WRITABLE +#endif + +#define PyBUF_FORMAT 0x0004 +#define PyBUF_ND 0x0008 +#define PyBUF_STRIDES (0x0010 | PyBUF_ND) +#define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) +#define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) +#define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) +#define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) + +#define PyBUF_CONTIG (PyBUF_ND | PyBUF_WRITABLE) +#define PyBUF_CONTIG_RO (PyBUF_ND) + +#define PyBUF_STRIDED (PyBUF_STRIDES | PyBUF_WRITABLE) +#define PyBUF_STRIDED_RO (PyBUF_STRIDES) + +#define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT) +#define PyBUF_RECORDS_RO (PyBUF_STRIDES | PyBUF_FORMAT) + +#define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT) +#define PyBUF_FULL_RO (PyBUF_INDIRECT | PyBUF_FORMAT) + + +#define PyBUF_READ 0x100 +#define PyBUF_WRITE 0x200 + +#endif /* !Py_LIMITED_API || Py_LIMITED_API >= 3.11 */ + +#ifdef __cplusplus +} +#endif +#endif /* Py_BUFFER_H */ diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 2876a7bb84f52..b5a31392f2ed0 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -168,74 +168,6 @@ PyAPI_FUNC(int) _PyObject_HasLen(PyObject *o); value. If one of the calls fails, this function returns -1. */ PyAPI_FUNC(Py_ssize_t) PyObject_LengthHint(PyObject *o, Py_ssize_t); -/* === New Buffer API ============================================ */ - -/* Return 1 if the getbuffer function is available, otherwise return 0. */ -PyAPI_FUNC(int) PyObject_CheckBuffer(PyObject *obj); - -/* This is a C-API version of the getbuffer function call. It checks - to make sure object has the required function pointer and issues the - call. - - Returns -1 and raises an error on failure and returns 0 on success. */ -PyAPI_FUNC(int) PyObject_GetBuffer(PyObject *obj, Py_buffer *view, - int flags); - -/* Get the memory area pointed to by the indices for the buffer given. - Note that view->ndim is the assumed size of indices. */ -PyAPI_FUNC(void *) PyBuffer_GetPointer(const Py_buffer *view, const Py_ssize_t *indices); - -/* Return the implied itemsize of the data-format area from a - struct-style description. */ -PyAPI_FUNC(Py_ssize_t) PyBuffer_SizeFromFormat(const char *format); - -/* Implementation in memoryobject.c */ -PyAPI_FUNC(int) PyBuffer_ToContiguous(void *buf, const Py_buffer *view, - Py_ssize_t len, char order); - -PyAPI_FUNC(int) PyBuffer_FromContiguous(const Py_buffer *view, const void *buf, - Py_ssize_t len, char order); - -/* Copy len bytes of data from the contiguous chunk of memory - pointed to by buf into the buffer exported by obj. Return - 0 on success and return -1 and raise a PyBuffer_Error on - error (i.e. the object does not have a buffer interface or - it is not working). - - If fort is 'F', then if the object is multi-dimensional, - then the data will be copied into the array in - Fortran-style (first dimension varies the fastest). If - fort is 'C', then the data will be copied into the array - in C-style (last dimension varies the fastest). If fort - is 'A', then it does not matter and the copy will be made - in whatever way is more efficient. */ -PyAPI_FUNC(int) PyObject_CopyData(PyObject *dest, PyObject *src); - -/* Copy the data from the src buffer to the buffer of destination. */ -PyAPI_FUNC(int) PyBuffer_IsContiguous(const Py_buffer *view, char fort); - -/*Fill the strides array with byte-strides of a contiguous - (Fortran-style if fort is 'F' or C-style otherwise) - array of the given shape with the given number of bytes - per element. */ -PyAPI_FUNC(void) PyBuffer_FillContiguousStrides(int ndims, - Py_ssize_t *shape, - Py_ssize_t *strides, - int itemsize, - char fort); - -/* Fills in a buffer-info structure correctly for an exporter - that can only share a contiguous chunk of memory of - "unsigned bytes" of the given length. - - Returns 0 on success and -1 (with raising an error) on error. */ -PyAPI_FUNC(int) PyBuffer_FillInfo(Py_buffer *view, PyObject *o, void *buf, - Py_ssize_t len, int readonly, - int flags); - -/* Releases a Py_buffer obtained from getbuffer ParseTuple's "s*". */ -PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view); - /* === Sequence protocol ================================================ */ /* Assume tp_as_sequence and sq_item exist and that 'i' does not diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 7b9f3acbc439d..1554ac8aef1c4 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -2,6 +2,8 @@ # error "this header file must not be included directly" #endif +#include "buffer.h" // for Py_buffer, included after PyObject has been defined + PyAPI_FUNC(void) _Py_NewReference(PyObject *op); #ifdef Py_TRACE_REFS @@ -45,61 +47,12 @@ typedef struct _Py_Identifier { #define _Py_static_string(varname, value) static _Py_Identifier varname = _Py_static_string_init(value) #define _Py_IDENTIFIER(varname) _Py_static_string(PyId_##varname, #varname) -/* buffer interface */ -typedef struct bufferinfo { - void *buf; - PyObject *obj; /* owned reference */ - Py_ssize_t len; - Py_ssize_t itemsize; /* This is Py_ssize_t so it can be - pointed to by strides in simple case.*/ - int readonly; - int ndim; - char *format; - Py_ssize_t *shape; - Py_ssize_t *strides; - Py_ssize_t *suboffsets; - void *internal; -} Py_buffer; - typedef int (*getbufferproc)(PyObject *, Py_buffer *, int); typedef void (*releasebufferproc)(PyObject *, Py_buffer *); typedef PyObject *(*vectorcallfunc)(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames); -/* Maximum number of dimensions */ -#define PyBUF_MAX_NDIM 64 - -/* Flags for getting buffers */ -#define PyBUF_SIMPLE 0 -#define PyBUF_WRITABLE 0x0001 -/* we used to include an E, backwards compatible alias */ -#define PyBUF_WRITEABLE PyBUF_WRITABLE -#define PyBUF_FORMAT 0x0004 -#define PyBUF_ND 0x0008 -#define PyBUF_STRIDES (0x0010 | PyBUF_ND) -#define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) -#define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) -#define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) -#define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) - -#define PyBUF_CONTIG (PyBUF_ND | PyBUF_WRITABLE) -#define PyBUF_CONTIG_RO (PyBUF_ND) - -#define PyBUF_STRIDED (PyBUF_STRIDES | PyBUF_WRITABLE) -#define PyBUF_STRIDED_RO (PyBUF_STRIDES) - -#define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT) -#define PyBUF_RECORDS_RO (PyBUF_STRIDES | PyBUF_FORMAT) - -#define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT) -#define PyBUF_FULL_RO (PyBUF_INDIRECT | PyBUF_FORMAT) - - -#define PyBUF_READ 0x100 -#define PyBUF_WRITE 0x200 -/* End buffer interface */ - typedef struct { /* Number implementations must check *both* diff --git a/Include/memoryobject.h b/Include/memoryobject.h index 0298cc9373068..154397ce1e56d 100644 --- a/Include/memoryobject.h +++ b/Include/memoryobject.h @@ -25,7 +25,7 @@ PyAPI_FUNC(PyObject *) PyMemoryView_FromObject(PyObject *base); PyAPI_FUNC(PyObject *) PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags); #endif -#ifndef Py_LIMITED_API +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030b0000 PyAPI_FUNC(PyObject *) PyMemoryView_FromBuffer(const Py_buffer *info); #endif PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base, diff --git a/Include/typeslots.h b/Include/typeslots.h index 5800d0158bc92..506b05580de14 100644 --- a/Include/typeslots.h +++ b/Include/typeslots.h @@ -1,12 +1,6 @@ /* Do not renumber the file; these numbers are part of the stable ABI. */ -#if defined(Py_LIMITED_API) -/* Disabled, see #10181 */ -#undef Py_bf_getbuffer -#undef Py_bf_releasebuffer -#else #define Py_bf_getbuffer 1 #define Py_bf_releasebuffer 2 -#endif #define Py_mp_ass_subscript 3 #define Py_mp_length 4 #define Py_mp_subscript 5 diff --git a/Lib/test/test_stable_abi_ctypes.py b/Lib/test/test_stable_abi_ctypes.py index 9fd6b14b0232a..a49235b81c1b0 100644 --- a/Lib/test/test_stable_abi_ctypes.py +++ b/Lib/test/test_stable_abi_ctypes.py @@ -28,6 +28,14 @@ def test_available_symbols(self): "PyBaseObject_Type", "PyBool_FromLong", "PyBool_Type", + "PyBuffer_FillContiguousStrides", + "PyBuffer_FillInfo", + "PyBuffer_FromContiguous", + "PyBuffer_GetPointer", + "PyBuffer_IsContiguous", + "PyBuffer_Release", + "PyBuffer_SizeFromFormat", + "PyBuffer_ToContiguous", "PyByteArrayIter_Type", "PyByteArray_AsString", "PyByteArray_Concat", @@ -381,6 +389,7 @@ def test_available_symbols(self): "PyMemberDescr_Type", "PyMember_GetOne", "PyMember_SetOne", + "PyMemoryView_FromBuffer", "PyMemoryView_FromMemory", "PyMemoryView_FromObject", "PyMemoryView_GetContiguous", @@ -470,8 +479,10 @@ def test_available_symbols(self): "PyObject_CallNoArgs", "PyObject_CallObject", "PyObject_Calloc", + "PyObject_CheckBuffer", "PyObject_CheckReadBuffer", "PyObject_ClearWeakRefs", + "PyObject_CopyData", "PyObject_DelItem", "PyObject_DelItemString", "PyObject_Dir", @@ -489,6 +500,7 @@ def test_available_symbols(self): "PyObject_GetAIter", "PyObject_GetAttr", "PyObject_GetAttrString", + "PyObject_GetBuffer", "PyObject_GetItem", "PyObject_GetIter", "PyObject_HasAttr", diff --git a/Lib/test/test_xxlimited.py b/Lib/test/test_xxlimited.py index e3f521d9b040d..6dbfb3f439393 100644 --- a/Lib/test/test_xxlimited.py +++ b/Lib/test/test_xxlimited.py @@ -58,6 +58,17 @@ def test_error(self): with self.assertRaises(self.module.Error): raise self.module.Error + def test_buffer(self): + xxo = self.module.Xxo() + self.assertEqual(xxo.x_exports, 0) + b1 = memoryview(xxo) + self.assertEqual(xxo.x_exports, 1) + b2 = memoryview(xxo) + self.assertEqual(xxo.x_exports, 2) + b1[0] = 1 + self.assertEqual(b1[0], 1) + self.assertEqual(b2[0], 1) + class TestXXLimited35(CommonTests, unittest.TestCase): module = xxlimited_35 diff --git a/Makefile.pre.in b/Makefile.pre.in index edc5fc3b6802f..4dcedd684aa6d 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1439,6 +1439,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/abstract.h \ $(srcdir)/Include/bltinmodule.h \ $(srcdir)/Include/boolobject.h \ + $(srcdir)/Include/buffer.h \ $(srcdir)/Include/bytearrayobject.h \ $(srcdir)/Include/bytesobject.h \ $(srcdir)/Include/ceval.h \ diff --git a/Misc/NEWS.d/next/C API/2021-10-18-16-54-24.bpo-45459.Y1pEZs.rst b/Misc/NEWS.d/next/C API/2021-10-18-16-54-24.bpo-45459.Y1pEZs.rst new file mode 100644 index 0000000000000..a8d93227817c4 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-10-18-16-54-24.bpo-45459.Y1pEZs.rst @@ -0,0 +1,2 @@ +:c:type:`Py_buffer` and various ``Py_buffer`` related functions are now +part of the limited API and stable ABI. diff --git a/Misc/stable_abi.txt b/Misc/stable_abi.txt index c4f5318712a54..cc3cc56d472d9 100644 --- a/Misc/stable_abi.txt +++ b/Misc/stable_abi.txt @@ -2191,6 +2191,34 @@ function PyType_GetQualName data PyStructSequence_UnnamedField added 3.11 +# Add stable Py_buffer API in Python 3.11 (https://bugs.python.org/issue45459) +struct Py_buffer + added 3.11 +function PyObject_CheckBuffer + added 3.11 +function PyObject_GetBuffer + added 3.11 +function PyBuffer_GetPointer + added 3.11 +function PyBuffer_SizeFromFormat + added 3.11 +function PyBuffer_ToContiguous + added 3.11 +function PyBuffer_FromContiguous + added 3.11 +function PyObject_CopyData + added 3.11 +function PyBuffer_IsContiguous + added 3.11 +function PyBuffer_FillContiguousStrides + added 3.11 +function PyBuffer_FillInfo + added 3.11 +function PyBuffer_Release + added 3.11 +function PyMemoryView_FromBuffer + added 3.11 + # (Detailed comments aren't really needed for further entries: from here on # we can use version control logs.) diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c index 93895c4f1214c..16d1b8311c62c 100644 --- a/Modules/xxlimited.c +++ b/Modules/xxlimited.c @@ -19,6 +19,7 @@ def __init__(self): # In the C class, "_x_attr" is not accessible from Python code self._x_attr = {} + self._x_exports = 0 def __getattr__(self, name): return self._x_attr[name] @@ -29,6 +30,13 @@ def __delattr__(self, name): del self._x_attr[name] + @property + def x_exports(self): + """Return the number of times an internal buffer is exported.""" + # Each Xxo instance has a 10-byte buffer that can be + # accessed via the buffer interface (e.g. `memoryview`). + return self._x_exports + def demo(o, /): if isinstance(o, str): return o @@ -57,6 +65,9 @@ #define Py_LIMITED_API 0x030b0000 #include "Python.h" +#include + +#define BUFSIZE 10 // Module state typedef struct { @@ -70,7 +81,9 @@ typedef struct { // Instance state typedef struct { PyObject_HEAD - PyObject *x_attr; /* Attributes dictionary */ + PyObject *x_attr; /* Attributes dictionary */ + char x_buffer[BUFSIZE]; /* buffer for Py_buffer */ + Py_ssize_t x_exports; /* how many buffer are exported */ } XxoObject; // XXX: no good way to do this yet @@ -89,6 +102,8 @@ newXxoObject(PyObject *module) return NULL; } self->x_attr = NULL; + memset(self->x_buffer, 0, BUFSIZE); + self->x_exports = 0; return self; } @@ -212,11 +227,43 @@ static PyMethodDef Xxo_methods[] = { {NULL, NULL} /* sentinel */ }; +/* Xxo buffer interface */ + +static int +Xxo_getbuffer(XxoObject *self, Py_buffer *view, int flags) +{ + int res = PyBuffer_FillInfo(view, (PyObject*)self, + (void *)self->x_buffer, BUFSIZE, + 0, flags); + if (res == 0) { + self->x_exports++; + } + return res; +} + +static void +Xxo_releasebuffer(XxoObject *self, Py_buffer *view) +{ + self->x_exports--; +} + +static PyObject * +Xxo_get_x_exports(XxoObject *self, void *c) +{ + return PyLong_FromSsize_t(self->x_exports); +} + /* Xxo type definition */ PyDoc_STRVAR(Xxo_doc, "A class that explicitly stores attributes in an internal dict"); +static PyGetSetDef Xxo_getsetlist[] = { + {"x_exports", (getter) Xxo_get_x_exports, NULL, NULL}, + {NULL}, +}; + + static PyType_Slot Xxo_Type_slots[] = { {Py_tp_doc, (char *)Xxo_doc}, {Py_tp_traverse, Xxo_traverse}, @@ -226,6 +273,9 @@ static PyType_Slot Xxo_Type_slots[] = { {Py_tp_getattro, Xxo_getattro}, {Py_tp_setattro, Xxo_setattro}, {Py_tp_methods, Xxo_methods}, + {Py_bf_getbuffer, Xxo_getbuffer}, + {Py_bf_releasebuffer, Xxo_releasebuffer}, + {Py_tp_getset, Xxo_getsetlist}, {0, 0}, /* sentinel */ }; diff --git a/PC/python3dll.c b/PC/python3dll.c index b2bb1706c4a2e..70f11dc190554 100755 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -94,6 +94,14 @@ EXPORT_FUNC(PyArg_ValidateKeywordArguments) EXPORT_FUNC(PyArg_VaParse) EXPORT_FUNC(PyArg_VaParseTupleAndKeywords) EXPORT_FUNC(PyBool_FromLong) +EXPORT_FUNC(PyBuffer_FillContiguousStrides) +EXPORT_FUNC(PyBuffer_FillInfo) +EXPORT_FUNC(PyBuffer_FromContiguous) +EXPORT_FUNC(PyBuffer_GetPointer) +EXPORT_FUNC(PyBuffer_IsContiguous) +EXPORT_FUNC(PyBuffer_Release) +EXPORT_FUNC(PyBuffer_SizeFromFormat) +EXPORT_FUNC(PyBuffer_ToContiguous) EXPORT_FUNC(PyByteArray_AsString) EXPORT_FUNC(PyByteArray_Concat) EXPORT_FUNC(PyByteArray_FromObject) @@ -352,6 +360,7 @@ EXPORT_FUNC(PyMem_Malloc) EXPORT_FUNC(PyMem_Realloc) EXPORT_FUNC(PyMember_GetOne) EXPORT_FUNC(PyMember_SetOne) +EXPORT_FUNC(PyMemoryView_FromBuffer) EXPORT_FUNC(PyMemoryView_FromMemory) EXPORT_FUNC(PyMemoryView_FromObject) EXPORT_FUNC(PyMemoryView_GetContiguous) @@ -426,8 +435,10 @@ EXPORT_FUNC(PyObject_CallMethodObjArgs) EXPORT_FUNC(PyObject_CallNoArgs) EXPORT_FUNC(PyObject_CallObject) EXPORT_FUNC(PyObject_Calloc) +EXPORT_FUNC(PyObject_CheckBuffer) EXPORT_FUNC(PyObject_CheckReadBuffer) EXPORT_FUNC(PyObject_ClearWeakRefs) +EXPORT_FUNC(PyObject_CopyData) EXPORT_FUNC(PyObject_DelItem) EXPORT_FUNC(PyObject_DelItemString) EXPORT_FUNC(PyObject_Dir) @@ -445,6 +456,7 @@ EXPORT_FUNC(PyObject_GenericSetDict) EXPORT_FUNC(PyObject_GetAIter) EXPORT_FUNC(PyObject_GetAttr) EXPORT_FUNC(PyObject_GetAttrString) +EXPORT_FUNC(PyObject_GetBuffer) EXPORT_FUNC(PyObject_GetItem) EXPORT_FUNC(PyObject_GetIter) EXPORT_FUNC(PyObject_HasAttr) From webhook-mailer at python.org Wed Feb 2 10:56:57 2022 From: webhook-mailer at python.org (markshannon) Date: Wed, 02 Feb 2022 15:56:57 -0000 Subject: [Python-checkins] Add specialization stats for FOR_ITER. (GH-31079) Message-ID: https://github.com/python/cpython/commit/0d05da1fbf39f32d2c22a1f3702f40f916997b60 commit: 0d05da1fbf39f32d2c22a1f3702f40f916997b60 branch: main author: Mark Shannon committer: markshannon date: 2022-02-02T15:56:47Z summary: Add specialization stats for FOR_ITER. (GH-31079) files: M Python/ceval.c M Python/specialize.c M Tools/scripts/summarize_stats.py diff --git a/Python/ceval.c b/Python/ceval.c index 70748e8911f9f..3c52c5824b44a 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4212,6 +4212,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr PREDICTED(FOR_ITER); /* before: [iter]; after: [iter, iter()] *or* [] */ PyObject *iter = TOP(); +#ifdef Py_STATS + extern int _PySpecialization_ClassifyIterator(PyObject *); + _py_stats.opcode_stats[FOR_ITER].specialization.failure++; + _py_stats.opcode_stats[FOR_ITER].specialization.failure_kinds[_PySpecialization_ClassifyIterator(iter)]++; +#endif PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter); if (next != NULL) { PUSH(next); diff --git a/Python/specialize.c b/Python/specialize.c index 9290fbe823956..d90d7da8f3072 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -548,6 +548,23 @@ initial_counter_value(void) { #define SPEC_FAIL_NOT_FOLLOWED_BY_COND_JUMP 14 #define SPEC_FAIL_BIG_INT 15 +/* FOR_ITER */ +#define SPEC_FAIL_ITER_GENERATOR 10 +#define SPEC_FAIL_ITER_COROUTINE 11 +#define SPEC_FAIL_ITER_ASYNC_GENERATOR 12 +#define SPEC_FAIL_ITER_LIST 13 +#define SPEC_FAIL_ITER_TUPLE 14 +#define SPEC_FAIL_ITER_SET 15 +#define SPEC_FAIL_ITER_STRING 16 +#define SPEC_FAIL_ITER_BYTES 17 +#define SPEC_FAIL_ITER_RANGE 18 +#define SPEC_FAIL_ITER_ITERTOOLS 19 +#define SPEC_FAIL_ITER_DICT_KEYS 20 +#define SPEC_FAIL_ITER_DICT_ITEMS 21 +#define SPEC_FAIL_ITER_DICT_VALUES 22 +#define SPEC_FAIL_ITER_ENUMERATE 23 + + static int specialize_module_load_attr( PyObject *owner, _Py_CODEUNIT *instr, PyObject *name, @@ -1817,3 +1834,54 @@ _Py_Specialize_CompareOp(PyObject *lhs, PyObject *rhs, STAT_INC(COMPARE_OP, success); adaptive->counter = initial_counter_value(); } + + +int + _PySpecialization_ClassifyIterator(PyObject *iter) +{ + if (PyGen_CheckExact(iter)) { + return SPEC_FAIL_ITER_GENERATOR; + } + if (PyCoro_CheckExact(iter)) { + return SPEC_FAIL_ITER_COROUTINE; + } + if (PyAsyncGen_CheckExact(iter)) { + return SPEC_FAIL_ITER_ASYNC_GENERATOR; + } + PyTypeObject *t = _Py_TYPE(iter); + if (t == &PyListIter_Type) { + return SPEC_FAIL_ITER_LIST; + } + if (t == &PyTupleIter_Type) { + return SPEC_FAIL_ITER_TUPLE; + } + if (t == &PyDictIterKey_Type) { + return SPEC_FAIL_ITER_DICT_KEYS; + } + if (t == &PyDictIterValue_Type) { + return SPEC_FAIL_ITER_DICT_VALUES; + } + if (t == &PyDictIterItem_Type) { + return SPEC_FAIL_ITER_DICT_ITEMS; + } + if (t == &PySetIter_Type) { + return SPEC_FAIL_ITER_SET; + } + if (t == &PyUnicodeIter_Type) { + return SPEC_FAIL_ITER_STRING; + } + if (t == &PyBytesIter_Type) { + return SPEC_FAIL_ITER_BYTES; + } + if (t == &PyRangeIter_Type) { + return SPEC_FAIL_ITER_RANGE; + } + if (t == &PyEnum_Type) { + return SPEC_FAIL_ITER_ENUMERATE; + } + + if (strncmp(t->tp_name, "itertools", 8) == 0) { + return SPEC_FAIL_ITER_ITERTOOLS; + } + return SPEC_FAIL_OTHER; +} diff --git a/Tools/scripts/summarize_stats.py b/Tools/scripts/summarize_stats.py index 319b251c854a8..f67a35a04a9dd 100644 --- a/Tools/scripts/summarize_stats.py +++ b/Tools/scripts/summarize_stats.py @@ -26,7 +26,7 @@ TOTAL = "specialization.deferred", "specialization.hit", "specialization.miss", "execution_count" def print_specialization_stats(name, family_stats): - if "specialization.deferred" not in family_stats: + if "specialization.failure" not in family_stats: return total = sum(family_stats.get(kind, 0) for kind in TOTAL) if total == 0: From webhook-mailer at python.org Wed Feb 2 10:57:55 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 02 Feb 2022 15:57:55 -0000 Subject: [Python-checkins] bpo-46433: _PyType_GetModuleByDef: handle static types in MRO (GH-30696) Message-ID: https://github.com/python/cpython/commit/0ef08530124c5ca13a9394f4ac18bee8e6c66409 commit: 0ef08530124c5ca13a9394f4ac18bee8e6c66409 branch: main author: Petr Viktorin committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-02T07:57:51-08:00 summary: bpo-46433: _PyType_GetModuleByDef: handle static types in MRO (GH-30696) Automerge-Triggered-By: GH:encukou files: A Misc/NEWS.d/next/C API/2022-01-19-16-51-54.bpo-46433.Er9ApS.rst M Lib/test/test_capi.py M Modules/_testmultiphase.c M Modules/clinic/_testmultiphase.c.h M Objects/typeobject.c diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index a5db8a11c5f67..ccf8ceda49831 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -1068,6 +1068,22 @@ def test_state_access(self): with self.assertRaises(TypeError): increment_count(1, 2, 3) + def test_get_module_bad_def(self): + # _PyType_GetModuleByDef fails gracefully if it doesn't + # find what it's looking for. + # see bpo-46433 + instance = self.module.StateAccessType() + with self.assertRaises(TypeError): + instance.getmodulebydef_bad_def() + + def test_get_module_static_in_mro(self): + # Here, the class _PyType_GetModuleByDef is looking for + # appears in the MRO after a static type (Exception). + # see bpo-46433 + class Subclass(BaseException, self.module.StateAccessType): + pass + self.assertIs(Subclass().get_defining_module(), self.module) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/C API/2022-01-19-16-51-54.bpo-46433.Er9ApS.rst b/Misc/NEWS.d/next/C API/2022-01-19-16-51-54.bpo-46433.Er9ApS.rst new file mode 100644 index 0000000000000..e1987c4536b5c --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-01-19-16-51-54.bpo-46433.Er9ApS.rst @@ -0,0 +1,2 @@ +The internal function _PyType_GetModuleByDef now correctly handles +inheritance patterns involving static types. diff --git a/Modules/_testmultiphase.c b/Modules/_testmultiphase.c index ee69c42336170..f7bde9895eb09 100644 --- a/Modules/_testmultiphase.c +++ b/Modules/_testmultiphase.c @@ -126,6 +126,8 @@ static PyType_Spec Example_Type_spec = { static PyModuleDef def_meth_state_access; +static PyModuleDef def_nonmodule; +static PyModuleDef def_nonmodule_with_methods; /*[clinic input] _testmultiphase.StateAccessType.get_defining_module @@ -153,6 +155,24 @@ _testmultiphase_StateAccessType_get_defining_module_impl(StateAccessTypeObject * return retval; } +/*[clinic input] +_testmultiphase.StateAccessType.getmodulebydef_bad_def + + cls: defining_class + +Test that result of _PyType_GetModuleByDef with a bad def is NULL. +[clinic start generated code]*/ + +static PyObject * +_testmultiphase_StateAccessType_getmodulebydef_bad_def_impl(StateAccessTypeObject *self, + PyTypeObject *cls) +/*[clinic end generated code: output=64509074dfcdbd31 input=906047715ee293cd]*/ +{ + _PyType_GetModuleByDef(Py_TYPE(self), &def_nonmodule); // should raise + assert(PyErr_Occurred()); + return NULL; +} + /*[clinic input] _testmultiphase.StateAccessType.increment_count_clinic @@ -249,6 +269,7 @@ _testmultiphase_StateAccessType_get_count_impl(StateAccessTypeObject *self, static PyMethodDef StateAccessType_methods[] = { _TESTMULTIPHASE_STATEACCESSTYPE_GET_DEFINING_MODULE_METHODDEF + _TESTMULTIPHASE_STATEACCESSTYPE_GETMODULEBYDEF_BAD_DEF_METHODDEF _TESTMULTIPHASE_STATEACCESSTYPE_GET_COUNT_METHODDEF _TESTMULTIPHASE_STATEACCESSTYPE_INCREMENT_COUNT_CLINIC_METHODDEF { @@ -437,9 +458,6 @@ PyInit__testmultiphase(PyObject *spec) /**** Importing a non-module object ****/ -static PyModuleDef def_nonmodule; -static PyModuleDef def_nonmodule_with_methods; - /* Create a SimpleNamespace(three=3) */ static PyObject* createfunc_nonmodule(PyObject *spec, PyModuleDef *def) diff --git a/Modules/clinic/_testmultiphase.c.h b/Modules/clinic/_testmultiphase.c.h index 55f934be8c6c1..17c28d54ce575 100644 --- a/Modules/clinic/_testmultiphase.c.h +++ b/Modules/clinic/_testmultiphase.c.h @@ -35,6 +35,36 @@ _testmultiphase_StateAccessType_get_defining_module(StateAccessTypeObject *self, return return_value; } +PyDoc_STRVAR(_testmultiphase_StateAccessType_getmodulebydef_bad_def__doc__, +"getmodulebydef_bad_def($self, /)\n" +"--\n" +"\n" +"Test that result of _PyType_GetModuleByDef with a bad def is NULL."); + +#define _TESTMULTIPHASE_STATEACCESSTYPE_GETMODULEBYDEF_BAD_DEF_METHODDEF \ + {"getmodulebydef_bad_def", (PyCFunction)(void(*)(void))_testmultiphase_StateAccessType_getmodulebydef_bad_def, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_getmodulebydef_bad_def__doc__}, + +static PyObject * +_testmultiphase_StateAccessType_getmodulebydef_bad_def_impl(StateAccessTypeObject *self, + PyTypeObject *cls); + +static PyObject * +_testmultiphase_StateAccessType_getmodulebydef_bad_def(StateAccessTypeObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":getmodulebydef_bad_def", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = _testmultiphase_StateAccessType_getmodulebydef_bad_def_impl(self, cls); + +exit: + return return_value; +} + PyDoc_STRVAR(_testmultiphase_StateAccessType_increment_count_clinic__doc__, "increment_count_clinic($self, /, n=1, *, twice=False)\n" "--\n" @@ -101,4 +131,4 @@ _testmultiphase_StateAccessType_get_count(StateAccessTypeObject *self, PyTypeObj exit: return return_value; } -/*[clinic end generated code: output=f01137bb3b373e14 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=eb1b8c2ee6290be3 input=a9049054013a1b77]*/ diff --git a/Objects/typeobject.c b/Objects/typeobject.c index f7e0775e2225b..0c893eaa75b6f 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3756,11 +3756,10 @@ _PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def) Py_ssize_t n = PyTuple_GET_SIZE(mro); for (Py_ssize_t i = 0; i < n; i++) { PyObject *super = PyTuple_GET_ITEM(mro, i); - // _PyType_GetModuleByDef() must only be called on a heap type created - // by PyType_FromModuleAndSpec() or on its subclasses. - // type_ready_mro() ensures that a static type cannot inherit from a - // heap type. - assert(_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE)); + if(!_PyType_HasFeature((PyTypeObject *)super, Py_TPFLAGS_HEAPTYPE)) { + // Static types in the MRO need to be skipped + continue; + } PyHeapTypeObject *ht = (PyHeapTypeObject*)super; PyObject *module = ht->ht_module; From webhook-mailer at python.org Wed Feb 2 11:23:47 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 02 Feb 2022 16:23:47 -0000 Subject: [Python-checkins] bpo-37705: Remove orphaned PC/errmap.mak (GH-29724) Message-ID: https://github.com/python/cpython/commit/38e0b9efdf164be656782db0f969fb536cfbcaf1 commit: 38e0b9efdf164be656782db0f969fb536cfbcaf1 branch: main author: Oleg Iarygin committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-02T08:23:30-08:00 summary: bpo-37705: Remove orphaned PC/errmap.mak (GH-29724) After GH-15623 deleted `generrmap.c`, a related mak-file stopped working. The mak contains generrmap-related rules only so it should be removed altogether. Further search for `errmap\.mak|generrmap` regex through content of CPython files shows no dangling reference left. Since generrmap is already effectively removed, this pull request contains no blurp. files: D PC/errmap.mak diff --git a/PC/errmap.mak b/PC/errmap.mak deleted file mode 100644 index 646bcd0a2096f..0000000000000 --- a/PC/errmap.mak +++ /dev/null @@ -1,5 +0,0 @@ -errmap.h: generrmap.exe - .\generrmap.exe > errmap.h - -genermap.exe: generrmap.c - cl generrmap.c From webhook-mailer at python.org Wed Feb 2 11:59:48 2022 From: webhook-mailer at python.org (gpshead) Date: Wed, 02 Feb 2022 16:59:48 -0000 Subject: [Python-checkins] bpo-45173: Keep configparser deprecations until Python 3.12 (GH-30952) Message-ID: https://github.com/python/cpython/commit/e8659b47dece5a272111c0af5e340c364a9f807b commit: e8659b47dece5a272111c0af5e340c364a9f807b branch: main author: Hugo van Kemenade committer: gpshead date: 2022-02-02T08:59:39-08:00 summary: bpo-45173: Keep configparser deprecations until Python 3.12 (GH-30952) * Revert "bpo-45173 Remove configparser deprecations" This reverts commit df2284bc416dcccba1125b12af4499c45baabe4f. * bpo-45173: Note these configparser deprecations will be removed in 3.12 files: A Misc/NEWS.d/next/Library/2022-01-27-11-16-59.bpo-45173.wreRF2.rst M Doc/library/configparser.rst M Doc/whatsnew/3.11.rst M Lib/configparser.py M Lib/test/test_configparser.py diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst index d31452edb974f..1ebda53ecda0f 100644 --- a/Doc/library/configparser.rst +++ b/Doc/library/configparser.rst @@ -1201,6 +1201,28 @@ ConfigParser Objects names is stripped before :meth:`optionxform` is called. + .. method:: readfp(fp, filename=None) + + .. deprecated:: 3.2 + Use :meth:`read_file` instead. + + .. versionchanged:: 3.2 + :meth:`readfp` now iterates on *fp* instead of calling ``fp.readline()``. + + For existing code calling :meth:`readfp` with arguments which don't + support iteration, the following generator may be used as a wrapper + around the file-like object:: + + def readline_generator(fp): + line = fp.readline() + while line: + yield line + line = fp.readline() + + Instead of ``parser.readfp(fp)`` use + ``parser.read_file(readline_generator(fp))``. + + .. data:: MAX_INTERPOLATION_DEPTH The maximum depth for recursive interpolation for :meth:`get` when the *raw* @@ -1338,9 +1360,6 @@ Exceptions The ``filename`` attribute and :meth:`__init__` argument were renamed to ``source`` for consistency. - .. versionchanged:: 3.11 - The deprecated ``filename`` attribute was removed. - .. rubric:: Footnotes diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 3458ad63c9df8..33f39e5775269 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -458,6 +458,16 @@ Deprecated as deprecated, its docstring is now corrected). (Contributed by Hugo van Kemenade in :issue:`45837`.) +* The following have been deprecated in :mod:`configparser` since Python 3.2. + Their deprecation warnings have now been updated to note they will removed in + Python 3.12: + + * the :class:`configparser.SafeConfigParser` class + * the :attr:`configparser.ParsingError.filename` property + * the :meth:`configparser.ParsingError.readfp` method + + (Contributed by Hugo van Kemenade in :issue:`45173`.) + Removed ======= @@ -502,13 +512,6 @@ Removed the ``l*gettext()`` functions. (Contributed by Dong-hee Na and Serhiy Storchaka in :issue:`44235`.) -* Removed from the :mod:`configparser` module: - the :class:`SafeConfigParser` class, - the :attr:`filename` property of the :class:`ParsingError` class, - the :meth:`readfp` method of the :class:`ConfigParser` class, - deprecated since Python 3.2. - (Contributed by Hugo van Kemenade in :issue:`45173`.) - * The :func:`@asyncio.coroutine ` :term:`decorator` enabling legacy generator-based coroutines to be compatible with async/await code. The function has been deprecated since Python 3.8 and the removal was diff --git a/Lib/configparser.py b/Lib/configparser.py index c10309acf1ab4..3470624e63f61 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -146,12 +146,13 @@ import os import re import sys +import warnings __all__ = ["NoSectionError", "DuplicateOptionError", "DuplicateSectionError", "NoOptionError", "InterpolationError", "InterpolationDepthError", "InterpolationMissingOptionError", "InterpolationSyntaxError", "ParsingError", "MissingSectionHeaderError", - "ConfigParser", "RawConfigParser", + "ConfigParser", "SafeConfigParser", "RawConfigParser", "Interpolation", "BasicInterpolation", "ExtendedInterpolation", "LegacyInterpolation", "SectionProxy", "ConverterMapping", "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH"] @@ -311,6 +312,26 @@ def __init__(self, source=None, filename=None): self.errors = [] self.args = (source, ) + @property + def filename(self): + """Deprecated, use `source'.""" + warnings.warn( + "The 'filename' attribute will be removed in Python 3.12. " + "Use 'source' instead.", + DeprecationWarning, stacklevel=2 + ) + return self.source + + @filename.setter + def filename(self, value): + """Deprecated, user `source'.""" + warnings.warn( + "The 'filename' attribute will be removed in Python 3.12. " + "Use 'source' instead.", + DeprecationWarning, stacklevel=2 + ) + self.source = value + def append(self, lineno, line): self.errors.append((lineno, line)) self.message += '\n\t[line %2d]: %s' % (lineno, line) @@ -733,6 +754,15 @@ def read_dict(self, dictionary, source=''): elements_added.add((section, key)) self.set(section, key, value) + def readfp(self, fp, filename=None): + """Deprecated, use read_file instead.""" + warnings.warn( + "This method will be removed in Python 3.12. " + "Use 'parser.read_file()' instead.", + DeprecationWarning, stacklevel=2 + ) + self.read_file(fp, source=filename) + def get(self, section, option, *, raw=False, vars=None, fallback=_UNSET): """Get an option value for a given section. @@ -1195,6 +1225,19 @@ def _read_defaults(self, defaults): self._interpolation = hold_interpolation +class SafeConfigParser(ConfigParser): + """ConfigParser alias for backwards compatibility purposes.""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + warnings.warn( + "The SafeConfigParser class has been renamed to ConfigParser " + "in Python 3.2. This alias will be removed in Python 3.12." + " Use ConfigParser directly instead.", + DeprecationWarning, stacklevel=2 + ) + + class SectionProxy(MutableMapping): """A proxy for a single section from a parser.""" diff --git a/Lib/test/test_configparser.py b/Lib/test/test_configparser.py index cedf505122d13..e9b03e6c62ef1 100644 --- a/Lib/test/test_configparser.py +++ b/Lib/test/test_configparser.py @@ -1612,6 +1612,13 @@ def test_parsing_error(self): "and `source'. Use `source'.") error = configparser.ParsingError(filename='source') self.assertEqual(error.source, 'source') + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always", DeprecationWarning) + self.assertEqual(error.filename, 'source') + error.filename = 'filename' + self.assertEqual(error.source, 'filename') + for warning in w: + self.assertTrue(warning.category is DeprecationWarning) def test_interpolation_validation(self): parser = configparser.ConfigParser() @@ -1630,6 +1637,27 @@ def test_interpolation_validation(self): self.assertEqual(str(cm.exception), "bad interpolation variable " "reference '%(()'") + def test_readfp_deprecation(self): + sio = io.StringIO(""" + [section] + option = value + """) + parser = configparser.ConfigParser() + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always", DeprecationWarning) + parser.readfp(sio, filename='StringIO') + for warning in w: + self.assertTrue(warning.category is DeprecationWarning) + self.assertEqual(len(parser), 2) + self.assertEqual(parser['section']['option'], 'value') + + def test_safeconfigparser_deprecation(self): + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always", DeprecationWarning) + parser = configparser.SafeConfigParser() + for warning in w: + self.assertTrue(warning.category is DeprecationWarning) + def test_sectionproxy_repr(self): parser = configparser.ConfigParser() parser.read_string(""" diff --git a/Misc/NEWS.d/next/Library/2022-01-27-11-16-59.bpo-45173.wreRF2.rst b/Misc/NEWS.d/next/Library/2022-01-27-11-16-59.bpo-45173.wreRF2.rst new file mode 100644 index 0000000000000..ee5a88f621498 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-27-11-16-59.bpo-45173.wreRF2.rst @@ -0,0 +1 @@ +Note the configparser deprecations will be removed in Python 3.12. From webhook-mailer at python.org Wed Feb 2 13:41:39 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 02 Feb 2022 18:41:39 -0000 Subject: [Python-checkins] [3.10] bpo-45173: Note configparser deprecations will be removed in 3.12 (GH-31084) Message-ID: https://github.com/python/cpython/commit/ba4d79af32b6bb8378cb7003f67d6c4d413fbe89 commit: ba4d79af32b6bb8378cb7003f67d6c4d413fbe89 branch: 3.10 author: Hugo van Kemenade committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-02T10:41:30-08:00 summary: [3.10] bpo-45173: Note configparser deprecations will be removed in 3.12 (GH-31084) Cherry-pick of [`b06e9ba`](https://github.com/python/cpython/pull/30952/commits/b06e9ba398fafe39028c3b2dc3943266a16b1416) from https://github.com/python/cpython/pull/30952. files: A Misc/NEWS.d/next/Library/2022-01-27-11-16-59.bpo-45173.wreRF2.rst M Lib/configparser.py diff --git a/Lib/configparser.py b/Lib/configparser.py index 042a5c74b696f..3470624e63f61 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -316,7 +316,7 @@ def __init__(self, source=None, filename=None): def filename(self): """Deprecated, use `source'.""" warnings.warn( - "The 'filename' attribute will be removed in future versions. " + "The 'filename' attribute will be removed in Python 3.12. " "Use 'source' instead.", DeprecationWarning, stacklevel=2 ) @@ -326,7 +326,7 @@ def filename(self): def filename(self, value): """Deprecated, user `source'.""" warnings.warn( - "The 'filename' attribute will be removed in future versions. " + "The 'filename' attribute will be removed in Python 3.12. " "Use 'source' instead.", DeprecationWarning, stacklevel=2 ) @@ -757,7 +757,7 @@ def read_dict(self, dictionary, source=''): def readfp(self, fp, filename=None): """Deprecated, use read_file instead.""" warnings.warn( - "This method will be removed in future versions. " + "This method will be removed in Python 3.12. " "Use 'parser.read_file()' instead.", DeprecationWarning, stacklevel=2 ) @@ -1232,7 +1232,7 @@ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) warnings.warn( "The SafeConfigParser class has been renamed to ConfigParser " - "in Python 3.2. This alias will be removed in future versions." + "in Python 3.2. This alias will be removed in Python 3.12." " Use ConfigParser directly instead.", DeprecationWarning, stacklevel=2 ) diff --git a/Misc/NEWS.d/next/Library/2022-01-27-11-16-59.bpo-45173.wreRF2.rst b/Misc/NEWS.d/next/Library/2022-01-27-11-16-59.bpo-45173.wreRF2.rst new file mode 100644 index 0000000000000..ee5a88f621498 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-27-11-16-59.bpo-45173.wreRF2.rst @@ -0,0 +1 @@ +Note the configparser deprecations will be removed in Python 3.12. From webhook-mailer at python.org Wed Feb 2 14:54:32 2022 From: webhook-mailer at python.org (zooba) Date: Wed, 02 Feb 2022 19:54:32 -0000 Subject: [Python-checkins] bpo-46616: Ensures test_importlib.test_windows cleans up registry keys after completion (GH-31086) Message-ID: https://github.com/python/cpython/commit/89a0a90c2e0e685bc70206fc45e4413c4f4411ed commit: 89a0a90c2e0e685bc70206fc45e4413c4f4411ed branch: main author: Steve Dower committer: zooba date: 2022-02-02T19:54:27Z summary: bpo-46616: Ensures test_importlib.test_windows cleans up registry keys after completion (GH-31086) files: A Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst M Lib/test/test_importlib/test_windows.py diff --git a/Lib/test/test_importlib/test_windows.py b/Lib/test/test_importlib/test_windows.py index b3e8e7e6d63fc..b7dfe865a03a9 100644 --- a/Lib/test/test_importlib/test_windows.py +++ b/Lib/test/test_importlib/test_windows.py @@ -60,17 +60,28 @@ def setup_module(machinery, name, path=None): root = machinery.WindowsRegistryFinder.REGISTRY_KEY key = root.format(fullname=name, sys_version='%d.%d' % sys.version_info[:2]) + base_key = "Software\\Python\\PythonCore\\{}.{}".format( + sys.version_info.major, sys.version_info.minor) + assert key.casefold().startswith(base_key.casefold()), ( + "expected key '{}' to start with '{}'".format(key, base_key)) try: with temp_module(name, "a = 1") as location: + try: + OpenKey(HKEY_CURRENT_USER, base_key) + if machinery.WindowsRegistryFinder.DEBUG_BUILD: + delete_key = os.path.dirname(key) + else: + delete_key = key + except OSError: + delete_key = base_key subkey = CreateKey(HKEY_CURRENT_USER, key) if path is None: path = location + ".py" SetValue(subkey, "", REG_SZ, path) yield finally: - if machinery.WindowsRegistryFinder.DEBUG_BUILD: - key = os.path.dirname(key) - delete_registry_tree(HKEY_CURRENT_USER, key) + if delete_key: + delete_registry_tree(HKEY_CURRENT_USER, delete_key) @unittest.skipUnless(sys.platform.startswith('win'), 'requires Windows') diff --git a/Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst b/Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst new file mode 100644 index 0000000000000..31c63c3d8f181 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst @@ -0,0 +1,2 @@ +Ensures ``test_importlib.test_windows`` cleans up registry keys after +completion. From webhook-mailer at python.org Wed Feb 2 15:15:26 2022 From: webhook-mailer at python.org (gpshead) Date: Wed, 02 Feb 2022 20:15:26 -0000 Subject: [Python-checkins] bpo-46576: bpo-46524: Disable compiler optimization within test_peg_generator. (#31015) Message-ID: https://github.com/python/cpython/commit/164a017e13ee96bd1ea1ae79f5ac9e25fe83994e commit: 164a017e13ee96bd1ea1ae79f5ac9e25fe83994e branch: main author: Gregory P. Smith committer: gpshead date: 2022-02-02T12:15:16-08:00 summary: bpo-46576: bpo-46524: Disable compiler optimization within test_peg_generator. (#31015) Disable compiler optimization within test_peg_generator. This speed up test_peg_generator by always disabling compiler optimizations by using -O0 or equivalent when the test is building its own C extensions. A build not using --with-pydebug in order to speed up test execution winds up with this test taking a very long time as it would do repeated compilation of parser C code using the same optimization flags as CPython was built with. This speeds the test up 6-8x on gps-raspbian. Also incorporate's #31017's win32 conditional and flags. Co-authored-by: Kumar Aditya kumaraditya303 files: A Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst M Tools/peg_generator/pegen/build.py diff --git a/Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst b/Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst new file mode 100644 index 0000000000000..be50fc8cbe0a5 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst @@ -0,0 +1,3 @@ +test_peg_generator now disables compiler optimization when testing +compilation of its own C extensions to significantly speed up the +testing on non-debug builds of CPython. diff --git a/Tools/peg_generator/pegen/build.py b/Tools/peg_generator/pegen/build.py index c69e5c9a5f26a..78789b94df2e4 100644 --- a/Tools/peg_generator/pegen/build.py +++ b/Tools/peg_generator/pegen/build.py @@ -1,6 +1,7 @@ import itertools import pathlib import shutil +import sys import sysconfig import tempfile import tokenize @@ -32,6 +33,7 @@ def compile_c_extension( build_dir: Optional[str] = None, verbose: bool = False, keep_asserts: bool = True, + disable_optimization: bool = True, # Significant test_peg_generator speedup. ) -> str: """Compile the generated source for a parser generator into an extension module. @@ -61,6 +63,14 @@ def compile_c_extension( extra_link_args = get_extra_flags("LDFLAGS", "PY_LDFLAGS_NODIST") if keep_asserts: extra_compile_args.append("-UNDEBUG") + if disable_optimization: + if sys.platform == 'win32': + extra_compile_args.append("/Od") + extra_link_args.append("/LTCG:OFF") + else: + extra_compile_args.append("-O0") + if sysconfig.get_config_var("GNULD") == "yes": + extra_link_args.append("-fno-lto") extension = [ Extension( extension_name, From webhook-mailer at python.org Wed Feb 2 15:23:59 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 02 Feb 2022 20:23:59 -0000 Subject: [Python-checkins] bpo-46616: Ensures test_importlib.test_windows cleans up registry keys after completion (GH-31086) Message-ID: https://github.com/python/cpython/commit/3c6173ca67c019f3eb7a2fc34c5bfc426f99c5b2 commit: 3c6173ca67c019f3eb7a2fc34c5bfc426f99c5b2 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-02T12:23:49-08:00 summary: bpo-46616: Ensures test_importlib.test_windows cleans up registry keys after completion (GH-31086) (cherry picked from commit 89a0a90c2e0e685bc70206fc45e4413c4f4411ed) Co-authored-by: Steve Dower files: A Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst M Lib/test/test_importlib/test_windows.py diff --git a/Lib/test/test_importlib/test_windows.py b/Lib/test/test_importlib/test_windows.py index 9a53e8dbee56f..1c0abd3a872a6 100644 --- a/Lib/test/test_importlib/test_windows.py +++ b/Lib/test/test_importlib/test_windows.py @@ -41,17 +41,28 @@ def setup_module(machinery, name, path=None): root = machinery.WindowsRegistryFinder.REGISTRY_KEY key = root.format(fullname=name, sys_version='%d.%d' % sys.version_info[:2]) + base_key = "Software\\Python\\PythonCore\\{}.{}".format( + sys.version_info.major, sys.version_info.minor) + assert key.casefold().startswith(base_key.casefold()), ( + "expected key '{}' to start with '{}'".format(key, base_key)) try: with temp_module(name, "a = 1") as location: + try: + OpenKey(HKEY_CURRENT_USER, base_key) + if machinery.WindowsRegistryFinder.DEBUG_BUILD: + delete_key = os.path.dirname(key) + else: + delete_key = key + except OSError: + delete_key = base_key subkey = CreateKey(HKEY_CURRENT_USER, key) if path is None: path = location + ".py" SetValue(subkey, "", REG_SZ, path) yield finally: - if machinery.WindowsRegistryFinder.DEBUG_BUILD: - key = os.path.dirname(key) - delete_registry_tree(HKEY_CURRENT_USER, key) + if delete_key: + delete_registry_tree(HKEY_CURRENT_USER, delete_key) @unittest.skipUnless(sys.platform.startswith('win'), 'requires Windows') diff --git a/Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst b/Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst new file mode 100644 index 0000000000000..31c63c3d8f181 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst @@ -0,0 +1,2 @@ +Ensures ``test_importlib.test_windows`` cleans up registry keys after +completion. From webhook-mailer at python.org Wed Feb 2 15:25:50 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 02 Feb 2022 20:25:50 -0000 Subject: [Python-checkins] bpo-46616: Ensures test_importlib.test_windows cleans up registry keys after completion (GH-31086) Message-ID: https://github.com/python/cpython/commit/5765eaa13654e5f812a286700da7d6b8e144da0e commit: 5765eaa13654e5f812a286700da7d6b8e144da0e branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-02T12:25:37-08:00 summary: bpo-46616: Ensures test_importlib.test_windows cleans up registry keys after completion (GH-31086) (cherry picked from commit 89a0a90c2e0e685bc70206fc45e4413c4f4411ed) Co-authored-by: Steve Dower files: A Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst M Lib/test/test_importlib/test_windows.py diff --git a/Lib/test/test_importlib/test_windows.py b/Lib/test/test_importlib/test_windows.py index 6f09c5a7a5a46..1b9e185c19545 100644 --- a/Lib/test/test_importlib/test_windows.py +++ b/Lib/test/test_importlib/test_windows.py @@ -61,17 +61,28 @@ def setup_module(machinery, name, path=None): root = machinery.WindowsRegistryFinder.REGISTRY_KEY key = root.format(fullname=name, sys_version='%d.%d' % sys.version_info[:2]) + base_key = "Software\\Python\\PythonCore\\{}.{}".format( + sys.version_info.major, sys.version_info.minor) + assert key.casefold().startswith(base_key.casefold()), ( + "expected key '{}' to start with '{}'".format(key, base_key)) try: with temp_module(name, "a = 1") as location: + try: + OpenKey(HKEY_CURRENT_USER, base_key) + if machinery.WindowsRegistryFinder.DEBUG_BUILD: + delete_key = os.path.dirname(key) + else: + delete_key = key + except OSError: + delete_key = base_key subkey = CreateKey(HKEY_CURRENT_USER, key) if path is None: path = location + ".py" SetValue(subkey, "", REG_SZ, path) yield finally: - if machinery.WindowsRegistryFinder.DEBUG_BUILD: - key = os.path.dirname(key) - delete_registry_tree(HKEY_CURRENT_USER, key) + if delete_key: + delete_registry_tree(HKEY_CURRENT_USER, delete_key) @unittest.skipUnless(sys.platform.startswith('win'), 'requires Windows') diff --git a/Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst b/Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst new file mode 100644 index 0000000000000..31c63c3d8f181 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst @@ -0,0 +1,2 @@ +Ensures ``test_importlib.test_windows`` cleans up registry keys after +completion. From webhook-mailer at python.org Wed Feb 2 20:59:32 2022 From: webhook-mailer at python.org (terryjreedy) Date: Thu, 03 Feb 2022 01:59:32 -0000 Subject: [Python-checkins] bpo-45975: Use walrus operator for some idlelib while loops (GH-31083) Message-ID: https://github.com/python/cpython/commit/51a95be1d035a717ab29e98056b8831a98e61125 commit: 51a95be1d035a717ab29e98056b8831a98e61125 branch: main author: Nick Drozd committer: terryjreedy date: 2022-02-02T20:59:24-05:00 summary: bpo-45975: Use walrus operator for some idlelib while loops (GH-31083) files: M Lib/idlelib/idle_test/test_sidebar.py M Lib/idlelib/pyparse.py M Lib/idlelib/replace.py M Lib/idlelib/run.py M Lib/idlelib/sidebar.py diff --git a/Lib/idlelib/idle_test/test_sidebar.py b/Lib/idlelib/idle_test/test_sidebar.py index 53ac3eb27335d..01fd6a04d0de3 100644 --- a/Lib/idlelib/idle_test/test_sidebar.py +++ b/Lib/idlelib/idle_test/test_sidebar.py @@ -474,10 +474,7 @@ def get_shell_line_y_coords(self): index = text.index("@0,0") if index.split('.', 1)[1] != '0': index = text.index(f"{index} +1line linestart") - while True: - lineinfo = text.dlineinfo(index) - if lineinfo is None: - break + while (lineinfo := text.dlineinfo(index)) is not None: y_coords.append(lineinfo[1]) index = text.index(f"{index} +1line") return y_coords diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index d34872b4396e1..a94327533d865 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -179,14 +179,10 @@ def find_good_parse_start(self, is_char_in_string): # Peeking back worked; look forward until _synchre no longer # matches. i = pos + 1 - while 1: - m = _synchre(code, i) - if m: - s, i = m.span() - if not is_char_in_string(s): - pos = s - else: - break + while (m := _synchre(code, i)): + s, i = m.span() + if not is_char_in_string(s): + pos = s return pos def set_lo(self, lo): diff --git a/Lib/idlelib/replace.py b/Lib/idlelib/replace.py index 2f9ca231a05e4..ac04ed94dd475 100644 --- a/Lib/idlelib/replace.py +++ b/Lib/idlelib/replace.py @@ -158,11 +158,8 @@ def replace_all(self, event=None): first = last = None # XXX ought to replace circular instead of top-to-bottom when wrapping text.undo_block_start() - while True: - res = self.engine.search_forward(text, prog, line, col, - wrap=False, ok=ok) - if not res: - break + while (res := self.engine.search_forward( + text, prog, line, col, wrap=False, ok=ok)): line, m = res chars = text.get("%d.0" % line, "%d.0" % (line+1)) orig = m.group() diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 47c4cbdcb8c3f..01f8d65426abc 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -482,9 +482,7 @@ def read(self, size=-1): result = self._line_buffer self._line_buffer = '' if size < 0: - while True: - line = self.shell.readline() - if not line: break + while (line := self.shell.readline()): result += line else: while len(result) < size: diff --git a/Lib/idlelib/sidebar.py b/Lib/idlelib/sidebar.py index 018c368f421c6..fb1084dbf3f18 100644 --- a/Lib/idlelib/sidebar.py +++ b/Lib/idlelib/sidebar.py @@ -471,10 +471,7 @@ def update_sidebar(self): index = text.index("@0,0") if index.split('.', 1)[1] != '0': index = text.index(f'{index}+1line linestart') - while True: - lineinfo = text.dlineinfo(index) - if lineinfo is None: - break + while (lineinfo := text.dlineinfo(index)) is not None: y = lineinfo[1] prev_newline_tagnames = text_tagnames(f"{index} linestart -1c") prompt = ( From webhook-mailer at python.org Wed Feb 2 21:28:57 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 03 Feb 2022 02:28:57 -0000 Subject: [Python-checkins] bpo-45975: Use walrus operator for some idlelib while loops (GH-31083) Message-ID: https://github.com/python/cpython/commit/2ddc278875f789de622262ee8ff5a1c3788f031c commit: 2ddc278875f789de622262ee8ff5a1c3788f031c branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-02T18:28:52-08:00 summary: bpo-45975: Use walrus operator for some idlelib while loops (GH-31083) (cherry picked from commit 51a95be1d035a717ab29e98056b8831a98e61125) Co-authored-by: Nick Drozd files: M Lib/idlelib/idle_test/test_sidebar.py M Lib/idlelib/pyparse.py M Lib/idlelib/replace.py M Lib/idlelib/run.py M Lib/idlelib/sidebar.py diff --git a/Lib/idlelib/idle_test/test_sidebar.py b/Lib/idlelib/idle_test/test_sidebar.py index 53ac3eb27335d..01fd6a04d0de3 100644 --- a/Lib/idlelib/idle_test/test_sidebar.py +++ b/Lib/idlelib/idle_test/test_sidebar.py @@ -474,10 +474,7 @@ def get_shell_line_y_coords(self): index = text.index("@0,0") if index.split('.', 1)[1] != '0': index = text.index(f"{index} +1line linestart") - while True: - lineinfo = text.dlineinfo(index) - if lineinfo is None: - break + while (lineinfo := text.dlineinfo(index)) is not None: y_coords.append(lineinfo[1]) index = text.index(f"{index} +1line") return y_coords diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index d34872b4396e1..a94327533d865 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -179,14 +179,10 @@ def find_good_parse_start(self, is_char_in_string): # Peeking back worked; look forward until _synchre no longer # matches. i = pos + 1 - while 1: - m = _synchre(code, i) - if m: - s, i = m.span() - if not is_char_in_string(s): - pos = s - else: - break + while (m := _synchre(code, i)): + s, i = m.span() + if not is_char_in_string(s): + pos = s return pos def set_lo(self, lo): diff --git a/Lib/idlelib/replace.py b/Lib/idlelib/replace.py index 2f9ca231a05e4..ac04ed94dd475 100644 --- a/Lib/idlelib/replace.py +++ b/Lib/idlelib/replace.py @@ -158,11 +158,8 @@ def replace_all(self, event=None): first = last = None # XXX ought to replace circular instead of top-to-bottom when wrapping text.undo_block_start() - while True: - res = self.engine.search_forward(text, prog, line, col, - wrap=False, ok=ok) - if not res: - break + while (res := self.engine.search_forward( + text, prog, line, col, wrap=False, ok=ok)): line, m = res chars = text.get("%d.0" % line, "%d.0" % (line+1)) orig = m.group() diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 47c4cbdcb8c3f..01f8d65426abc 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -482,9 +482,7 @@ def read(self, size=-1): result = self._line_buffer self._line_buffer = '' if size < 0: - while True: - line = self.shell.readline() - if not line: break + while (line := self.shell.readline()): result += line else: while len(result) < size: diff --git a/Lib/idlelib/sidebar.py b/Lib/idlelib/sidebar.py index 018c368f421c6..fb1084dbf3f18 100644 --- a/Lib/idlelib/sidebar.py +++ b/Lib/idlelib/sidebar.py @@ -471,10 +471,7 @@ def update_sidebar(self): index = text.index("@0,0") if index.split('.', 1)[1] != '0': index = text.index(f'{index}+1line linestart') - while True: - lineinfo = text.dlineinfo(index) - if lineinfo is None: - break + while (lineinfo := text.dlineinfo(index)) is not None: y = lineinfo[1] prev_newline_tagnames = text_tagnames(f"{index} linestart -1c") prompt = ( From webhook-mailer at python.org Wed Feb 2 22:12:48 2022 From: webhook-mailer at python.org (terryjreedy) Date: Thu, 03 Feb 2022 03:12:48 -0000 Subject: [Python-checkins] [3.9] bpo-45975: Use walrus operator for some idlelib while loops (GH-31083) Message-ID: https://github.com/python/cpython/commit/fafd2dadf63973a04f5693e5be19f3e7521c10d4 commit: fafd2dadf63973a04f5693e5be19f3e7521c10d4 branch: 3.9 author: Terry Jan Reedy committer: terryjreedy date: 2022-02-02T22:12:38-05:00 summary: [3.9] bpo-45975: Use walrus operator for some idlelib while loops (GH-31083) co-authored by Nick Drozd cherrypicked from 51a95be1d035a717ab29e98056b8831a98e61125 files: M Lib/idlelib/pyparse.py M Lib/idlelib/replace.py M Lib/idlelib/run.py diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index d34872b4396e1..a94327533d865 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -179,14 +179,10 @@ def find_good_parse_start(self, is_char_in_string): # Peeking back worked; look forward until _synchre no longer # matches. i = pos + 1 - while 1: - m = _synchre(code, i) - if m: - s, i = m.span() - if not is_char_in_string(s): - pos = s - else: - break + while (m := _synchre(code, i)): + s, i = m.span() + if not is_char_in_string(s): + pos = s return pos def set_lo(self, lo): diff --git a/Lib/idlelib/replace.py b/Lib/idlelib/replace.py index 6be034af9626b..70d761db12630 100644 --- a/Lib/idlelib/replace.py +++ b/Lib/idlelib/replace.py @@ -156,11 +156,8 @@ def replace_all(self, event=None): first = last = None # XXX ought to replace circular instead of top-to-bottom when wrapping text.undo_block_start() - while True: - res = self.engine.search_forward(text, prog, line, col, - wrap=False, ok=ok) - if not res: - break + while (res := self.engine.search_forward( + text, prog, line, col, wrap=False, ok=ok)): line, m = res chars = text.get("%d.0" % line, "%d.0" % (line+1)) orig = m.group() diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index dda9711dcf7ae..4246f497cb382 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -468,9 +468,7 @@ def read(self, size=-1): result = self._line_buffer self._line_buffer = '' if size < 0: - while True: - line = self.shell.readline() - if not line: break + while (line := self.shell.readline()): result += line else: while len(result) < size: From webhook-mailer at python.org Wed Feb 2 23:03:08 2022 From: webhook-mailer at python.org (gpshead) Date: Thu, 03 Feb 2022 04:03:08 -0000 Subject: [Python-checkins] [3.10] bpo-46576: bpo-46524: Disable compiler optimization within test_peg_generator. (GH-31015) (GH-31089) Message-ID: https://github.com/python/cpython/commit/f5ebec4d3e1199ec38b88920cfde8e460e5120dd commit: f5ebec4d3e1199ec38b88920cfde8e460e5120dd branch: 3.10 author: Gregory P. Smith committer: gpshead date: 2022-02-02T20:02:59-08:00 summary: [3.10] bpo-46576: bpo-46524: Disable compiler optimization within test_peg_generator. (GH-31015) (GH-31089) Disable compiler optimization within test_peg_generator. This speed up test_peg_generator by always disabling compiler optimizations by using -O0 or equivalent when the test is building its own C extensions. A build not using --with-pydebug in order to speed up test execution winds up with this test taking a very long time as it would do repeated compilation of parser C code using the same optimization flags as CPython was built with. This speeds the test up 6-8x on gps-raspbian. Also incorporate's GH-31017's win32 conditional and flags. Co-authored-by: Kumar Aditya kumaraditya303. (cherry picked from commit 164a017e13ee96bd1ea1ae79f5ac9e25fe83994e) Co-authored-by: Gregory P. Smith files: A Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst M Tools/peg_generator/pegen/build.py diff --git a/Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst b/Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst new file mode 100644 index 0000000000000..be50fc8cbe0a5 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst @@ -0,0 +1,3 @@ +test_peg_generator now disables compiler optimization when testing +compilation of its own C extensions to significantly speed up the +testing on non-debug builds of CPython. diff --git a/Tools/peg_generator/pegen/build.py b/Tools/peg_generator/pegen/build.py index b80fc85423919..61a48d5714519 100644 --- a/Tools/peg_generator/pegen/build.py +++ b/Tools/peg_generator/pegen/build.py @@ -1,6 +1,7 @@ import pathlib import shutil import tokenize +import sys import sysconfig import tempfile import itertools @@ -33,6 +34,7 @@ def compile_c_extension( build_dir: Optional[str] = None, verbose: bool = False, keep_asserts: bool = True, + disable_optimization: bool = True, # Significant test_peg_generator speedup. ) -> str: """Compile the generated source for a parser generator into an extension module. @@ -62,6 +64,14 @@ def compile_c_extension( extra_link_args = get_extra_flags("LDFLAGS", "PY_LDFLAGS_NODIST") if keep_asserts: extra_compile_args.append("-UNDEBUG") + if disable_optimization: + if sys.platform == 'win32': + extra_compile_args.append("/Od") + extra_link_args.append("/LTCG:OFF") + else: + extra_compile_args.append("-O0") + if sysconfig.get_config_var("GNULD") == "yes": + extra_link_args.append("-fno-lto") extension = [ Extension( extension_name, From webhook-mailer at python.org Wed Feb 2 23:33:04 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 03 Feb 2022 04:33:04 -0000 Subject: [Python-checkins] [3.9] [3.10] bpo-46576: bpo-46524: Disable compiler optimization within test_peg_generator. (GH-31015) (GH-31089) (GH-31093) Message-ID: https://github.com/python/cpython/commit/e8258608c28c65680253d0ca6167430e34c2fd87 commit: e8258608c28c65680253d0ca6167430e34c2fd87 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-02T20:32:54-08:00 summary: [3.9] [3.10] bpo-46576: bpo-46524: Disable compiler optimization within test_peg_generator. (GH-31015) (GH-31089) (GH-31093) Disable compiler optimization within test_peg_generator. This speed up test_peg_generator by always disabling compiler optimizations by using -O0 or equivalent when the test is building its own C extensions. A build not using --with-pydebug in order to speed up test execution winds up with this test taking a very long time as it would do repeated compilation of parser C code using the same optimization flags as CPython was built with. This speeds the test up 6-8x on gps-raspbian. Also incorporate's GH-31017's win32 conditional and flags. Co-authored-by: Kumar Aditya kumaraditya303. (cherry picked from commit 164a017e13ee96bd1ea1ae79f5ac9e25fe83994e) Co-authored-by: Gregory P. Smith (cherry picked from commit f5ebec4d3e1199ec38b88920cfde8e460e5120dd) Co-authored-by: Gregory P. Smith Automerge-Triggered-By: GH:gpshead files: A Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst M Tools/peg_generator/pegen/build.py diff --git a/Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst b/Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst new file mode 100644 index 0000000000000..be50fc8cbe0a5 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst @@ -0,0 +1,3 @@ +test_peg_generator now disables compiler optimization when testing +compilation of its own C extensions to significantly speed up the +testing on non-debug builds of CPython. diff --git a/Tools/peg_generator/pegen/build.py b/Tools/peg_generator/pegen/build.py index 931ffc787523b..109fb9ecc7adc 100644 --- a/Tools/peg_generator/pegen/build.py +++ b/Tools/peg_generator/pegen/build.py @@ -1,6 +1,7 @@ import pathlib import shutil import tokenize +import sys import sysconfig import tempfile import itertools @@ -33,6 +34,7 @@ def compile_c_extension( build_dir: Optional[str] = None, verbose: bool = False, keep_asserts: bool = True, + disable_optimization: bool = True, # Significant test_peg_generator speedup. ) -> str: """Compile the generated source for a parser generator into an extension module. @@ -59,6 +61,14 @@ def compile_c_extension( extra_link_args = get_extra_flags("LDFLAGS", "PY_LDFLAGS_NODIST") if keep_asserts: extra_compile_args.append("-UNDEBUG") + if disable_optimization: + if sys.platform == 'win32': + extra_compile_args.append("/Od") + extra_link_args.append("/LTCG:OFF") + else: + extra_compile_args.append("-O0") + if sysconfig.get_config_var("GNULD") == "yes": + extra_link_args.append("-fno-lto") extension = [ Extension( extension_name, From webhook-mailer at python.org Thu Feb 3 00:36:26 2022 From: webhook-mailer at python.org (gpshead) Date: Thu, 03 Feb 2022 05:36:26 -0000 Subject: [Python-checkins] bpo-45629: Improve test.support.skip_if_buildbot (GH-31094) Message-ID: https://github.com/python/cpython/commit/8726067ace98a27557e9fdf1a8e1c509c37cfcfc commit: 8726067ace98a27557e9fdf1a8e1c509c37cfcfc branch: main author: Gregory P. Smith committer: gpshead date: 2022-02-02T21:36:16-08:00 summary: bpo-45629: Improve test.support.skip_if_buildbot (GH-31094) It was added as part of #29222 to avoid running freeze tool tests on the buildbots but the logic was wrong so it did not skip tests on typical posix setup buildbots where the worker is launched from cron via an @reboot task and thus have no USER environment variable. This uses the canonical `getpass.getuser()` API rather than rolling its own attempt. files: M Lib/test/support/__init__.py diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index d71cfe5ee44fd..e5eb66e9068e7 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -5,6 +5,7 @@ import contextlib import functools +import getpass import os import re import stat @@ -378,10 +379,11 @@ def skip_if_buildbot(reason=None): """Decorator raising SkipTest if running on a buildbot.""" if not reason: reason = 'not suitable for buildbots' - if sys.platform == 'win32': - isbuildbot = os.environ.get('USERNAME') == 'Buildbot' - else: - isbuildbot = os.environ.get('USER') == 'buildbot' + try: + isbuildbot = getpass.getuser().lower() == 'buildbot' + except (KeyError, EnvironmentError) as err: + warnings.warn(f'getpass.getuser() failed {err}.', RuntimeWarning) + isbuildbot = False return unittest.skipIf(isbuildbot, reason) def check_sanitizer(*, address=False, memory=False, ub=False): From webhook-mailer at python.org Thu Feb 3 03:12:18 2022 From: webhook-mailer at python.org (rhettinger) Date: Thu, 03 Feb 2022 08:12:18 -0000 Subject: [Python-checkins] Add recipe for subslices (GH-31095) Message-ID: https://github.com/python/cpython/commit/a77de58108a89ada49a3af7613e84df436fd147c commit: a77de58108a89ada49a3af7613e84df436fd147c branch: 3.10 author: Raymond Hettinger committer: rhettinger date: 2022-02-03T02:12:08-06:00 summary: Add recipe for subslices (GH-31095) files: M Doc/library/itertools.rst diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 34667561c3cfe..6e1ba3c440124 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -893,6 +893,12 @@ which incur interpreter overhead. yield from it return true_iterator(), remainder_iterator() + def subslices(seq): + "Return all contiguous non-empty subslices of a sequence" + # subslices('ABCD') --> A AB ABC ABCD B BC BCD C CD D + slices = starmap(slice, combinations(range(len(seq) + 1), 2)) + return map(operator.getitem, repeat(seq), slices) + def powerset(iterable): "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" s = list(iterable) From webhook-mailer at python.org Thu Feb 3 03:41:47 2022 From: webhook-mailer at python.org (gpshead) Date: Thu, 03 Feb 2022 08:41:47 -0000 Subject: [Python-checkins] Restrict use of Mock objects as specs (GH-31090) Message-ID: https://github.com/python/cpython/commit/6394e981adaca2c0daa36c8701611e250d74024c commit: 6394e981adaca2c0daa36c8701611e250d74024c branch: main author: Matthew Suozzo committer: gpshead date: 2022-02-03T00:41:19-08:00 summary: Restrict use of Mock objects as specs (GH-31090) Follow-on to https://github.com/python/cpython/pull/25326 This covers cases where mock objects are passed directly to spec. files: A Misc/NEWS.d/next/Tests/2022-02-03-00-21-32.bpo-43478.0nfcam.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testmock.py M Lib/unittest/test/testmock/testwith.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 9137501930000..2719f74d6fca5 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -489,6 +489,9 @@ def mock_add_spec(self, spec, spec_set=False): def _mock_add_spec(self, spec, spec_set, _spec_as_instance=False, _eat_self=False): + if _is_instance_mock(spec): + raise InvalidSpecError(f'Cannot spec a Mock object. [object={spec!r}]') + _spec_class = None _spec_signature = None _spec_asyncs = [] @@ -2789,6 +2792,7 @@ def __init__(self, spec, spec_set=False, parent=None, file_spec = None +open_spec = None def _to_stream(read_data): @@ -2845,8 +2849,12 @@ def _next_side_effect(): import _io file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO)))) + global open_spec + if open_spec is None: + import _io + open_spec = list(set(dir(_io.open))) if mock is None: - mock = MagicMock(name='open', spec=open) + mock = MagicMock(name='open', spec=open_spec) handle = MagicMock(spec=file_spec) handle.__enter__.return_value = handle diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index fdba543b53511..c99098dc4ea86 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -226,6 +226,14 @@ class B(object): with self.assertRaisesRegex(InvalidSpecError, "Cannot spec attr 'B' as the spec_set "): mock.patch.object(A, 'B', spec_set=A.B).start() + with self.assertRaisesRegex(InvalidSpecError, + "Cannot spec attr 'B' as the spec_set "): + mock.patch.object(A, 'B', spec_set=A.B).start() + with self.assertRaisesRegex(InvalidSpecError, "Cannot spec a Mock object."): + mock.Mock(A.B) + with mock.patch('builtins.open', mock.mock_open()): + mock.mock_open() # should still be valid with open() mocked + def test_reset_mock(self): parent = Mock() diff --git a/Lib/unittest/test/testmock/testwith.py b/Lib/unittest/test/testmock/testwith.py index 42ebf3898c89e..c74d49a63c892 100644 --- a/Lib/unittest/test/testmock/testwith.py +++ b/Lib/unittest/test/testmock/testwith.py @@ -130,8 +130,8 @@ def f(self): pass c = C() - with patch.object(c, 'f', autospec=True) as patch1: - with patch.object(c, 'f', autospec=True) as patch2: + with patch.object(c, 'f') as patch1: + with patch.object(c, 'f') as patch2: c.f() self.assertEqual(patch2.call_count, 1) self.assertEqual(patch1.call_count, 0) diff --git a/Misc/NEWS.d/next/Tests/2022-02-03-00-21-32.bpo-43478.0nfcam.rst b/Misc/NEWS.d/next/Tests/2022-02-03-00-21-32.bpo-43478.0nfcam.rst new file mode 100644 index 0000000000000..7c8fc47cfc751 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-02-03-00-21-32.bpo-43478.0nfcam.rst @@ -0,0 +1 @@ +Mocks can no longer be provided as the specs for other Mocks. As a result, an already-mocked object cannot be passed to `mock.Mock()`. This can uncover bugs in tests since these Mock-derived Mocks will always pass certain tests (e.g. isinstance) and builtin assert functions (e.g. assert_called_once_with) will unconditionally pass. From webhook-mailer at python.org Thu Feb 3 04:20:23 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Thu, 03 Feb 2022 09:20:23 -0000 Subject: [Python-checkins] bpo-46565: `del` loop vars that are leaking into module namespaces (GH-30993) Message-ID: https://github.com/python/cpython/commit/0cbdd2131195b0d313762968f604e80a3e65ca9f commit: 0cbdd2131195b0d313762968f604e80a3e65ca9f branch: main author: Nikita Sobolev committer: serhiy-storchaka date: 2022-02-03T11:20:08+02:00 summary: bpo-46565: `del` loop vars that are leaking into module namespaces (GH-30993) files: A Misc/NEWS.d/next/Library/2022-01-28-19-48-31.bpo-46565.bpZXO4.rst M Lib/_compat_pickle.py M Lib/email/contentmanager.py M Lib/email/quoprimime.py M Lib/http/cookiejar.py M Lib/inspect.py M Lib/json/encoder.py M Lib/lib2to3/pgen2/grammar.py M Lib/locale.py M Lib/multiprocessing/managers.py M Lib/multiprocessing/process.py M Lib/sysconfig.py M Lib/test/test_inspect.py M Lib/tokenize.py diff --git a/Lib/_compat_pickle.py b/Lib/_compat_pickle.py index f68496ae639f5..65a94b6b1bdfd 100644 --- a/Lib/_compat_pickle.py +++ b/Lib/_compat_pickle.py @@ -249,3 +249,4 @@ for excname in PYTHON3_IMPORTERROR_EXCEPTIONS: REVERSE_NAME_MAPPING[('builtins', excname)] = ('exceptions', 'ImportError') +del excname diff --git a/Lib/email/contentmanager.py b/Lib/email/contentmanager.py index fcf278dbccbac..b4f5830beada4 100644 --- a/Lib/email/contentmanager.py +++ b/Lib/email/contentmanager.py @@ -72,12 +72,14 @@ def get_non_text_content(msg): return msg.get_payload(decode=True) for maintype in 'audio image video application'.split(): raw_data_manager.add_get_handler(maintype, get_non_text_content) +del maintype def get_message_content(msg): return msg.get_payload(0) for subtype in 'rfc822 external-body'.split(): raw_data_manager.add_get_handler('message/'+subtype, get_message_content) +del subtype def get_and_fixup_unknown_message_content(msg): @@ -246,3 +248,4 @@ def set_bytes_content(msg, data, maintype, subtype, cte='base64', _finalize_set(msg, disposition, filename, cid, params) for typ in (bytes, bytearray, memoryview): raw_data_manager.add_set_handler(typ, set_bytes_content) +del typ diff --git a/Lib/email/quoprimime.py b/Lib/email/quoprimime.py index 94534f7ee1e33..27fcbb5a26e3a 100644 --- a/Lib/email/quoprimime.py +++ b/Lib/email/quoprimime.py @@ -148,6 +148,7 @@ def header_encode(header_bytes, charset='iso-8859-1'): _QUOPRI_BODY_ENCODE_MAP = _QUOPRI_BODY_MAP[:] for c in b'\r\n': _QUOPRI_BODY_ENCODE_MAP[c] = chr(c) +del c def body_encode(body, maxlinelen=76, eol=NL): """Encode with quoted-printable, wrapping at maxlinelen characters. diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index eaa76c26b9c59..ee433c0f78f4a 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -89,8 +89,7 @@ def _timegm(tt): DAYS = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] -MONTHS_LOWER = [] -for month in MONTHS: MONTHS_LOWER.append(month.lower()) +MONTHS_LOWER = [month.lower() for month in MONTHS] def time2isoz(t=None): """Return a string representing time in seconds since epoch, t. diff --git a/Lib/inspect.py b/Lib/inspect.py index d47f5b717471c..eb45f81aa2d95 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -156,6 +156,7 @@ mod_dict = globals() for k, v in dis.COMPILER_FLAG_NAMES.items(): mod_dict["CO_" + v] = k +del k, v, mod_dict # See Include/object.h TPFLAGS_IS_ABSTRACT = 1 << 20 diff --git a/Lib/json/encoder.py b/Lib/json/encoder.py index 21bff2c1a1fca..864f46d9dbb72 100644 --- a/Lib/json/encoder.py +++ b/Lib/json/encoder.py @@ -30,6 +30,7 @@ for i in range(0x20): ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i)) #ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,)) +del i INFINITY = float('inf') diff --git a/Lib/lib2to3/pgen2/grammar.py b/Lib/lib2to3/pgen2/grammar.py index 6a4d575ac2ccf..5d550aeb65e8d 100644 --- a/Lib/lib2to3/pgen2/grammar.py +++ b/Lib/lib2to3/pgen2/grammar.py @@ -186,3 +186,4 @@ def report(self): if line: op, name = line.split() opmap[op] = getattr(token, name) +del line, op, name diff --git a/Lib/locale.py b/Lib/locale.py index 6d4f51929923f..4bd31c9fa2cdf 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -746,6 +746,7 @@ def getpreferredencoding(do_setlocale=True): for k, v in sorted(locale_encoding_alias.items()): k = k.replace('_', '') locale_encoding_alias.setdefault(k, v) +del k, v # # The locale_alias table maps lowercase alias names to C locale names diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index cf637c6cbbe8d..d97381926d47b 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -49,11 +49,11 @@ def reduce_array(a): reduction.register(array.array, reduce_array) view_types = [type(getattr({}, name)()) for name in ('items','keys','values')] -if view_types[0] is not list: # only needed in Py3.0 - def rebuild_as_list(obj): - return list, (list(obj),) - for view_type in view_types: - reduction.register(view_type, rebuild_as_list) +def rebuild_as_list(obj): + return list, (list(obj),) +for view_type in view_types: + reduction.register(view_type, rebuild_as_list) +del view_type, view_types # # Type for identifying shared objects diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py index 0b2e0b45b2397..3917d2e4fa63e 100644 --- a/Lib/multiprocessing/process.py +++ b/Lib/multiprocessing/process.py @@ -427,6 +427,7 @@ def close(self): for name, signum in list(signal.__dict__.items()): if name[:3]=='SIG' and '_' not in name: _exitcode_to_name[-signum] = f'-{name}' +del name, signum # For debug and leak testing _dangling = WeakSet() diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index ef335c69421f5..d4a8a680286c1 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -192,6 +192,7 @@ def is_python_build(check_home=False): scheme['headers'] = scheme['include'] scheme['include'] = '{srcdir}/Include' scheme['platinclude'] = '{projectbase}/.' + del scheme def _subst_vars(s, local_vars): diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 76fa6f7e2dab8..a553431bdccfb 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -108,7 +108,7 @@ def istest(self, predicate, exp): self.assertFalse(other(obj), 'not %s(%s)' % (other.__name__, exp)) def test__all__(self): - support.check__all__(self, inspect, not_exported=("k", "v", "mod_dict", "modulesbyfile")) + support.check__all__(self, inspect, not_exported=("modulesbyfile",)) def generator_function_example(self): for i in range(2): diff --git a/Lib/tokenize.py b/Lib/tokenize.py index 0b9e238310049..46d2224f5cc08 100644 --- a/Lib/tokenize.py +++ b/Lib/tokenize.py @@ -143,6 +143,7 @@ def _compile(expr): endpats[_prefix + '"'] = Double endpats[_prefix + "'''"] = Single3 endpats[_prefix + '"""'] = Double3 +del _prefix # A set of all of the single and triple quoted string prefixes, # including the opening quotes. @@ -153,6 +154,7 @@ def _compile(expr): single_quoted.add(u) for u in (t + '"""', t + "'''"): triple_quoted.add(u) +del t, u tabsize = 8 diff --git a/Misc/NEWS.d/next/Library/2022-01-28-19-48-31.bpo-46565.bpZXO4.rst b/Misc/NEWS.d/next/Library/2022-01-28-19-48-31.bpo-46565.bpZXO4.rst new file mode 100644 index 0000000000000..9b0969ea5897b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-28-19-48-31.bpo-46565.bpZXO4.rst @@ -0,0 +1 @@ +Remove loop variables that are leaking into modules' namespaces. From webhook-mailer at python.org Thu Feb 3 04:25:27 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Thu, 03 Feb 2022 09:25:27 -0000 Subject: [Python-checkins] bpo-46483: Remove `__class_getitem__` from `pathlib.PurePath` (GH-30848) Message-ID: https://github.com/python/cpython/commit/7ffe7ba30fc051014977c6f393c51e57e71a6648 commit: 7ffe7ba30fc051014977c6f393c51e57e71a6648 branch: main author: Nikita Sobolev committer: serhiy-storchaka date: 2022-02-03T11:25:10+02:00 summary: bpo-46483: Remove `__class_getitem__` from `pathlib.PurePath` (GH-30848) Co-authored-by: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2022-01-24-13-00-09.bpo-46483.9XnmKp.rst D Misc/NEWS.d/next/Library/2022-01-23-11-17-48.bpo-46483.j7qwWb.rst M Doc/whatsnew/3.11.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 33f39e5775269..acb21d3ccaf17 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -545,6 +545,9 @@ Removed Python 3.4 but has been broken since Python 3.7. (Contributed by Inada Naoki in :issue:`23882`.) +* Remove ``__class_getitem__`` method from :class:`pathlib.PurePath`, + because it was not used and added by mistake in previous versions. + (Contributed by Nikita Sobolev in :issue:`46483`.) Porting to Python 3.11 ====================== diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 920e1f425a0c0..7f4210e2b80c9 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -12,7 +12,6 @@ from operator import attrgetter from stat import S_ISDIR, S_ISLNK, S_ISREG, S_ISSOCK, S_ISBLK, S_ISCHR, S_ISFIFO from urllib.parse import quote_from_bytes as urlquote_from_bytes -from types import GenericAlias __all__ = [ @@ -604,8 +603,6 @@ def __ge__(self, other): return NotImplemented return self._cparts >= other._cparts - __class_getitem__ = classmethod(GenericAlias) - drive = property(attrgetter('_drv'), doc="""The drive prefix (letter or UNC path), if any.""") diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 5e46b4ffeae10..ec2baca18fd81 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -2450,15 +2450,6 @@ def test_complex_symlinks_relative(self): def test_complex_symlinks_relative_dot_dot(self): self._check_complex_symlinks(os.path.join('dirA', '..')) - def test_class_getitem(self): - from types import GenericAlias - - alias = self.cls[str] - self.assertIsInstance(alias, GenericAlias) - self.assertIs(alias.__origin__, self.cls) - self.assertEqual(alias.__args__, (str,)) - self.assertEqual(alias.__parameters__, ()) - class PathTest(_BasePathTest, unittest.TestCase): cls = pathlib.Path diff --git a/Misc/NEWS.d/next/Library/2022-01-23-11-17-48.bpo-46483.j7qwWb.rst b/Misc/NEWS.d/next/Library/2022-01-23-11-17-48.bpo-46483.j7qwWb.rst deleted file mode 100644 index a84503d299a10..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-23-11-17-48.bpo-46483.j7qwWb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Change :meth:`pathlib.PurePath.__class_getitem__` to return -:class:`types.GenericAlias`. diff --git a/Misc/NEWS.d/next/Library/2022-01-24-13-00-09.bpo-46483.9XnmKp.rst b/Misc/NEWS.d/next/Library/2022-01-24-13-00-09.bpo-46483.9XnmKp.rst new file mode 100644 index 0000000000000..89cc818a9c59d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-24-13-00-09.bpo-46483.9XnmKp.rst @@ -0,0 +1 @@ +Remove :meth:`~object.__class_getitem__` from :class:`pathlib.PurePath` as this class was not supposed to be generic. From webhook-mailer at python.org Thu Feb 3 04:43:46 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Thu, 03 Feb 2022 09:43:46 -0000 Subject: [Python-checkins] bpo-44977: Deprecate delegation of int to __trunc__ (GH-31031) Message-ID: https://github.com/python/cpython/commit/b4bd1e1422997de61faf506b4916e83013bc7d21 commit: b4bd1e1422997de61faf506b4916e83013bc7d21 branch: main author: Zackery Spytz committer: serhiy-storchaka date: 2022-02-03T11:43:25+02:00 summary: bpo-44977: Deprecate delegation of int to __trunc__ (GH-31031) Calling int(a) when type(a) implements __trunc__ but not __int__ or __index__ now raises a DeprecationWarning. files: A Misc/NEWS.d/next/Core and Builtins/2022-01-30-18-23-08.bpo-44977.BQV_zS.rst M Doc/library/functions.rst M Doc/reference/datamodel.rst M Doc/whatsnew/3.11.rst M Lib/test/test_descr.py M Lib/test/test_int.py M Lib/test/test_long.py M Objects/abstract.c diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 9c061bcd8252a..eaa4d482ce3fc 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -891,6 +891,9 @@ are always available. They are listed here in alphabetical order. .. versionchanged:: 3.8 Falls back to :meth:`__index__` if :meth:`__int__` is not defined. + .. versionchanged:: 3.11 + The delegation to :meth:`__trunc__` is deprecated. + .. function:: isinstance(object, classinfo) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 48c54d729424c..a773b73ce3243 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2760,6 +2760,9 @@ left undefined. The built-in function :func:`int` falls back to :meth:`__trunc__` if neither :meth:`__int__` nor :meth:`__index__` is defined. + .. versionchanged:: 3.11 + The delegation of :func:`int` to :meth:`__trunc__` is deprecated. + .. _context-managers: diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index acb21d3ccaf17..18d4652fb4293 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -458,6 +458,11 @@ Deprecated as deprecated, its docstring is now corrected). (Contributed by Hugo van Kemenade in :issue:`45837`.) +* The delegation of :func:`int` to :meth:`__trunc__` is now deprecated. Calling + ``int(a)`` when ``type(a)`` implements :meth:`__trunc__` but not + :meth:`__int__` or :meth:`__index__` now raises a :exc:`DeprecationWarning`. + (Contributed by Zackery Spytz in :issue:`44977`.) + * The following have been deprecated in :mod:`configparser` since Python 3.2. Their deprecation warnings have now been updated to note they will removed in Python 3.12: @@ -468,6 +473,7 @@ Deprecated (Contributed by Hugo van Kemenade in :issue:`45173`.) + Removed ======= diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 791cf714d46a3..a0942d6a85b81 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -2061,7 +2061,6 @@ def format_impl(self, spec): ("__format__", format, format_impl, set(), {}), ("__floor__", math.floor, zero, set(), {}), ("__trunc__", math.trunc, zero, set(), {}), - ("__trunc__", int, zero, set(), {}), ("__ceil__", math.ceil, zero, set(), {}), ("__dir__", dir, empty_seq, set(), {}), ("__round__", round, zero, set(), {}), diff --git a/Lib/test/test_int.py b/Lib/test/test_int.py index d6be64e7c18a0..a72699cc7506a 100644 --- a/Lib/test/test_int.py +++ b/Lib/test/test_int.py @@ -369,12 +369,14 @@ def __trunc__(self): class JustTrunc(base): def __trunc__(self): return 42 - self.assertEqual(int(JustTrunc()), 42) + with self.assertWarns(DeprecationWarning): + self.assertEqual(int(JustTrunc()), 42) class ExceptionalTrunc(base): def __trunc__(self): 1 / 0 - with self.assertRaises(ZeroDivisionError): + with self.assertRaises(ZeroDivisionError), \ + self.assertWarns(DeprecationWarning): int(ExceptionalTrunc()) for trunc_result_base in (object, Classic): @@ -385,7 +387,8 @@ def __index__(self): class TruncReturnsNonInt(base): def __trunc__(self): return Index() - self.assertEqual(int(TruncReturnsNonInt()), 42) + with self.assertWarns(DeprecationWarning): + self.assertEqual(int(TruncReturnsNonInt()), 42) class Intable(trunc_result_base): def __int__(self): @@ -394,7 +397,8 @@ def __int__(self): class TruncReturnsNonIndex(base): def __trunc__(self): return Intable() - self.assertEqual(int(TruncReturnsNonInt()), 42) + with self.assertWarns(DeprecationWarning): + self.assertEqual(int(TruncReturnsNonInt()), 42) class NonIntegral(trunc_result_base): def __trunc__(self): @@ -405,7 +409,8 @@ class TruncReturnsNonIntegral(base): def __trunc__(self): return NonIntegral() try: - int(TruncReturnsNonIntegral()) + with self.assertWarns(DeprecationWarning): + int(TruncReturnsNonIntegral()) except TypeError as e: self.assertEqual(str(e), "__trunc__ returned non-Integral" @@ -423,7 +428,8 @@ class TruncReturnsBadInt(base): def __trunc__(self): return BadInt() - with self.assertRaises(TypeError): + with self.assertRaises(TypeError), \ + self.assertWarns(DeprecationWarning): int(TruncReturnsBadInt()) def test_int_subclass_with_index(self): @@ -517,13 +523,16 @@ def __trunc__(self): self.assertIs(type(n), int) bad_int = TruncReturnsBadInt() - self.assertRaises(TypeError, int, bad_int) + with self.assertWarns(DeprecationWarning): + self.assertRaises(TypeError, int, bad_int) good_int = TruncReturnsIntSubclass() - n = int(good_int) + with self.assertWarns(DeprecationWarning): + n = int(good_int) self.assertEqual(n, 1) self.assertIs(type(n), int) - n = IntSubclass(good_int) + with self.assertWarns(DeprecationWarning): + n = IntSubclass(good_int) self.assertEqual(n, 1) self.assertIs(type(n), IntSubclass) diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py index c7dd0b274d1e3..e68dfb4c542ea 100644 --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -392,7 +392,8 @@ def __long__(self): return 42 def __trunc__(self): return 1729 - self.assertEqual(int(LongTrunc()), 1729) + with self.assertWarns(DeprecationWarning): + self.assertEqual(int(LongTrunc()), 1729) def check_float_conversion(self, n): # Check that int -> float conversion behaviour matches diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-30-18-23-08.bpo-44977.BQV_zS.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-30-18-23-08.bpo-44977.BQV_zS.rst new file mode 100644 index 0000000000000..84c1191bdbd31 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-01-30-18-23-08.bpo-44977.BQV_zS.rst @@ -0,0 +1,3 @@ +The delegation of :func:`int` to :meth:`__trunc__` is now deprecated. +Calling ``int(a)`` when ``type(a)`` implements :meth:`__trunc__` but not +:meth:`__int__` or :meth:`__index__` now raises a :exc:`DeprecationWarning`. diff --git a/Objects/abstract.c b/Objects/abstract.c index 6a2d5eda14079..ed99fd6c5aafb 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -1564,6 +1564,11 @@ PyNumber_Long(PyObject *o) } trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__); if (trunc_func) { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "The delegation of int() to __trunc__ is deprecated.", 1)) { + Py_DECREF(trunc_func); + return NULL; + } result = _PyObject_CallNoArgs(trunc_func); Py_DECREF(trunc_func); if (result == NULL || PyLong_CheckExact(result)) { From webhook-mailer at python.org Thu Feb 3 05:14:48 2022 From: webhook-mailer at python.org (markshannon) Date: Thu, 03 Feb 2022 10:14:48 -0000 Subject: [Python-checkins] bpo-45773: Remove invalid peephole optimizations (GH-31066) Message-ID: https://github.com/python/cpython/commit/e0433c1e70254d4d0357a9e14596929a04bdf769 commit: e0433c1e70254d4d0357a9e14596929a04bdf769 branch: main author: Brandt Bucher committer: markshannon date: 2022-02-03T10:14:44Z summary: bpo-45773: Remove invalid peephole optimizations (GH-31066) files: A Misc/NEWS.d/next/Core and Builtins/2022-02-01-14-30-56.bpo-45773.Up77LD.rst M Python/compile.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-01-14-30-56.bpo-45773.Up77LD.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-01-14-30-56.bpo-45773.Up77LD.rst new file mode 100644 index 0000000000000..45da5116fc940 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-02-01-14-30-56.bpo-45773.Up77LD.rst @@ -0,0 +1 @@ +Remove two invalid "peephole" optimizations from the bytecode compiler. diff --git a/Python/compile.c b/Python/compile.c index 1d2d567e85e93..cecd6a5c42660 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -8757,7 +8757,6 @@ optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts) switch (target->i_opcode) { case JUMP_ABSOLUTE: case JUMP_FORWARD: - case JUMP_IF_FALSE_OR_POP: i -= jump_thread(inst, target, POP_JUMP_IF_FALSE); } break; @@ -8765,7 +8764,6 @@ optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts) switch (target->i_opcode) { case JUMP_ABSOLUTE: case JUMP_FORWARD: - case JUMP_IF_TRUE_OR_POP: i -= jump_thread(inst, target, POP_JUMP_IF_TRUE); } break; From webhook-mailer at python.org Thu Feb 3 08:33:05 2022 From: webhook-mailer at python.org (markshannon) Date: Thu, 03 Feb 2022 13:33:05 -0000 Subject: [Python-checkins] bpo-45885: Add more stats for COMPARE_OP in specialize.c (GH-31040) Message-ID: https://github.com/python/cpython/commit/674ab66ebdf06f187e193a3d7bde13b71ba0f9af commit: 674ab66ebdf06f187e193a3d7bde13b71ba0f9af branch: main author: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> committer: markshannon date: 2022-02-03T13:32:52Z summary: bpo-45885: Add more stats for COMPARE_OP in specialize.c (GH-31040) files: A Misc/NEWS.d/next/Core and Builtins/2022-02-01-01-17-28.bpo-45885.CjyNf_.rst M Python/specialize.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-01-01-17-28.bpo-45885.CjyNf_.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-01-01-17-28.bpo-45885.CjyNf_.rst new file mode 100644 index 0000000000000..6395bd1f18d5e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-02-01-01-17-28.bpo-45885.CjyNf_.rst @@ -0,0 +1 @@ +Added more fined-grained specialization failure stats regarding the ``COMPARE_OP`` bytecode. \ No newline at end of file diff --git a/Python/specialize.c b/Python/specialize.c index d90d7da8f3072..214f29751f388 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -547,6 +547,14 @@ initial_counter_value(void) { #define SPEC_FAIL_STRING_COMPARE 13 #define SPEC_FAIL_NOT_FOLLOWED_BY_COND_JUMP 14 #define SPEC_FAIL_BIG_INT 15 +#define SPEC_FAIL_COMPARE_BYTES 16 +#define SPEC_FAIL_COMPARE_TUPLE 17 +#define SPEC_FAIL_COMPARE_LIST 18 +#define SPEC_FAIL_COMPARE_SET 19 +#define SPEC_FAIL_COMPARE_BOOL 20 +#define SPEC_FAIL_COMPARE_BASEOBJECT 21 +#define SPEC_FAIL_COMPARE_FLOAT_LONG 22 +#define SPEC_FAIL_COMPARE_LONG_FLOAT 23 /* FOR_ITER */ #define SPEC_FAIL_ITER_GENERATOR 10 @@ -1764,6 +1772,43 @@ _Py_Specialize_BinaryOp(PyObject *lhs, PyObject *rhs, _Py_CODEUNIT *instr, adaptive->counter = initial_counter_value(); } + +#ifdef Py_STATS +static int +compare_op_fail_kind(PyObject *lhs, PyObject *rhs) +{ + if (Py_TYPE(lhs) != Py_TYPE(rhs)) { + if (PyFloat_CheckExact(lhs) && PyLong_CheckExact(rhs)) { + return SPEC_FAIL_COMPARE_FLOAT_LONG; + } + if (PyLong_CheckExact(lhs) && PyFloat_CheckExact(rhs)) { + return SPEC_FAIL_COMPARE_LONG_FLOAT; + } + return SPEC_FAIL_DIFFERENT_TYPES; + } + if (PyBytes_CheckExact(lhs)) { + return SPEC_FAIL_COMPARE_BYTES; + } + if (PyTuple_CheckExact(lhs)) { + return SPEC_FAIL_COMPARE_TUPLE; + } + if (PyList_CheckExact(lhs)) { + return SPEC_FAIL_COMPARE_LIST; + } + if (PySet_CheckExact(lhs) || PyFrozenSet_CheckExact(lhs)) { + return SPEC_FAIL_COMPARE_SET; + } + if (PyBool_Check(lhs)) { + return SPEC_FAIL_COMPARE_BOOL; + } + if (Py_TYPE(lhs)->tp_richcompare == PyBaseObject_Type.tp_richcompare) { + return SPEC_FAIL_COMPARE_BASEOBJECT; + } + return SPEC_FAIL_OTHER; +} +#endif + + static int compare_masks[] = { // 1-bit: jump if less than // 2-bit: jump if equal @@ -1795,7 +1840,7 @@ _Py_Specialize_CompareOp(PyObject *lhs, PyObject *rhs, when_to_jump_mask = (1 | 2 | 4) & ~when_to_jump_mask; } if (Py_TYPE(lhs) != Py_TYPE(rhs)) { - SPECIALIZATION_FAIL(COMPARE_OP, SPEC_FAIL_DIFFERENT_TYPES); + SPECIALIZATION_FAIL(COMPARE_OP, compare_op_fail_kind(lhs, rhs)); goto failure; } if (PyFloat_CheckExact(lhs)) { @@ -1825,7 +1870,7 @@ _Py_Specialize_CompareOp(PyObject *lhs, PyObject *rhs, goto success; } } - SPECIALIZATION_FAIL(COMPARE_OP, SPEC_FAIL_OTHER); + SPECIALIZATION_FAIL(COMPARE_OP, compare_op_fail_kind(lhs, rhs)); failure: STAT_INC(COMPARE_OP, failure); cache_backoff(adaptive); From webhook-mailer at python.org Thu Feb 3 08:48:22 2022 From: webhook-mailer at python.org (rhettinger) Date: Thu, 03 Feb 2022 13:48:22 -0000 Subject: [Python-checkins] bpo-46624: Defer to 3.12: "Remove deprecated support for non-integer values" (GH-31098) Message-ID: https://github.com/python/cpython/commit/6baa98e538b2e26f16eaaf462f99496e98d2cfb1 commit: 6baa98e538b2e26f16eaaf462f99496e98d2cfb1 branch: main author: Miro Hron?ok committer: rhettinger date: 2022-02-03T07:48:13-06:00 summary: bpo-46624: Defer to 3.12: "Remove deprecated support for non-integer values" (GH-31098) files: A Misc/NEWS.d/next/Library/2022-02-03-12-07-41.bpo-46624.f_Qqh0.rst M Doc/library/random.rst M Lib/random.py M Lib/test/test_random.py diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 36f232dc319e4..da4a4f61e4567 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -135,10 +135,15 @@ Functions for integers values. Formerly it used a style like ``int(random()*n)`` which could produce slightly uneven distributions. - .. versionchanged:: 3.11 - Automatic conversion of non-integer types is no longer supported. - Calls such as ``randrange(10.0)`` and ``randrange(Fraction(10, 1))`` - now raise a :exc:`TypeError`. + .. deprecated:: 3.10 + The automatic conversion of non-integer types to equivalent integers is + deprecated. Currently ``randrange(10.0)`` is losslessly converted to + ``randrange(10)``. In the future, this will raise a :exc:`TypeError`. + + .. deprecated:: 3.10 + The exception raised for non-integral values such as ``randrange(10.5)`` + or ``randrange('10')`` will be changed from :exc:`ValueError` to + :exc:`TypeError`. .. function:: randint(a, b) diff --git a/Lib/random.py b/Lib/random.py index e8bc9416fcd94..6d7b617e33a30 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -282,17 +282,27 @@ def randbytes(self, n): ## -------------------- integer methods ------------------- def randrange(self, start, stop=None, step=_ONE): - """Choose a random item from range(stop) or range(start, stop[, step]). + """Choose a random item from range(start, stop[, step]). - Roughly equivalent to ``choice(range(start, stop, step))`` - but supports arbitrarily large ranges and is optimized - for common cases. + This fixes the problem with randint() which includes the + endpoint; in Python this is usually not what you want. """ # This code is a bit messy to make it fast for the # common case while still doing adequate error checking. - istart = _index(start) + try: + istart = _index(start) + except TypeError: + istart = int(start) + if istart != start: + _warn('randrange() will raise TypeError in the future', + DeprecationWarning, 2) + raise ValueError("non-integer arg 1 for randrange()") + _warn('non-integer arguments to randrange() have been deprecated ' + 'since Python 3.10 and will be removed in a subsequent ' + 'version', + DeprecationWarning, 2) if stop is None: # We don't check for "step != 1" because it hasn't been # type checked and converted to an integer yet. @@ -302,15 +312,37 @@ def randrange(self, start, stop=None, step=_ONE): return self._randbelow(istart) raise ValueError("empty range for randrange()") - # Stop argument supplied. - istop = _index(stop) + # stop argument supplied. + try: + istop = _index(stop) + except TypeError: + istop = int(stop) + if istop != stop: + _warn('randrange() will raise TypeError in the future', + DeprecationWarning, 2) + raise ValueError("non-integer stop for randrange()") + _warn('non-integer arguments to randrange() have been deprecated ' + 'since Python 3.10 and will be removed in a subsequent ' + 'version', + DeprecationWarning, 2) width = istop - istart - istep = _index(step) + try: + istep = _index(step) + except TypeError: + istep = int(step) + if istep != step: + _warn('randrange() will raise TypeError in the future', + DeprecationWarning, 2) + raise ValueError("non-integer step for randrange()") + _warn('non-integer arguments to randrange() have been deprecated ' + 'since Python 3.10 and will be removed in a subsequent ' + 'version', + DeprecationWarning, 2) # Fast path. if istep == 1: if width > 0: return istart + self._randbelow(width) - raise ValueError(f"empty range in randrange({start}, {stop}, {step})") + raise ValueError("empty range for randrange() (%d, %d, %d)" % (istart, istop, width)) # Non-unit step argument supplied. if istep > 0: @@ -320,7 +352,7 @@ def randrange(self, start, stop=None, step=_ONE): else: raise ValueError("zero step for randrange()") if n <= 0: - raise ValueError(f"empty range in randrange({start}, {stop}, {step})") + raise ValueError("empty range for randrange()") return istart + istep * self._randbelow(n) def randint(self, a, b): diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index f980c5b8df0d2..5b066d23dd3fd 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -481,44 +481,50 @@ def test_randrange_nonunit_step(self): self.assertEqual(rint, 0) def test_randrange_errors(self): - raises_value_error = partial(self.assertRaises, ValueError, self.gen.randrange) - raises_type_error = partial(self.assertRaises, TypeError, self.gen.randrange) - + raises = partial(self.assertRaises, ValueError, self.gen.randrange) # Empty range - raises_value_error(3, 3) - raises_value_error(-721) - raises_value_error(0, 100, -12) - - # Zero step - raises_value_error(0, 42, 0) - raises_type_error(0, 42, 0.0) - raises_type_error(0, 0, 0.0) - - # Non-integer stop - raises_type_error(3.14159) - raises_type_error(3.0) - raises_type_error(Fraction(3, 1)) - raises_type_error('3') - raises_type_error(0, 2.71827) - raises_type_error(0, 2.0) - raises_type_error(0, Fraction(2, 1)) - raises_type_error(0, '2') - raises_type_error(0, 2.71827, 2) - - # Non-integer start - raises_type_error(2.71827, 5) - raises_type_error(2.0, 5) - raises_type_error(Fraction(2, 1), 5) - raises_type_error('2', 5) - raises_type_error(2.71827, 5, 2) - - # Non-integer step - raises_type_error(0, 42, 3.14159) - raises_type_error(0, 42, 3.0) - raises_type_error(0, 42, Fraction(3, 1)) - raises_type_error(0, 42, '3') - raises_type_error(0, 42, 1.0) - raises_type_error(0, 0, 1.0) + raises(3, 3) + raises(-721) + raises(0, 100, -12) + # Non-integer start/stop + self.assertWarns(DeprecationWarning, raises, 3.14159) + self.assertWarns(DeprecationWarning, self.gen.randrange, 3.0) + self.assertWarns(DeprecationWarning, self.gen.randrange, Fraction(3, 1)) + self.assertWarns(DeprecationWarning, raises, '3') + self.assertWarns(DeprecationWarning, raises, 0, 2.71828) + self.assertWarns(DeprecationWarning, self.gen.randrange, 0, 2.0) + self.assertWarns(DeprecationWarning, self.gen.randrange, 0, Fraction(2, 1)) + self.assertWarns(DeprecationWarning, raises, 0, '2') + # Zero and non-integer step + raises(0, 42, 0) + self.assertWarns(DeprecationWarning, raises, 0, 42, 0.0) + self.assertWarns(DeprecationWarning, raises, 0, 0, 0.0) + self.assertWarns(DeprecationWarning, raises, 0, 42, 3.14159) + self.assertWarns(DeprecationWarning, self.gen.randrange, 0, 42, 3.0) + self.assertWarns(DeprecationWarning, self.gen.randrange, 0, 42, Fraction(3, 1)) + self.assertWarns(DeprecationWarning, raises, 0, 42, '3') + self.assertWarns(DeprecationWarning, self.gen.randrange, 0, 42, 1.0) + self.assertWarns(DeprecationWarning, raises, 0, 0, 1.0) + + def test_randrange_argument_handling(self): + randrange = self.gen.randrange + with self.assertWarns(DeprecationWarning): + randrange(10.0, 20, 2) + with self.assertWarns(DeprecationWarning): + randrange(10, 20.0, 2) + with self.assertWarns(DeprecationWarning): + randrange(10, 20, 1.0) + with self.assertWarns(DeprecationWarning): + randrange(10, 20, 2.0) + with self.assertWarns(DeprecationWarning): + with self.assertRaises(ValueError): + randrange(10.5) + with self.assertWarns(DeprecationWarning): + with self.assertRaises(ValueError): + randrange(10, 20.5) + with self.assertWarns(DeprecationWarning): + with self.assertRaises(ValueError): + randrange(10, 20, 1.5) def test_randrange_step(self): # bpo-42772: When stop is None, the step argument was being ignored. diff --git a/Misc/NEWS.d/next/Library/2022-02-03-12-07-41.bpo-46624.f_Qqh0.rst b/Misc/NEWS.d/next/Library/2022-02-03-12-07-41.bpo-46624.f_Qqh0.rst new file mode 100644 index 0000000000000..b0203b9a8b50c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-02-03-12-07-41.bpo-46624.f_Qqh0.rst @@ -0,0 +1 @@ +Restore support for non-integer arguments of :func:`random.randrange` and :func:`random.randint`. From webhook-mailer at python.org Thu Feb 3 10:22:54 2022 From: webhook-mailer at python.org (ethanfurman) Date: Thu, 03 Feb 2022 15:22:54 -0000 Subject: [Python-checkins] bpo-46569: [Enum] fix typo in `StrEnum` docs (GH-31007) Message-ID: https://github.com/python/cpython/commit/734b1f119be6f0dcd6845c78a9e0a71d88a90b59 commit: 734b1f119be6f0dcd6845c78a9e0a71d88a90b59 branch: main author: Nikita Sobolev committer: ethanfurman date: 2022-02-03T07:22:41-08:00 summary: bpo-46569: [Enum] fix typo in `StrEnum` docs (GH-31007) files: M Doc/library/enum.rst diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index a37c9d4506241..672e256c77c0d 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -420,7 +420,7 @@ Data Types .. note:: :meth:`__str__` is :func:`str.__str__` to better support the *replacement of existing constants* use-case. :meth:`__format__` is likewise - :func:`int.__format__` for that same reason. + :func:`str.__format__` for that same reason. .. versionadded:: 3.11 From webhook-mailer at python.org Thu Feb 3 10:51:14 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 03 Feb 2022 15:51:14 -0000 Subject: [Python-checkins] bpo-46436: Fix command-line option -d/--directory in module http.server (GH-30701) Message-ID: https://github.com/python/cpython/commit/2d080347d74078a55c47715d232d1ab8dc8cd603 commit: 2d080347d74078a55c47715d232d1ab8dc8cd603 branch: main author: G?ry Ogam committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-03T07:51:05-08:00 summary: bpo-46436: Fix command-line option -d/--directory in module http.server (GH-30701) Fix command-line option -d/--directory in http.server main function that was ignored when combined with --cgi. Automerge-Triggered-By: GH:merwok files: A Misc/NEWS.d/next/Library/2022-01-23-19-37-00.bpo-46436.Biz1p9.rst M Lib/http/server.py diff --git a/Lib/http/server.py b/Lib/http/server.py index 4f9b8a16d45fe..194a503c45f75 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -103,8 +103,6 @@ import sys import time import urllib.parse -import contextlib -from functools import partial from http import HTTPStatus @@ -1239,7 +1237,6 @@ def test(HandlerClass=BaseHTTPRequestHandler, """ ServerClass.address_family, addr = _get_best_family(bind, port) - HandlerClass.protocol_version = protocol with ServerClass(addr, HandlerClass) as httpd: host, port = httpd.socket.getsockname()[:2] @@ -1256,29 +1253,29 @@ def test(HandlerClass=BaseHTTPRequestHandler, if __name__ == '__main__': import argparse + import contextlib parser = argparse.ArgumentParser() parser.add_argument('--cgi', action='store_true', - help='Run as CGI Server') + help='run as CGI server') parser.add_argument('--bind', '-b', metavar='ADDRESS', - help='Specify alternate bind address ' - '[default: all interfaces]') + help='specify alternate bind address ' + '(default: all interfaces)') parser.add_argument('--directory', '-d', default=os.getcwd(), - help='Specify alternative directory ' - '[default:current directory]') - parser.add_argument('port', action='store', - default=8000, type=int, + help='specify alternate directory ' + '(default: current directory)') + parser.add_argument('port', action='store', default=8000, type=int, nargs='?', - help='Specify alternate port [default: 8000]') + help='specify alternate port (default: 8000)') args = parser.parse_args() if args.cgi: handler_class = CGIHTTPRequestHandler else: - handler_class = partial(SimpleHTTPRequestHandler, - directory=args.directory) + handler_class = SimpleHTTPRequestHandler # ensure dual-stack is not disabled; ref #38907 class DualStackServer(ThreadingHTTPServer): + def server_bind(self): # suppress exception when protocol is IPv4 with contextlib.suppress(Exception): @@ -1286,6 +1283,10 @@ def server_bind(self): socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) return super().server_bind() + def finish_request(self, request, client_address): + self.RequestHandlerClass(request, client_address, self, + directory=args.directory) + test( HandlerClass=handler_class, ServerClass=DualStackServer, diff --git a/Misc/NEWS.d/next/Library/2022-01-23-19-37-00.bpo-46436.Biz1p9.rst b/Misc/NEWS.d/next/Library/2022-01-23-19-37-00.bpo-46436.Biz1p9.rst new file mode 100644 index 0000000000000..ccfd949506443 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-23-19-37-00.bpo-46436.Biz1p9.rst @@ -0,0 +1,3 @@ +Fix command-line option ``-d``/``--directory`` in module :mod:`http.server` +which is ignored when combined with command-line option ``--cgi``. Patch by +G?ry Ogam. From webhook-mailer at python.org Thu Feb 3 10:55:00 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 03 Feb 2022 15:55:00 -0000 Subject: [Python-checkins] bpo-45773: Remove invalid peephole optimizations (GH-31066) Message-ID: https://github.com/python/cpython/commit/ff6948b1286c854ee77dfc0b23b9d828b36873e4 commit: ff6948b1286c854ee77dfc0b23b9d828b36873e4 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-03T07:54:51-08:00 summary: bpo-45773: Remove invalid peephole optimizations (GH-31066) (cherry picked from commit e0433c1e70254d4d0357a9e14596929a04bdf769) Co-authored-by: Brandt Bucher files: A Misc/NEWS.d/next/Core and Builtins/2022-02-01-14-30-56.bpo-45773.Up77LD.rst M Python/compile.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-01-14-30-56.bpo-45773.Up77LD.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-01-14-30-56.bpo-45773.Up77LD.rst new file mode 100644 index 0000000000000..45da5116fc940 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-02-01-14-30-56.bpo-45773.Up77LD.rst @@ -0,0 +1 @@ +Remove two invalid "peephole" optimizations from the bytecode compiler. diff --git a/Python/compile.c b/Python/compile.c index 3eb34d89cc55f..a7f62bbcbb33e 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -7449,7 +7449,6 @@ optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts) switch (target->i_opcode) { case JUMP_ABSOLUTE: case JUMP_FORWARD: - case JUMP_IF_FALSE_OR_POP: i -= jump_thread(inst, target, POP_JUMP_IF_FALSE); } break; @@ -7457,7 +7456,6 @@ optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts) switch (target->i_opcode) { case JUMP_ABSOLUTE: case JUMP_FORWARD: - case JUMP_IF_TRUE_OR_POP: i -= jump_thread(inst, target, POP_JUMP_IF_TRUE); } break; From webhook-mailer at python.org Thu Feb 3 13:37:00 2022 From: webhook-mailer at python.org (markshannon) Date: Thu, 03 Feb 2022 18:37:00 -0000 Subject: [Python-checkins] Pass reference to func, as well as args, when pushing frame. (GH-31100) Message-ID: https://github.com/python/cpython/commit/da4d4ec1851714bb56a5e8d0c1cd5bf9842b4cee commit: da4d4ec1851714bb56a5e8d0c1cd5bf9842b4cee branch: main author: Mark Shannon committer: markshannon date: 2022-02-03T18:36:28Z summary: Pass reference to func, as well as args, when pushing frame. (GH-31100) files: M Include/internal/pycore_frame.h M Objects/frameobject.c M Python/ceval.c M Python/frame.c M Python/pystate.c diff --git a/Include/internal/pycore_frame.h b/Include/internal/pycore_frame.h index 85b9cf0f77bcb..1ad156290a55e 100644 --- a/Include/internal/pycore_frame.h +++ b/Include/internal/pycore_frame.h @@ -87,12 +87,12 @@ static inline void _PyFrame_StackPush(InterpreterFrame *f, PyObject *value) { void _PyFrame_Copy(InterpreterFrame *src, InterpreterFrame *dest); +/* Consumes reference to func */ static inline void _PyFrame_InitializeSpecials( InterpreterFrame *frame, PyFunctionObject *func, PyObject *locals, int nlocalsplus) { - Py_INCREF(func); frame->f_func = func; frame->f_code = (PyCodeObject *)Py_NewRef(func->func_code); frame->f_builtins = func->func_builtins; @@ -166,9 +166,6 @@ _PyFrame_FastToLocalsWithError(InterpreterFrame *frame); void _PyFrame_LocalsToFast(InterpreterFrame *frame, int clear); -InterpreterFrame *_PyThreadState_PushFrame( - PyThreadState *tstate, PyFunctionObject *func, PyObject *locals); - extern InterpreterFrame * _PyThreadState_BumpFramePointerSlow(PyThreadState *tstate, size_t size); @@ -189,6 +186,7 @@ _PyThreadState_BumpFramePointer(PyThreadState *tstate, size_t size) void _PyThreadState_PopFrame(PyThreadState *tstate, InterpreterFrame *frame); +/* Consume reference to func */ InterpreterFrame * _PyFrame_Push(PyThreadState *tstate, PyFunctionObject *func); diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 15da1325d1480..78f3894111bc3 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -784,6 +784,8 @@ _Py_IDENTIFIER(__builtins__); static void init_frame(InterpreterFrame *frame, PyFunctionObject *func, PyObject *locals) { + /* _PyFrame_InitializeSpecials consumes reference to func */ + Py_INCREF(func); PyCodeObject *code = (PyCodeObject *)func->func_code; _PyFrame_InitializeSpecials(frame, func, locals, code->co_nlocalsplus); for (Py_ssize_t i = 0; i < code->co_nlocalsplus; i++) { diff --git a/Python/ceval.c b/Python/ceval.c index 3c52c5824b44a..3197fe8eebb56 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2243,6 +2243,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr goto error; } CALL_STAT_INC(frames_pushed); + Py_INCREF(getitem); _PyFrame_InitializeSpecials(new_frame, getitem, NULL, code->co_nlocalsplus); STACK_SHRINK(2); @@ -4590,7 +4591,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr STACK_SHRINK(call_shape.postcall_shrink); // The frame has stolen all the arguments from the stack, // so there is no need to clean them up. - Py_DECREF(function); if (new_frame == NULL) { goto error; } @@ -4675,7 +4675,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr new_frame->localsplus[i] = NULL; } STACK_SHRINK(call_shape.postcall_shrink); - Py_DECREF(func); _PyFrame_SetStackPointer(frame, stack_pointer); new_frame->previous = frame; frame = cframe.current_frame = new_frame; @@ -4712,7 +4711,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr new_frame->localsplus[i] = NULL; } STACK_SHRINK(call_shape.postcall_shrink); - Py_DECREF(func); _PyFrame_SetStackPointer(frame, stack_pointer); new_frame->previous = frame; frame = cframe.current_frame = new_frame; @@ -6077,7 +6075,7 @@ initialize_locals(PyThreadState *tstate, PyFunctionObject *func, return -1; } -/* Consumes all the references to the args */ +/* Consumes references to func and all the args */ static InterpreterFrame * _PyEvalFramePushAndInit(PyThreadState *tstate, PyFunctionObject *func, PyObject *locals, PyObject* const* args, @@ -6131,7 +6129,9 @@ _PyEval_Vector(PyThreadState *tstate, PyFunctionObject *func, PyObject* const* args, size_t argcount, PyObject *kwnames) { - /* _PyEvalFramePushAndInit consumes all the references to its arguments */ + /* _PyEvalFramePushAndInit consumes the references + * to func and all its arguments */ + Py_INCREF(func); for (size_t i = 0; i < argcount; i++) { Py_INCREF(args[i]); } diff --git a/Python/frame.c b/Python/frame.c index ca7c5f9c94e07..76697cfa08313 100644 --- a/Python/frame.c +++ b/Python/frame.c @@ -109,6 +109,7 @@ _PyFrame_Clear(InterpreterFrame *frame) Py_DECREF(frame->f_code); } +/* Consumes reference to func */ InterpreterFrame * _PyFrame_Push(PyThreadState *tstate, PyFunctionObject *func) { @@ -117,6 +118,7 @@ _PyFrame_Push(PyThreadState *tstate, PyFunctionObject *func) CALL_STAT_INC(frames_pushed); InterpreterFrame *new_frame = _PyThreadState_BumpFramePointer(tstate, size); if (new_frame == NULL) { + Py_DECREF(func); return NULL; } _PyFrame_InitializeSpecials(new_frame, func, NULL, code->co_nlocalsplus); diff --git a/Python/pystate.c b/Python/pystate.c index 77467944e2afb..a85460c15103d 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -2212,26 +2212,6 @@ _PyThreadState_BumpFramePointerSlow(PyThreadState *tstate, size_t size) return (InterpreterFrame *)base; } - -InterpreterFrame * -_PyThreadState_PushFrame(PyThreadState *tstate, PyFunctionObject *func, PyObject *locals) -{ - PyCodeObject *code = (PyCodeObject *)func->func_code; - int nlocalsplus = code->co_nlocalsplus; - size_t size = nlocalsplus + code->co_stacksize + - FRAME_SPECIALS_SIZE; - CALL_STAT_INC(frames_pushed); - InterpreterFrame *frame = _PyThreadState_BumpFramePointer(tstate, size); - if (frame == NULL) { - return NULL; - } - _PyFrame_InitializeSpecials(frame, func, locals, nlocalsplus); - for (int i=0; i < nlocalsplus; i++) { - frame->localsplus[i] = NULL; - } - return frame; -} - void _PyThreadState_PopFrame(PyThreadState *tstate, InterpreterFrame * frame) { From webhook-mailer at python.org Thu Feb 3 13:41:00 2022 From: webhook-mailer at python.org (markshannon) Date: Thu, 03 Feb 2022 18:41:00 -0000 Subject: [Python-checkins] Collect stats for UNPACK_SEQUENCE. (GH-31105) Message-ID: https://github.com/python/cpython/commit/a0401d83720d93cd95ddf25f86874bfbee528722 commit: a0401d83720d93cd95ddf25f86874bfbee528722 branch: main author: Mark Shannon committer: markshannon date: 2022-02-03T18:40:56Z summary: Collect stats for UNPACK_SEQUENCE. (GH-31105) files: M Python/ceval.c M Python/specialize.c diff --git a/Python/ceval.c b/Python/ceval.c index 3197fe8eebb56..b4029d1081dcb 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2792,6 +2792,12 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr TARGET(UNPACK_SEQUENCE) { PREDICTED(UNPACK_SEQUENCE); PyObject *seq = POP(), *item, **items; +#ifdef Py_STATS + extern int _PySpecialization_ClassifySequence(PyObject *); + _py_stats.opcode_stats[UNPACK_SEQUENCE].specialization.failure++; + _py_stats.opcode_stats[UNPACK_SEQUENCE].specialization. + failure_kinds[_PySpecialization_ClassifySequence(seq)]++; +#endif if (PyTuple_CheckExact(seq) && PyTuple_GET_SIZE(seq) == oparg) { items = ((PyTupleObject *)seq)->ob_item; diff --git a/Python/specialize.c b/Python/specialize.c index 214f29751f388..4070d6a6a0be4 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -572,6 +572,10 @@ initial_counter_value(void) { #define SPEC_FAIL_ITER_DICT_VALUES 22 #define SPEC_FAIL_ITER_ENUMERATE 23 +/* UNPACK_SEQUENCE */ +#define SPEC_FAIL_TUPLE 10 +#define SPEC_FAIL_LIST 11 + static int specialize_module_load_attr( @@ -1880,7 +1884,6 @@ _Py_Specialize_CompareOp(PyObject *lhs, PyObject *rhs, adaptive->counter = initial_counter_value(); } - int _PySpecialization_ClassifyIterator(PyObject *iter) { @@ -1930,3 +1933,15 @@ int } return SPEC_FAIL_OTHER; } + +int +_PySpecialization_ClassifySequence(PyObject *seq) +{ + if (PyTuple_CheckExact(seq)) { + return SPEC_FAIL_TUPLE; + } + if (PyList_CheckExact(seq)) { + return SPEC_FAIL_LIST; + } + return SPEC_FAIL_OTHER; +} From webhook-mailer at python.org Thu Feb 3 13:46:59 2022 From: webhook-mailer at python.org (benjaminp) Date: Thu, 03 Feb 2022 18:46:59 -0000 Subject: [Python-checkins] closes bpo-46626: Expose IP_BIND_ADDRESS_NO_PORT socket option. (GH-31106) Message-ID: https://github.com/python/cpython/commit/1aa6be06c4cb7f04a340adb1c7b16b89803ef254 commit: 1aa6be06c4cb7f04a340adb1c7b16b89803ef254 branch: main author: Benjamin Peterson committer: benjaminp date: 2022-02-03T10:46:50-08:00 summary: closes bpo-46626: Expose IP_BIND_ADDRESS_NO_PORT socket option. (GH-31106) files: A Misc/NEWS.d/next/Library/2022-02-03-10-22-42.bpo-46626.r2e-n_.rst M Modules/socketmodule.c diff --git a/Misc/NEWS.d/next/Library/2022-02-03-10-22-42.bpo-46626.r2e-n_.rst b/Misc/NEWS.d/next/Library/2022-02-03-10-22-42.bpo-46626.r2e-n_.rst new file mode 100644 index 0000000000000..aaca73d36cdc6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-02-03-10-22-42.bpo-46626.r2e-n_.rst @@ -0,0 +1 @@ +Expose Linux's ``IP_BIND_ADDRESS_NO_PORT`` option in :mod:`socket`. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 1c8ef1eb3b5b3..3fca9f68512e8 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -8072,6 +8072,9 @@ PyInit__socket(void) #ifdef IP_TRANSPARENT PyModule_AddIntMacro(m, IP_TRANSPARENT); #endif +#ifdef IP_BIND_ADDRESS_NO_PORT + PyModule_AddIntMacro(m, IP_BIND_ADDRESS_NO_PORT); +#endif /* IPv6 [gs]etsockopt options, defined in RFC2553 */ #ifdef IPV6_JOIN_GROUP From webhook-mailer at python.org Thu Feb 3 14:44:40 2022 From: webhook-mailer at python.org (terryjreedy) Date: Thu, 03 Feb 2022 19:44:40 -0000 Subject: [Python-checkins] bpo-45975: IDLE - Remove extraneous parens (GH-31107) Message-ID: https://github.com/python/cpython/commit/916d0d822c79933f4c420f7a36f16f3eb788646b commit: 916d0d822c79933f4c420f7a36f16f3eb788646b branch: main author: Terry Jan Reedy committer: terryjreedy date: 2022-02-03T14:44:35-05:00 summary: bpo-45975: IDLE - Remove extraneous parens (GH-31107) mistakenly included in 3 files in previous PR and backported both to 3.10 and 3.9. files: M Lib/idlelib/pyparse.py M Lib/idlelib/replace.py M Lib/idlelib/run.py diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index a94327533d865..8545c63e1435d 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -179,7 +179,7 @@ def find_good_parse_start(self, is_char_in_string): # Peeking back worked; look forward until _synchre no longer # matches. i = pos + 1 - while (m := _synchre(code, i)): + while m := _synchre(code, i): s, i = m.span() if not is_char_in_string(s): pos = s diff --git a/Lib/idlelib/replace.py b/Lib/idlelib/replace.py index ac04ed94dd475..ca83173877ad1 100644 --- a/Lib/idlelib/replace.py +++ b/Lib/idlelib/replace.py @@ -158,8 +158,8 @@ def replace_all(self, event=None): first = last = None # XXX ought to replace circular instead of top-to-bottom when wrapping text.undo_block_start() - while (res := self.engine.search_forward( - text, prog, line, col, wrap=False, ok=ok)): + while res := self.engine.search_forward( + text, prog, line, col, wrap=False, ok=ok): line, m = res chars = text.get("%d.0" % line, "%d.0" % (line+1)) orig = m.group() diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 01f8d65426abc..aaa9b5ce8d181 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -482,7 +482,7 @@ def read(self, size=-1): result = self._line_buffer self._line_buffer = '' if size < 0: - while (line := self.shell.readline()): + while line := self.shell.readline(): result += line else: while len(result) < size: From webhook-mailer at python.org Thu Feb 3 15:44:20 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 03 Feb 2022 20:44:20 -0000 Subject: [Python-checkins] bpo-45975: IDLE - Remove extraneous parens (GH-31107) Message-ID: https://github.com/python/cpython/commit/63523e7b2a631f28134b25a8063d50e08c741db6 commit: 63523e7b2a631f28134b25a8063d50e08c741db6 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-03T12:44:11-08:00 summary: bpo-45975: IDLE - Remove extraneous parens (GH-31107) mistakenly included in 3 files in previous PR and backported both to 3.10 and 3.9. (cherry picked from commit 916d0d822c79933f4c420f7a36f16f3eb788646b) Co-authored-by: Terry Jan Reedy files: M Lib/idlelib/pyparse.py M Lib/idlelib/replace.py M Lib/idlelib/run.py diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index a94327533d865..8545c63e1435d 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -179,7 +179,7 @@ def find_good_parse_start(self, is_char_in_string): # Peeking back worked; look forward until _synchre no longer # matches. i = pos + 1 - while (m := _synchre(code, i)): + while m := _synchre(code, i): s, i = m.span() if not is_char_in_string(s): pos = s diff --git a/Lib/idlelib/replace.py b/Lib/idlelib/replace.py index ac04ed94dd475..ca83173877ad1 100644 --- a/Lib/idlelib/replace.py +++ b/Lib/idlelib/replace.py @@ -158,8 +158,8 @@ def replace_all(self, event=None): first = last = None # XXX ought to replace circular instead of top-to-bottom when wrapping text.undo_block_start() - while (res := self.engine.search_forward( - text, prog, line, col, wrap=False, ok=ok)): + while res := self.engine.search_forward( + text, prog, line, col, wrap=False, ok=ok): line, m = res chars = text.get("%d.0" % line, "%d.0" % (line+1)) orig = m.group() diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 01f8d65426abc..aaa9b5ce8d181 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -482,7 +482,7 @@ def read(self, size=-1): result = self._line_buffer self._line_buffer = '' if size < 0: - while (line := self.shell.readline()): + while line := self.shell.readline(): result += line else: while len(result) < size: From webhook-mailer at python.org Thu Feb 3 15:44:28 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 03 Feb 2022 20:44:28 -0000 Subject: [Python-checkins] bpo-45975: IDLE - Remove extraneous parens (GH-31107) Message-ID: https://github.com/python/cpython/commit/cf7cb1a2bf40516dc571d1d90c12b632dcd9b8c8 commit: cf7cb1a2bf40516dc571d1d90c12b632dcd9b8c8 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-03T12:44:23-08:00 summary: bpo-45975: IDLE - Remove extraneous parens (GH-31107) mistakenly included in 3 files in previous PR and backported both to 3.10 and 3.9. (cherry picked from commit 916d0d822c79933f4c420f7a36f16f3eb788646b) Co-authored-by: Terry Jan Reedy files: M Lib/idlelib/pyparse.py M Lib/idlelib/replace.py M Lib/idlelib/run.py diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index a94327533d865..8545c63e1435d 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -179,7 +179,7 @@ def find_good_parse_start(self, is_char_in_string): # Peeking back worked; look forward until _synchre no longer # matches. i = pos + 1 - while (m := _synchre(code, i)): + while m := _synchre(code, i): s, i = m.span() if not is_char_in_string(s): pos = s diff --git a/Lib/idlelib/replace.py b/Lib/idlelib/replace.py index 70d761db12630..7e55a4a43a44b 100644 --- a/Lib/idlelib/replace.py +++ b/Lib/idlelib/replace.py @@ -156,8 +156,8 @@ def replace_all(self, event=None): first = last = None # XXX ought to replace circular instead of top-to-bottom when wrapping text.undo_block_start() - while (res := self.engine.search_forward( - text, prog, line, col, wrap=False, ok=ok)): + while res := self.engine.search_forward( + text, prog, line, col, wrap=False, ok=ok): line, m = res chars = text.get("%d.0" % line, "%d.0" % (line+1)) orig = m.group() diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 4246f497cb382..d6f1049612f71 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -468,7 +468,7 @@ def read(self, size=-1): result = self._line_buffer self._line_buffer = '' if size < 0: - while (line := self.shell.readline()): + while line := self.shell.readline(): result += line else: while len(result) < size: From webhook-mailer at python.org Thu Feb 3 17:06:26 2022 From: webhook-mailer at python.org (terryjreedy) Date: Thu, 03 Feb 2022 22:06:26 -0000 Subject: [Python-checkins] bpo-46630: Fix initial focus of IDLE query dialogs (GH-31112) Message-ID: https://github.com/python/cpython/commit/d1df81a730499cc6286d02afa6028a1e9c22bbbf commit: d1df81a730499cc6286d02afa6028a1e9c22bbbf branch: main author: Terry Jan Reedy committer: terryjreedy date: 2022-02-03T17:06:17-05:00 summary: bpo-46630: Fix initial focus of IDLE query dialogs (GH-31112) On Windows, one had to Tab or click on the entry box to get a cursor and be able to enter anything. files: A Misc/NEWS.d/next/IDLE/2022-02-03-15-47-53.bpo-46630.tREOjo.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/query.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 34b2c08a92256..0bfadfd81e2dd 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -4,6 +4,9 @@ Released on 2022-10-03 ========================= +bpo-46630: Make query dialogs on Windows start with a cursor in the +entry box. + bpo-46591: Make the IDLE doc URL on the About IDLE dialog clickable. bpo-45296: Clarify close, quit, and exit in IDLE. In the File menu, diff --git a/Lib/idlelib/query.py b/Lib/idlelib/query.py index fefa5aac1b7f5..df02f2123ab02 100644 --- a/Lib/idlelib/query.py +++ b/Lib/idlelib/query.py @@ -83,6 +83,7 @@ def __init__(self, parent, title, message, *, text0='', used_names={}, if not _utest: self.deiconify() # Unhide now that geometry set. + self.entry.focus_set() self.wait_window() def create_widgets(self, ok_text='OK'): # Do not replace. @@ -100,7 +101,6 @@ def create_widgets(self, ok_text='OK'): # Do not replace. text=self.message) self.entryvar = StringVar(self, self.text0) self.entry = Entry(frame, width=30, textvariable=self.entryvar) - self.entry.focus_set() self.error_font = Font(name='TkCaptionFont', exists=True, root=self.parent) self.entry_error = Label(frame, text=' ', foreground='red', diff --git a/Misc/NEWS.d/next/IDLE/2022-02-03-15-47-53.bpo-46630.tREOjo.rst b/Misc/NEWS.d/next/IDLE/2022-02-03-15-47-53.bpo-46630.tREOjo.rst new file mode 100644 index 0000000000000..81e35486eaf21 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2022-02-03-15-47-53.bpo-46630.tREOjo.rst @@ -0,0 +1 @@ +Make query dialogs on Windows start with a cursor in the entry box. From webhook-mailer at python.org Thu Feb 3 17:33:35 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 03 Feb 2022 22:33:35 -0000 Subject: [Python-checkins] bpo-46630: Fix initial focus of IDLE query dialogs (GH-31112) Message-ID: https://github.com/python/cpython/commit/dc315f30f86a1dc7c4607398b379d7c0b55c7549 commit: dc315f30f86a1dc7c4607398b379d7c0b55c7549 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-03T14:33:26-08:00 summary: bpo-46630: Fix initial focus of IDLE query dialogs (GH-31112) On Windows, one had to Tab or click on the entry box to get a cursor and be able to enter anything. (cherry picked from commit d1df81a730499cc6286d02afa6028a1e9c22bbbf) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/IDLE/2022-02-03-15-47-53.bpo-46630.tREOjo.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/query.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 2ba8d581bbc73..73c8b7a32d767 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -4,6 +4,9 @@ Released on 2022-05-16 ========================= +bpo-46630: Make query dialogs on Windows start with a cursor in the +entry box. + bpo-46591: Make the IDLE doc URL on the About IDLE dialog clickable. bpo-45296: Clarify close, quit, and exit in IDLE. In the File menu, diff --git a/Lib/idlelib/query.py b/Lib/idlelib/query.py index fefa5aac1b7f5..df02f2123ab02 100644 --- a/Lib/idlelib/query.py +++ b/Lib/idlelib/query.py @@ -83,6 +83,7 @@ def __init__(self, parent, title, message, *, text0='', used_names={}, if not _utest: self.deiconify() # Unhide now that geometry set. + self.entry.focus_set() self.wait_window() def create_widgets(self, ok_text='OK'): # Do not replace. @@ -100,7 +101,6 @@ def create_widgets(self, ok_text='OK'): # Do not replace. text=self.message) self.entryvar = StringVar(self, self.text0) self.entry = Entry(frame, width=30, textvariable=self.entryvar) - self.entry.focus_set() self.error_font = Font(name='TkCaptionFont', exists=True, root=self.parent) self.entry_error = Label(frame, text=' ', foreground='red', diff --git a/Misc/NEWS.d/next/IDLE/2022-02-03-15-47-53.bpo-46630.tREOjo.rst b/Misc/NEWS.d/next/IDLE/2022-02-03-15-47-53.bpo-46630.tREOjo.rst new file mode 100644 index 0000000000000..81e35486eaf21 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2022-02-03-15-47-53.bpo-46630.tREOjo.rst @@ -0,0 +1 @@ +Make query dialogs on Windows start with a cursor in the entry box. From webhook-mailer at python.org Thu Feb 3 17:34:10 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 03 Feb 2022 22:34:10 -0000 Subject: [Python-checkins] bpo-46630: Fix initial focus of IDLE query dialogs (GH-31112) Message-ID: https://github.com/python/cpython/commit/4f76b3667d856a13107c65d44d802d0e73c3f104 commit: 4f76b3667d856a13107c65d44d802d0e73c3f104 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-03T14:34:03-08:00 summary: bpo-46630: Fix initial focus of IDLE query dialogs (GH-31112) On Windows, one had to Tab or click on the entry box to get a cursor and be able to enter anything. (cherry picked from commit d1df81a730499cc6286d02afa6028a1e9c22bbbf) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/IDLE/2022-02-03-15-47-53.bpo-46630.tREOjo.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/query.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 724709a29ff63..e8055a054640b 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -4,6 +4,9 @@ Released on 2022-05-16 ========================= +bpo-46630: Make query dialogs on Windows start with a cursor in the +entry box. + bpo-46591: Make the IDLE doc URL on the About IDLE dialog clickable. bpo-45296: Clarify close, quit, and exit in IDLE. In the File menu, diff --git a/Lib/idlelib/query.py b/Lib/idlelib/query.py index fefa5aac1b7f5..df02f2123ab02 100644 --- a/Lib/idlelib/query.py +++ b/Lib/idlelib/query.py @@ -83,6 +83,7 @@ def __init__(self, parent, title, message, *, text0='', used_names={}, if not _utest: self.deiconify() # Unhide now that geometry set. + self.entry.focus_set() self.wait_window() def create_widgets(self, ok_text='OK'): # Do not replace. @@ -100,7 +101,6 @@ def create_widgets(self, ok_text='OK'): # Do not replace. text=self.message) self.entryvar = StringVar(self, self.text0) self.entry = Entry(frame, width=30, textvariable=self.entryvar) - self.entry.focus_set() self.error_font = Font(name='TkCaptionFont', exists=True, root=self.parent) self.entry_error = Label(frame, text=' ', foreground='red', diff --git a/Misc/NEWS.d/next/IDLE/2022-02-03-15-47-53.bpo-46630.tREOjo.rst b/Misc/NEWS.d/next/IDLE/2022-02-03-15-47-53.bpo-46630.tREOjo.rst new file mode 100644 index 0000000000000..81e35486eaf21 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2022-02-03-15-47-53.bpo-46630.tREOjo.rst @@ -0,0 +1 @@ +Make query dialogs on Windows start with a cursor in the entry box. From webhook-mailer at python.org Thu Feb 3 17:57:42 2022 From: webhook-mailer at python.org (pablogsal) Date: Thu, 03 Feb 2022 22:57:42 -0000 Subject: [Python-checkins] Python 3.11.0a5 Message-ID: https://github.com/python/cpython/commit/c4e4b91557f18f881f393d80f5d8ce29de760e67 commit: c4e4b91557f18f881f393d80f5d8ce29de760e67 branch: main author: Pablo Galindo committer: pablogsal date: 2022-02-03T18:37:08Z summary: Python 3.11.0a5 files: A Misc/NEWS.d/3.11.0a5.rst D Misc/NEWS.d/next/Build/2021-02-10-17-54-04.bpo-43112.H5Lat6.rst D Misc/NEWS.d/next/Build/2022-01-08-12-43-31.bpo-45925.38F3NO.rst D Misc/NEWS.d/next/Build/2022-01-09-11-24-54.bpo-45569.zCIENy.rst D Misc/NEWS.d/next/Build/2022-01-19-04-36-15.bpo-46429.y0OtVL.rst D Misc/NEWS.d/next/Build/2022-01-20-05-27-07.bpo-46443.udCVII.rst D Misc/NEWS.d/next/Build/2022-01-22-11-06-23.bpo-46471.03snrE.rst D Misc/NEWS.d/next/Build/2022-01-25-12-32-37.bpo-46513.mPm9B4.rst D Misc/NEWS.d/next/Build/2022-01-26-22-59-12.bpo-38472.RxfLho.rst D Misc/NEWS.d/next/Build/2022-02-01-14-07-37.bpo-46600.NNLnfj.rst D Misc/NEWS.d/next/Build/2022-02-02-02-06-07.bpo-46602.8GaOZ2.rst D Misc/NEWS.d/next/C API/2020-09-11-02-50-41.bpo-14916.QN1Y03.rst D Misc/NEWS.d/next/C API/2021-10-18-16-54-24.bpo-45459.Y1pEZs.rst D Misc/NEWS.d/next/C API/2022-01-19-16-51-54.bpo-46433.Er9ApS.rst D Misc/NEWS.d/next/C API/2022-01-27-02-37-18.bpo-40170.XxQB0i.rst D Misc/NEWS.d/next/C API/2022-01-27-02-51-22.bpo-40170.uPolek.rst D Misc/NEWS.d/next/Core and Builtins/2021-05-04-21-55-49.bpo-44024.M9m8Qd.rst D Misc/NEWS.d/next/Core and Builtins/2021-12-11-11-36-48.bpo-46045.sfThay.rst D Misc/NEWS.d/next/Core and Builtins/2021-12-12-00-49-19.bpo-30512.nU9E9V.rst D Misc/NEWS.d/next/Core and Builtins/2021-12-16-00-24-00.bpo-46091.rJ_e_e.rst D Misc/NEWS.d/next/Core and Builtins/2021-12-16-15-04-58.bpo-46028.zfWacB.rst D Misc/NEWS.d/next/Core and Builtins/2021-12-23-12-32-45.bpo-46161.EljBmu.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-12-17-15-17.bpo-46361.mgI_j_.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-14-20-55-34.bpo-46383.v8MTl4.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-16-15-40-11.bpo-46406.g0mke-.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-17-12-57-27.bpo-46409.HouS6m.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-17-23-12-01.bpo-46407.2_5a7R.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-20-17-13-49.bpo-43683.BqQ26Z.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-21-12-24-14.bpo-46417.i3IqMf.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-22-14-39-23.bpo-46417.3U5SfN.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-23-06-56-33.bpo-46481.X_FfnB.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-24-15-39-34.bpo-46476.cvP1Mr.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-24-16-58-01.bpo-46431.N6mKAx.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-24-21-24-41.bpo-46503.4UrPsE.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-25-11-44-17.bpo-46329.SEhynE.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-25-17-40-07.bpo-46528.2Qmni9.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-25-19-34-55.bpo-46527.mQLNPk.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-27-10-49-34.bpo-46458.5Gm3Gv.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-30-18-23-08.bpo-44977.BQV_zS.rst D Misc/NEWS.d/next/Core and Builtins/2022-02-01-01-17-28.bpo-45885.CjyNf_.rst D Misc/NEWS.d/next/Core and Builtins/2022-02-01-10-23-21.bpo-46564.6Xc2_H.rst D Misc/NEWS.d/next/Core and Builtins/2022-02-01-14-30-56.bpo-45773.Up77LD.rst D Misc/NEWS.d/next/Documentation/2022-01-21-21-33-48.bpo-46463.fBbdTG.rst D Misc/NEWS.d/next/IDLE/2022-01-26-19-33-55.bpo-45296.LzZKdU.rst D Misc/NEWS.d/next/Library/2021-07-31-23-18-50.bpo-44791.4jFdpO.rst D Misc/NEWS.d/next/Library/2021-12-15-06-29-00.bpo-46080.AuQpLt.rst D Misc/NEWS.d/next/Library/2021-12-16-23-42-54.bpo-46103.LMnZAN.rst D Misc/NEWS.d/next/Library/2021-12-18-18-41-30.bpo-46124.ESPrb7.rst D Misc/NEWS.d/next/Library/2021-12-28-11-55-10.bpo-21987.avBK-p.rst D Misc/NEWS.d/next/Library/2021-12-29-13-42-55.bpo-26552.1BqeAn.rst D Misc/NEWS.d/next/Library/2021-12-29-14-42-09.bpo-43118.BoVi_5.rst D Misc/NEWS.d/next/Library/2022-01-03-16-25-06.bpo-46242.f4l_CL.rst D Misc/NEWS.d/next/Library/2022-01-04-18-05-25.bpo-46258.DYgwRo.rst D Misc/NEWS.d/next/Library/2022-01-05-03-09-29.bpo-43012.RVhLIL.rst D Misc/NEWS.d/next/Library/2022-01-05-03-21-21.bpo-29688.W06bSH.rst D Misc/NEWS.d/next/Library/2022-01-09-15-04-56.bpo-46316.AMTyd0.rst D Misc/NEWS.d/next/Library/2022-01-13-11-41-24.bpo-40066.1QuVli.rst D Misc/NEWS.d/next/Library/2022-01-16-14-07-14.bpo-40280.LtFHfF.rst D Misc/NEWS.d/next/Library/2022-01-17-10-00-02.bpo-46414.Ld0b_y.rst D Misc/NEWS.d/next/Library/2022-01-18-17-24-21.bpo-43869.NayN12.rst D Misc/NEWS.d/next/Library/2022-01-20-10-35-10.bpo-46434.geS-aP.rst D Misc/NEWS.d/next/Library/2022-01-20-10-35-50.bpo-46422.1UAEHL.rst D Misc/NEWS.d/next/Library/2022-01-21-18-19-45.bpo-41906.YBaquj.rst D Misc/NEWS.d/next/Library/2022-01-22-05-05-08.bpo-46469.plUab5.rst D Misc/NEWS.d/next/Library/2022-01-22-13-17-35.bpo-46470.MnNhgU.rst D Misc/NEWS.d/next/Library/2022-01-22-14-45-46.bpo-46474.2DUC62.rst D Misc/NEWS.d/next/Library/2022-01-22-14-49-10.bpo-46474.eKQhvx.rst D Misc/NEWS.d/next/Library/2022-01-23-18-04-45.bpo-41403.SgoHqV.rst D Misc/NEWS.d/next/Library/2022-01-23-19-37-00.bpo-46436.Biz1p9.rst D Misc/NEWS.d/next/Library/2022-01-24-13-00-09.bpo-46483.9XnmKp.rst D Misc/NEWS.d/next/Library/2022-01-24-23-55-30.bpo-46491.jmIKHo.rst D Misc/NEWS.d/next/Library/2022-01-25-10-59-41.bpo-46510.PM5svI.rst D Misc/NEWS.d/next/Library/2022-01-26-20-36-30.bpo-46539.23iW1d.rst D Misc/NEWS.d/next/Library/2022-01-26-23-58-48.bpo-45162.4Jmg_j.rst D Misc/NEWS.d/next/Library/2022-01-27-11-16-59.bpo-45173.wreRF2.rst D Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst D Misc/NEWS.d/next/Library/2022-01-27-13-30-02.bpo-46544.oFDVWj.rst D Misc/NEWS.d/next/Library/2022-01-28-08-47-53.bpo-46553.f7Uc96.rst D Misc/NEWS.d/next/Library/2022-01-28-19-48-31.bpo-46565.bpZXO4.rst D Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst D Misc/NEWS.d/next/Library/2022-02-03-12-07-41.bpo-46624.f_Qqh0.rst D Misc/NEWS.d/next/Tests/2021-12-18-22-23-50.bpo-46126.0LH3Yb.rst D Misc/NEWS.d/next/Tests/2022-01-14-23-22-41.bpo-40280.nHLWoD.rst D Misc/NEWS.d/next/Tests/2022-01-16-14-11-57.bpo-40280.fNnFfx.rst D Misc/NEWS.d/next/Tests/2022-01-17-13-10-04.bpo-13886.5mZH4b.rst D Misc/NEWS.d/next/Tests/2022-01-28-01-17-10.bpo-46542.xRLTdj.rst D Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst D Misc/NEWS.d/next/Tests/2022-01-31-17-34-13.bpo-46542.RTMm1T.rst D Misc/NEWS.d/next/Tests/2022-02-01-17-13-53.bpo-46600.FMCk8Z.rst D Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst D Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst D Misc/NEWS.d/next/Tests/2022-02-03-00-21-32.bpo-43478.0nfcam.rst D Misc/NEWS.d/next/Windows/2021-09-01-10-48-11.bpo-44934.W1xPATH.rst D Misc/NEWS.d/next/Windows/2022-01-13-22-31-09.bpo-46362.f2cuEb.rst D Misc/NEWS.d/next/Windows/2022-01-25-14-48-39.bpo-33125.5WyY_J.rst D Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst M Include/patchlevel.h M Lib/pydoc_data/topics.py M README.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 1715d53e83ab9..3ab1ce2051a30 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -20,10 +20,10 @@ #define PY_MINOR_VERSION 11 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA -#define PY_RELEASE_SERIAL 4 +#define PY_RELEASE_SERIAL 5 /* Version as a string */ -#define PY_VERSION "3.11.0a4+" +#define PY_VERSION "3.11.0a5" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 5ce05420414de..cd47603e6cf24 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Thu Jan 13 19:37:48 2022 +# Autogenerated by Sphinx on Thu Feb 3 18:35:23 2022 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -2518,22 +2518,21 @@ ' >>> print(sys.exc_info())\n' ' (None, None, None)\n' '\n' - 'The "except*" clause(s) are used for handling "ExceptionGroup`s. ' + 'The "except*" clause(s) are used for handling "ExceptionGroup"s. ' 'The\n' - 'exception type for matching is interpreted as in the case of\n' - ':keyword:`except", but in the case of exception groups we can ' - 'have\n' - 'partial matches when the type matches some of the exceptions in ' - 'the\n' - 'group. This means that multiple except* clauses can execute, ' - 'each\n' - 'handling part of the exception group. Each clause executes once ' - 'and\n' - 'handles an exception group of all matching exceptions. Each ' - 'exception\n' - 'in the group is handled by at most one except* clause, the first ' + 'exception type for matching is interpreted as in the case of ' + '"except",\n' + 'but in the case of exception groups we can have partial matches ' + 'when\n' + 'the type matches some of the exceptions in the group. This means ' 'that\n' - 'matches it.\n' + 'multiple except* clauses can execute, each handling part of the\n' + 'exception group. Each clause executes once and handles an ' + 'exception\n' + 'group of all matching exceptions. Each exception in the group ' + 'is\n' + 'handled by at most one except* clause, the first that matches ' + 'it.\n' '\n' ' >>> try:\n' ' ... raise ExceptionGroup("eg",\n' @@ -8082,7 +8081,11 @@ '\n' ' The built-in function "int()" falls back to ' '"__trunc__()" if\n' - ' neither "__int__()" nor "__index__()" is defined.\n', + ' neither "__int__()" nor "__index__()" is defined.\n' + '\n' + ' Changed in version 3.11: The delegation of "int()" to ' + '"__trunc__()"\n' + ' is deprecated.\n', 'objects': 'Objects, values and types\n' '*************************\n' '\n' @@ -8445,12 +8448,12 @@ '\n' ' raise_stmt ::= "raise" [expression ["from" expression]]\n' '\n' - 'If no expressions are present, "raise" re-raises the last ' - 'exception\n' - 'that was active in the current scope. If no exception is active ' - 'in\n' - 'the current scope, a "RuntimeError" exception is raised indicating\n' - 'that this is an error.\n' + 'If no expressions are present, "raise" re-raises the exception that ' + 'is\n' + 'currently being handled, which is also known as the *active\n' + 'exception*. If there isn?t currently an active exception, a\n' + '"RuntimeError" exception is raised indicating that this is an ' + 'error.\n' '\n' 'Otherwise, "raise" evaluates the first expression as the exception\n' 'object. It must be either a subclass or an instance of\n' @@ -8505,11 +8508,14 @@ ' File "", line 4, in \n' ' RuntimeError: Something bad happened\n' '\n' - 'A similar mechanism works implicitly if an exception is raised ' - 'inside\n' - 'an exception handler or a "finally" clause: the previous exception ' - 'is\n' - 'then attached as the new exception?s "__context__" attribute:\n' + 'A similar mechanism works implicitly if a new exception is raised ' + 'when\n' + 'an exception is already being handled. An exception may be ' + 'handled\n' + 'when an "except" or "finally" clause, or a "with" statement, is ' + 'used.\n' + 'The previous exception is then attached as the new exception?s\n' + '"__context__" attribute:\n' '\n' ' >>> try:\n' ' ... print(1 / 0)\n' @@ -10995,6 +11001,10 @@ 'if\n' ' neither "__int__()" nor "__index__()" is defined.\n' '\n' + ' Changed in version 3.11: The delegation of "int()" to ' + '"__trunc__()"\n' + ' is deprecated.\n' + '\n' '\n' 'With Statement Context Managers\n' '===============================\n' @@ -12562,17 +12572,16 @@ ' >>> print(sys.exc_info())\n' ' (None, None, None)\n' '\n' - 'The "except*" clause(s) are used for handling "ExceptionGroup`s. The\n' - 'exception type for matching is interpreted as in the case of\n' - ':keyword:`except", but in the case of exception groups we can have\n' - 'partial matches when the type matches some of the exceptions in the\n' - 'group. This means that multiple except* clauses can execute, each\n' - 'handling part of the exception group. Each clause executes once and\n' - 'handles an exception group of all matching exceptions. Each ' - 'exception\n' - 'in the group is handled by at most one except* clause, the first ' + 'The "except*" clause(s) are used for handling "ExceptionGroup"s. The\n' + 'exception type for matching is interpreted as in the case of ' + '"except",\n' + 'but in the case of exception groups we can have partial matches when\n' + 'the type matches some of the exceptions in the group. This means ' 'that\n' - 'matches it.\n' + 'multiple except* clauses can execute, each handling part of the\n' + 'exception group. Each clause executes once and handles an exception\n' + 'group of all matching exceptions. Each exception in the group is\n' + 'handled by at most one except* clause, the first that matches it.\n' '\n' ' >>> try:\n' ' ... raise ExceptionGroup("eg",\n' diff --git a/Misc/NEWS.d/3.11.0a5.rst b/Misc/NEWS.d/3.11.0a5.rst new file mode 100644 index 0000000000000..c28078da8d833 --- /dev/null +++ b/Misc/NEWS.d/3.11.0a5.rst @@ -0,0 +1,986 @@ +.. bpo: 45773 +.. date: 2022-02-01-14-30-56 +.. nonce: Up77LD +.. release date: 2022-02-03 +.. section: Core and Builtins + +Remove two invalid "peephole" optimizations from the bytecode compiler. + +.. + +.. bpo: 46564 +.. date: 2022-02-01-10-23-21 +.. nonce: 6Xc2_H +.. section: Core and Builtins + +Do not create frame objects when creating :class:`super` object. Patch by +Kumar Aditya. + +.. + +.. bpo: 45885 +.. date: 2022-02-01-01-17-28 +.. nonce: CjyNf_ +.. section: Core and Builtins + +Added more fined-grained specialization failure stats regarding the +``COMPARE_OP`` bytecode. + +.. + +.. bpo: 44977 +.. date: 2022-01-30-18-23-08 +.. nonce: BQV_zS +.. section: Core and Builtins + +The delegation of :func:`int` to :meth:`__trunc__` is now deprecated. +Calling ``int(a)`` when ``type(a)`` implements :meth:`__trunc__` but not +:meth:`__int__` or :meth:`__index__` now raises a :exc:`DeprecationWarning`. + +.. + +.. bpo: 46458 +.. date: 2022-01-27-10-49-34 +.. nonce: 5Gm3Gv +.. section: Core and Builtins + +Reorder code emitted by the compiler for a :keyword:`try`-:keyword:`except` +block so that the :keyword:`else` block's code immediately follows the +:keyword:`try` body (without a jump). This is more optimal for the happy +path. + +.. + +.. bpo: 46527 +.. date: 2022-01-25-19-34-55 +.. nonce: mQLNPk +.. section: Core and Builtins + +Allow passing ``iterable`` as a keyword argument to :func:`enumerate` again. +Patch by Jelle Zijlstra. + +.. + +.. bpo: 46528 +.. date: 2022-01-25-17-40-07 +.. nonce: 2Qmni9 +.. section: Core and Builtins + +Replace several stack manipulation instructions (``DUP_TOP``, +``DUP_TOP_TWO``, ``ROT_TWO``, ``ROT_THREE``, ``ROT_FOUR``, and ``ROT_N``) +with new :opcode:`COPY` and :opcode:`SWAP` instructions. + +.. + +.. bpo: 46329 +.. date: 2022-01-25-11-44-17 +.. nonce: SEhynE +.. section: Core and Builtins + +Use two or three bytecodes to implement most calls. + +Calls without named arguments are implemented as a sequence of two +instructions: ``PRECALL; CALL``. Calls with named arguments are implemented +as a sequence of three instructions: ``PRECALL; KW_NAMES; CALL``. There are +two different ``PRECALL`` instructions: ``PRECALL_FUNTION`` and +``PRECALL_METHOD``. The latter pairs with ``LOAD_METHOD``. + +This partition into pre-call and call allows better specialization, and thus +better performance ultimately. + +There is no change in semantics. + +.. + +.. bpo: 46503 +.. date: 2022-01-24-21-24-41 +.. nonce: 4UrPsE +.. section: Core and Builtins + +Fix an assert when parsing some invalid \N escape sequences in f-strings. + +.. + +.. bpo: 46431 +.. date: 2022-01-24-16-58-01 +.. nonce: N6mKAx +.. section: Core and Builtins + +Improve error message on invalid calls to +:meth:`BaseExceptionGroup.__new__`. + +.. + +.. bpo: 46476 +.. date: 2022-01-24-15-39-34 +.. nonce: cvP1Mr +.. section: Core and Builtins + +Fix memory leak in code objects generated by deepfreeze. Patch by Kumar +Aditya. + +.. + +.. bpo: 46481 +.. date: 2022-01-23-06-56-33 +.. nonce: X_FfnB +.. section: Core and Builtins + +Speed up calls to :meth:`weakref.ref.__call__` by using the :pep:`590` +``vectorcall`` calling convention. Patch by Dong-hee Na. + +.. + +.. bpo: 46417 +.. date: 2022-01-22-14-39-23 +.. nonce: 3U5SfN +.. section: Core and Builtins + +Fix a race condition on setting a type ``__bases__`` attribute: the internal +function ``add_subclass()`` now gets the ``PyTypeObject.tp_subclasses`` +member after calling :c:func:`PyWeakref_NewRef` which can trigger a garbage +collection which can indirectly modify ``PyTypeObject.tp_subclasses``. Patch +by Victor Stinner. + +.. + +.. bpo: 46417 +.. date: 2022-01-21-12-24-14 +.. nonce: i3IqMf +.. section: Core and Builtins + +``python -X showrefcount`` now shows the total reference count after +clearing and destroyed the main Python interpreter. Previously, it was shown +before. Patch by Victor Stinner. + +.. + +.. bpo: 43683 +.. date: 2022-01-20-17-13-49 +.. nonce: BqQ26Z +.. section: Core and Builtins + +Add ASYNC_GEN_WRAP opcode to wrap the value to be yielded in async +generators. Removes the need to special case async generators in the +``YIELD_VALUE`` instruction. + +.. + +.. bpo: 46407 +.. date: 2022-01-17-23-12-01 +.. nonce: 2_5a7R +.. section: Core and Builtins + +Optimize some modulo operations in ``Objects/longobject.c``. Patch by +Jeremiah Vivian. + +.. + +.. bpo: 46409 +.. date: 2022-01-17-12-57-27 +.. nonce: HouS6m +.. section: Core and Builtins + +Add new ``RETURN_GENERATOR`` bytecode to make generators. Simplifies calling +Python functions in the VM, as they no longer any need to special case +generator functions. + +Also add ``JUMP_NO_INTERRUPT`` bytecode that acts like ``JUMP_ABSOLUTE``, +but does not check for interrupts. + +.. + +.. bpo: 46406 +.. date: 2022-01-16-15-40-11 +.. nonce: g0mke- +.. section: Core and Builtins + +The integer division ``//`` implementation has been optimized to better let +the compiler understand its constraints. It can be 20% faster on the amd64 +platform when dividing an int by a value smaller than ``2**30``. + +.. + +.. bpo: 46383 +.. date: 2022-01-14-20-55-34 +.. nonce: v8MTl4 +.. section: Core and Builtins + +Fix invalid signature of ``_zoneinfo``'s ``module_free`` function to resolve +a crash on wasm32-emscripten platform. + +.. + +.. bpo: 46361 +.. date: 2022-01-12-17-15-17 +.. nonce: mgI_j_ +.. section: Core and Builtins + +Ensure that "small" integers created by :meth:`int.from_bytes` and +:class:`decimal.Decimal` are properly cached. + +.. + +.. bpo: 46161 +.. date: 2021-12-23-12-32-45 +.. nonce: EljBmu +.. section: Core and Builtins + +Fix the class building error when the arguments are constants and +CALL_FUNCTION_EX is used. + +.. + +.. bpo: 46028 +.. date: 2021-12-16-15-04-58 +.. nonce: zfWacB +.. section: Core and Builtins + +Fixes calculation of :data:`sys._base_executable` when inside a virtual +environment that uses symlinks with different binary names than the base +environment provides. + +.. + +.. bpo: 46091 +.. date: 2021-12-16-00-24-00 +.. nonce: rJ_e_e +.. section: Core and Builtins + +Correctly calculate indentation levels for lines with whitespace character +that are ended by line continuation characters. Patch by Pablo Galindo + +.. + +.. bpo: 30512 +.. date: 2021-12-12-00-49-19 +.. nonce: nU9E9V +.. section: Core and Builtins + +Add CAN Socket support for NetBSD. + +.. + +.. bpo: 46045 +.. date: 2021-12-11-11-36-48 +.. nonce: sfThay +.. section: Core and Builtins + +Do not use POSIX semaphores on NetBSD + +.. + +.. bpo: 44024 +.. date: 2021-05-04-21-55-49 +.. nonce: M9m8Qd +.. section: Core and Builtins + +Improve the exc:`TypeError` message for non-string second arguments passed +to the built-in functions :func:`getattr` and :func:`hasattr`. Patch by G?ry +Ogam. + +.. + +.. bpo: 46624 +.. date: 2022-02-03-12-07-41 +.. nonce: f_Qqh0 +.. section: Library + +Restore support for non-integer arguments of :func:`random.randrange` and +:func:`random.randint`. + +.. + +.. bpo: 46591 +.. date: 2022-01-31-15-40-38 +.. nonce: prBD1M +.. section: Library + +Make the IDLE doc URL on the About IDLE dialog clickable. + +.. + +.. bpo: 46565 +.. date: 2022-01-28-19-48-31 +.. nonce: bpZXO4 +.. section: Library + +Remove loop variables that are leaking into modules' namespaces. + +.. + +.. bpo: 46553 +.. date: 2022-01-28-08-47-53 +.. nonce: f7Uc96 +.. section: Library + +In :func:`typing.get_type_hints`, support evaluating bare stringified +``ClassVar`` annotations. Patch by Gregory Beauregard. + +.. + +.. bpo: 46544 +.. date: 2022-01-27-13-30-02 +.. nonce: oFDVWj +.. section: Library + +Don't leak ``x`` & ``uspace`` intermediate vars in +:class:`textwrap.TextWrapper`. + +.. + +.. bpo: 46487 +.. date: 2022-01-27-12-24-38 +.. nonce: UDkN2z +.. section: Library + +Add the ``get_write_buffer_limits`` method to +:class:`asyncio.transports.WriteTransport` and to the SSL transport. + +.. + +.. bpo: 45173 +.. date: 2022-01-27-11-16-59 +.. nonce: wreRF2 +.. section: Library + +Note the configparser deprecations will be removed in Python 3.12. + +.. + +.. bpo: 45162 +.. date: 2022-01-26-23-58-48 +.. nonce: 4Jmg_j +.. section: Library + +The deprecated :mod:`unittest` APIs removed in 3.11a1 have been temporarily +restored to be removed in 3.12 while cleanups in external projects go in. + +.. + +.. bpo: 46539 +.. date: 2022-01-26-20-36-30 +.. nonce: 23iW1d +.. section: Library + +In :func:`typing.get_type_hints`, support evaluating stringified +``ClassVar`` and ``Final`` annotations inside ``Annotated``. Patch by +Gregory Beauregard. + +.. + +.. bpo: 46510 +.. date: 2022-01-25-10-59-41 +.. nonce: PM5svI +.. section: Library + +Add missing test for :class:`types.TracebackType` and +:class:`types.FrameType`. Calculate them directly from the caught exception +without calling :func:`sys.exc_info`. + +.. + +.. bpo: 46491 +.. date: 2022-01-24-23-55-30 +.. nonce: jmIKHo +.. section: Library + +Allow :data:`typing.Annotated` to wrap :data:`typing.Final` and +:data:`typing.ClassVar`. Patch by Gregory Beauregard. + +.. + +.. bpo: 46483 +.. date: 2022-01-24-13-00-09 +.. nonce: 9XnmKp +.. section: Library + +Remove :meth:`~object.__class_getitem__` from :class:`pathlib.PurePath` as +this class was not supposed to be generic. + +.. + +.. bpo: 46436 +.. date: 2022-01-23-19-37-00 +.. nonce: Biz1p9 +.. section: Library + +Fix command-line option ``-d``/``--directory`` in module :mod:`http.server` +which is ignored when combined with command-line option ``--cgi``. Patch by +G?ry Ogam. + +.. + +.. bpo: 41403 +.. date: 2022-01-23-18-04-45 +.. nonce: SgoHqV +.. section: Library + +Make :meth:`mock.patch` raise a :exc:`TypeError` with a relevant error +message on invalid arg. Previously it allowed a cryptic +:exc:`AttributeError` to escape. + +.. + +.. bpo: 46474 +.. date: 2022-01-22-14-49-10 +.. nonce: eKQhvx +.. section: Library + +In ``importlib.metadata.EntryPoint.pattern``, avoid potential REDoS by +limiting ambiguity in consecutive whitespace. + +.. + +.. bpo: 46474 +.. date: 2022-01-22-14-45-46 +.. nonce: 2DUC62 +.. section: Library + +Removed private method from ``importlib.metadata.Path``. Sync with +importlib_metadata 4.10.0. + +.. + +.. bpo: 46470 +.. date: 2022-01-22-13-17-35 +.. nonce: MnNhgU +.. section: Library + +Remove unused branch from ``typing._remove_dups_flatten`` + +.. + +.. bpo: 46469 +.. date: 2022-01-22-05-05-08 +.. nonce: plUab5 +.. section: Library + +:mod:`asyncio` generic classes now return :class:`types.GenericAlias` in +``__class_getitem__`` instead of the same class. + +.. + +.. bpo: 41906 +.. date: 2022-01-21-18-19-45 +.. nonce: YBaquj +.. section: Library + +Support passing filter instances in the ``filters`` values of ``handlers`` +and ``loggers`` in the dictionary passed to +:func:`logging.config.dictConfig`. + +.. + +.. bpo: 46422 +.. date: 2022-01-20-10-35-50 +.. nonce: 1UAEHL +.. section: Library + +Use ``dis.Positions`` in ``dis.Instruction`` instead of a regular ``tuple``. + +.. + +.. bpo: 46434 +.. date: 2022-01-20-10-35-10 +.. nonce: geS-aP +.. section: Library + +:mod:`pdb` now gracefully handles ``help`` when :attr:`__doc__` is missing, +for example when run with pregenerated optimized ``.pyc`` files. + +.. + +.. bpo: 43869 +.. date: 2022-01-18-17-24-21 +.. nonce: NayN12 +.. section: Library + +Python uses the same time Epoch on all platforms. Add an explicit unit test +to ensure that it's the case. Patch by Victor Stinner. + +.. + +.. bpo: 46414 +.. date: 2022-01-17-10-00-02 +.. nonce: Ld0b_y +.. section: Library + +Add :func:`typing.reveal_type`. Patch by Jelle Zijlstra. + +.. + +.. bpo: 40280 +.. date: 2022-01-16-14-07-14 +.. nonce: LtFHfF +.. section: Library + +:mod:`subprocess` now imports Windows-specific imports when ``msvcrt`` +module is available, and POSIX-specific imports on all other platforms. This +gives a clean exception when ``_posixsubprocess`` is not available (e.g. +Emscripten browser target). + +.. + +.. bpo: 40066 +.. date: 2022-01-13-11-41-24 +.. nonce: 1QuVli +.. section: Library + +``IntEnum``, ``IntFlag``, and ``StrEnum`` use the mixed-in type for their +``str()`` and ``format()`` output. + +.. + +.. bpo: 46316 +.. date: 2022-01-09-15-04-56 +.. nonce: AMTyd0 +.. section: Library + +Optimize :meth:`pathlib.Path.iterdir` by removing an unnecessary check for +special entries. + +.. + +.. bpo: 29688 +.. date: 2022-01-05-03-21-21 +.. nonce: W06bSH +.. section: Library + +Document :meth:`pathlib.Path.absolute` (which has always existed). + +.. + +.. bpo: 43012 +.. date: 2022-01-05-03-09-29 +.. nonce: RVhLIL +.. section: Library + +The pathlib module's obsolete and internal ``_Accessor`` class has been +removed to prepare the terrain for upcoming enhancements to the module. + +.. + +.. bpo: 46258 +.. date: 2022-01-04-18-05-25 +.. nonce: DYgwRo +.. section: Library + +Speed up :func:`math.isqrt` for small positive integers by replacing two +division steps with a lookup table. + +.. + +.. bpo: 46242 +.. date: 2022-01-03-16-25-06 +.. nonce: f4l_CL +.. section: Library + +Improve error message when creating a new :class:`enum.Enum` type +subclassing an existing ``Enum`` with ``_member_names_`` using +:meth:`enum.Enum.__call__`. + +.. + +.. bpo: 43118 +.. date: 2021-12-29-14-42-09 +.. nonce: BoVi_5 +.. section: Library + +Fix a bug in :func:`inspect.signature` that was causing it to fail on some +subclasses of classes with a ``__text_signature__`` referencing module +globals. Patch by Weipeng Hong. + +.. + +.. bpo: 26552 +.. date: 2021-12-29-13-42-55 +.. nonce: 1BqeAn +.. section: Library + +Fixed case where failing :func:`asyncio.ensure_future` did not close the +coroutine. Patch by Kumar Aditya. + +.. + +.. bpo: 21987 +.. date: 2021-12-28-11-55-10 +.. nonce: avBK-p +.. section: Library + +Fix an issue with :meth:`tarfile.TarFile.getmember` getting a directory name +with a trailing slash. + +.. + +.. bpo: 46124 +.. date: 2021-12-18-18-41-30 +.. nonce: ESPrb7 +.. section: Library + +Update :mod:`zoneinfo` to rely on importlib.resources traversable API. + +.. + +.. bpo: 46103 +.. date: 2021-12-16-23-42-54 +.. nonce: LMnZAN +.. section: Library + +Now :func:`inspect.getmembers` only gets :attr:`__bases__` attribute from +class type. Patch by Weipeng Hong. + +.. + +.. bpo: 46080 +.. date: 2021-12-15-06-29-00 +.. nonce: AuQpLt +.. section: Library + +Fix exception in argparse help text generation if a +:class:`argparse.BooleanOptionalAction` argument's default is +``argparse.SUPPRESS`` and it has ``help`` specified. Patch by Felix +Fontein. + +.. + +.. bpo: 44791 +.. date: 2021-07-31-23-18-50 +.. nonce: 4jFdpO +.. section: Library + +Fix substitution of :class:`~typing.ParamSpec` in +:data:`~typing.Concatenate` with different parameter expressions. +Substitution with a list of types returns now a tuple of types. Substitution +with ``Concatenate`` returns now a ``Concatenate`` with concatenated lists +of arguments. + +.. + +.. bpo: 46463 +.. date: 2022-01-21-21-33-48 +.. nonce: fBbdTG +.. section: Documentation + +Fixes :file:`escape4chm.py` script used when building the CHM documentation +file + +.. + +.. bpo: 43478 +.. date: 2022-02-03-00-21-32 +.. nonce: 0nfcam +.. section: Tests + +Mocks can no longer be provided as the specs for other Mocks. As a result, +an already-mocked object cannot be passed to `mock.Mock()`. This can uncover +bugs in tests since these Mock-derived Mocks will always pass certain tests +(e.g. isinstance) and builtin assert functions (e.g. +assert_called_once_with) will unconditionally pass. + +.. + +.. bpo: 46616 +.. date: 2022-02-02-18-14-38 +.. nonce: URvBtE +.. section: Tests + +Ensures ``test_importlib.test_windows`` cleans up registry keys after +completion. + +.. + +.. bpo: 44359 +.. date: 2022-02-02-02-24-04 +.. nonce: kPPSmN +.. section: Tests + +test_ftplib now silently ignores socket errors to prevent logging unhandled +threading exceptions. Patch by Victor Stinner. + +.. + +.. bpo: 46600 +.. date: 2022-02-01-17-13-53 +.. nonce: FMCk8Z +.. section: Tests + +Fix test_gdb.test_pycfunction() for Python built with ``clang -Og``. +Tolerate inlined functions in the gdb traceback. Patch by Victor Stinner. + +.. + +.. bpo: 46542 +.. date: 2022-01-31-17-34-13 +.. nonce: RTMm1T +.. section: Tests + +Fix a Python crash in test_lib2to3 when using Python built in debug mode: +limit the recursion limit. Patch by Victor Stinner. + +.. + +.. bpo: 46576 +.. date: 2022-01-29-12-37-53 +.. nonce: -prRaV +.. section: Tests + +test_peg_generator now disables compiler optimization when testing +compilation of its own C extensions to significantly speed up the testing on +non-debug builds of CPython. + +.. + +.. bpo: 46542 +.. date: 2022-01-28-01-17-10 +.. nonce: xRLTdj +.. section: Tests + +Fix ``test_json`` tests checking for :exc:`RecursionError`: modify these +tests to use ``support.infinite_recursion()``. Patch by Victor Stinner. + +.. + +.. bpo: 13886 +.. date: 2022-01-17-13-10-04 +.. nonce: 5mZH4b +.. section: Tests + +Skip test_builtin PTY tests on non-ASCII characters if the readline module +is loaded. The readline module changes input() behavior, but test_builtin is +not intented to test the readline module. Patch by Victor Stinner. + +.. + +.. bpo: 40280 +.. date: 2022-01-16-14-11-57 +.. nonce: fNnFfx +.. section: Tests + +Add :func:`test.support.requires_fork` decorators to mark tests that require +a working :func:`os.fork`. + +.. + +.. bpo: 40280 +.. date: 2022-01-14-23-22-41 +.. nonce: nHLWoD +.. section: Tests + +Add :func:`test.support.requires_subprocess` decorator to mark tests which +require working :mod:`subprocess` module or ``os.spawn*``. The +wasm32-emscripten platform has no support for processes. + +.. + +.. bpo: 46126 +.. date: 2021-12-18-22-23-50 +.. nonce: 0LH3Yb +.. section: Tests + +Disable 'descriptions' when running tests internally. + +.. + +.. bpo: 46602 +.. date: 2022-02-02-02-06-07 +.. nonce: 8GaOZ2 +.. section: Build + +Tidied up configure.ac so that conftest.c is truncated rather than appended. +This assists in the case where the 'rm' of conftest.c fails to happen +between tests. Downstream issues such as a clobbered SOABI can result. + +.. + +.. bpo: 46600 +.. date: 2022-02-01-14-07-37 +.. nonce: NNLnfj +.. section: Build + +Fix the test checking if the C compiler supports ``-Og`` option in the +``./configure`` script to also use ``-Og`` on clang which supports it. Patch +by Victor Stinner. + +.. + +.. bpo: 38472 +.. date: 2022-01-26-22-59-12 +.. nonce: RxfLho +.. section: Build + +Fix GCC detection in setup.py when cross-compiling. The C compiler is now +run with LC_ALL=C. Previously, the detection failed with a German locale. + +.. + +.. bpo: 46513 +.. date: 2022-01-25-12-32-37 +.. nonce: mPm9B4 +.. section: Build + +:program:`configure` no longer uses ``AC_C_CHAR_UNSIGNED`` macro and +``pyconfig.h`` no longer defines reserved symbol ``__CHAR_UNSIGNED__``. + +.. + +.. bpo: 46471 +.. date: 2022-01-22-11-06-23 +.. nonce: 03snrE +.. section: Build + +Use global singletons for single byte bytes objects in deepfreeze. + +.. + +.. bpo: 46443 +.. date: 2022-01-20-05-27-07 +.. nonce: udCVII +.. section: Build + +Deepfreeze now uses cached small integers as it saves some space for common +small integers. + +.. + +.. bpo: 46429 +.. date: 2022-01-19-04-36-15 +.. nonce: y0OtVL +.. section: Build + +Merge all deep-frozen files into one for space savings. Patch by Kumar +Aditya. + +.. + +.. bpo: 45569 +.. date: 2022-01-09-11-24-54 +.. nonce: zCIENy +.. section: Build + +The build now defaults to using 30-bit digits for Python integers. +Previously either 15-bit or 30-bit digits would be selected, depending on +the platform. 15-bit digits may still be selected using the +``--enable-big-digits=15`` option to the ``configure`` script, or by +defining ``PYLONG_BITS_IN_DIGIT`` in ``pyconfig.h``. + +.. + +.. bpo: 45925 +.. date: 2022-01-08-12-43-31 +.. nonce: 38F3NO +.. section: Build + +Update Windows installer to use SQLite 3.37.2. + +.. + +.. bpo: 43112 +.. date: 2021-02-10-17-54-04 +.. nonce: H5Lat6 +.. section: Build + +Detect musl libc as a separate SOABI (tagged as ``linux-musl``). + +.. + +.. bpo: 33125 +.. date: 2022-01-25-14-48-39 +.. nonce: 5WyY_J +.. section: Windows + +The traditional EXE/MSI based installer for Windows is now available for +ARM64 + +.. + +.. bpo: 46362 +.. date: 2022-01-13-22-31-09 +.. nonce: f2cuEb +.. section: Windows + +os.path.abspath("C:\CON") is now fixed to return "\\.\CON", not the same +path. The regression was true of all legacy DOS devices such as COM1, LPT1, +or NUL. + +.. + +.. bpo: 44934 +.. date: 2021-09-01-10-48-11 +.. nonce: W1xPATH +.. section: Windows + +The installer now offers a command-line only option to add the installation +directory to the end of :envvar:`PATH` instead of at the start. + +.. + +.. bpo: 45925 +.. date: 2022-01-26-12-04-09 +.. nonce: yBSiYO +.. section: macOS + +Update macOS installer to SQLite 3.37.2. + +.. + +.. bpo: 45296 +.. date: 2022-01-26-19-33-55 +.. nonce: LzZKdU +.. section: IDLE + +Clarify close, quit, and exit in IDLE. In the File menu, 'Close' and 'Exit' +are now 'Close Window' (the current one) and 'Exit' is now 'Exit IDLE' (by +closing all windows). In Shell, 'quit()' and 'exit()' mean 'close Shell'. +If there are no other windows, this also exits IDLE. + +.. + +.. bpo: 40170 +.. date: 2022-01-27-02-51-22 +.. nonce: uPolek +.. section: C API + +Remove the ``PyHeapType_GET_MEMBERS()`` macro. It was exposed in the public +C API by mistake, it must only be used by Python internally. Use the +``PyTypeObject.tp_members`` member instead. Patch by Victor Stinner. + +.. + +.. bpo: 40170 +.. date: 2022-01-27-02-37-18 +.. nonce: XxQB0i +.. section: C API + +Move _Py_GetAllocatedBlocks() and _PyObject_DebugMallocStats() private +functions to the internal C API. Patch by Victor Stinner. + +.. + +.. bpo: 46433 +.. date: 2022-01-19-16-51-54 +.. nonce: Er9ApS +.. section: C API + +The internal function _PyType_GetModuleByDef now correctly handles +inheritance patterns involving static types. + +.. + +.. bpo: 45459 +.. date: 2021-10-18-16-54-24 +.. nonce: Y1pEZs +.. section: C API + +:c:type:`Py_buffer` and various ``Py_buffer`` related functions are now part +of the limited API and stable ABI. + +.. + +.. bpo: 14916 +.. date: 2020-09-11-02-50-41 +.. nonce: QN1Y03 +.. section: C API + +Fixed bug in the tokenizer that prevented ``PyRun_InteractiveOne`` from +parsing from the provided FD. diff --git a/Misc/NEWS.d/next/Build/2021-02-10-17-54-04.bpo-43112.H5Lat6.rst b/Misc/NEWS.d/next/Build/2021-02-10-17-54-04.bpo-43112.H5Lat6.rst deleted file mode 100644 index 0e250edfa3ec1..0000000000000 --- a/Misc/NEWS.d/next/Build/2021-02-10-17-54-04.bpo-43112.H5Lat6.rst +++ /dev/null @@ -1 +0,0 @@ -Detect musl libc as a separate SOABI (tagged as ``linux-musl``). \ No newline at end of file diff --git a/Misc/NEWS.d/next/Build/2022-01-08-12-43-31.bpo-45925.38F3NO.rst b/Misc/NEWS.d/next/Build/2022-01-08-12-43-31.bpo-45925.38F3NO.rst deleted file mode 100644 index e802912bfcff7..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-01-08-12-43-31.bpo-45925.38F3NO.rst +++ /dev/null @@ -1 +0,0 @@ -Update Windows installer to use SQLite 3.37.2. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Build/2022-01-09-11-24-54.bpo-45569.zCIENy.rst b/Misc/NEWS.d/next/Build/2022-01-09-11-24-54.bpo-45569.zCIENy.rst deleted file mode 100644 index 69716cd9af5b2..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-01-09-11-24-54.bpo-45569.zCIENy.rst +++ /dev/null @@ -1,5 +0,0 @@ -The build now defaults to using 30-bit digits for Python integers. Previously -either 15-bit or 30-bit digits would be selected, depending on the platform. -15-bit digits may still be selected using the ``--enable-big-digits=15`` option -to the ``configure`` script, or by defining ``PYLONG_BITS_IN_DIGIT`` in -``pyconfig.h``. diff --git a/Misc/NEWS.d/next/Build/2022-01-19-04-36-15.bpo-46429.y0OtVL.rst b/Misc/NEWS.d/next/Build/2022-01-19-04-36-15.bpo-46429.y0OtVL.rst deleted file mode 100644 index c983d9637fc89..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-01-19-04-36-15.bpo-46429.y0OtVL.rst +++ /dev/null @@ -1 +0,0 @@ -Merge all deep-frozen files into one for space savings. Patch by Kumar Aditya. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Build/2022-01-20-05-27-07.bpo-46443.udCVII.rst b/Misc/NEWS.d/next/Build/2022-01-20-05-27-07.bpo-46443.udCVII.rst deleted file mode 100644 index 8e3fa197be9da..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-01-20-05-27-07.bpo-46443.udCVII.rst +++ /dev/null @@ -1 +0,0 @@ -Deepfreeze now uses cached small integers as it saves some space for common small integers. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Build/2022-01-22-11-06-23.bpo-46471.03snrE.rst b/Misc/NEWS.d/next/Build/2022-01-22-11-06-23.bpo-46471.03snrE.rst deleted file mode 100644 index ca8f72868e69e..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-01-22-11-06-23.bpo-46471.03snrE.rst +++ /dev/null @@ -1 +0,0 @@ -Use global singletons for single byte bytes objects in deepfreeze. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Build/2022-01-25-12-32-37.bpo-46513.mPm9B4.rst b/Misc/NEWS.d/next/Build/2022-01-25-12-32-37.bpo-46513.mPm9B4.rst deleted file mode 100644 index b8986ae31a340..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-01-25-12-32-37.bpo-46513.mPm9B4.rst +++ /dev/null @@ -1,2 +0,0 @@ -:program:`configure` no longer uses ``AC_C_CHAR_UNSIGNED`` macro and -``pyconfig.h`` no longer defines reserved symbol ``__CHAR_UNSIGNED__``. diff --git a/Misc/NEWS.d/next/Build/2022-01-26-22-59-12.bpo-38472.RxfLho.rst b/Misc/NEWS.d/next/Build/2022-01-26-22-59-12.bpo-38472.RxfLho.rst deleted file mode 100644 index 4e0ee70bdc513..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-01-26-22-59-12.bpo-38472.RxfLho.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix GCC detection in setup.py when cross-compiling. The C compiler is now -run with LC_ALL=C. Previously, the detection failed with a German locale. diff --git a/Misc/NEWS.d/next/Build/2022-02-01-14-07-37.bpo-46600.NNLnfj.rst b/Misc/NEWS.d/next/Build/2022-02-01-14-07-37.bpo-46600.NNLnfj.rst deleted file mode 100644 index 1fab655f9b271..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-02-01-14-07-37.bpo-46600.NNLnfj.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix the test checking if the C compiler supports ``-Og`` option in the -``./configure`` script to also use ``-Og`` on clang which supports it. Patch -by Victor Stinner. diff --git a/Misc/NEWS.d/next/Build/2022-02-02-02-06-07.bpo-46602.8GaOZ2.rst b/Misc/NEWS.d/next/Build/2022-02-02-02-06-07.bpo-46602.8GaOZ2.rst deleted file mode 100644 index a1123b44ecd59..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-02-02-02-06-07.bpo-46602.8GaOZ2.rst +++ /dev/null @@ -1 +0,0 @@ -Tidied up configure.ac so that conftest.c is truncated rather than appended. This assists in the case where the 'rm' of conftest.c fails to happen between tests. Downstream issues such as a clobbered SOABI can result. \ No newline at end of file diff --git a/Misc/NEWS.d/next/C API/2020-09-11-02-50-41.bpo-14916.QN1Y03.rst b/Misc/NEWS.d/next/C API/2020-09-11-02-50-41.bpo-14916.QN1Y03.rst deleted file mode 100644 index 885cfc53aba38..0000000000000 --- a/Misc/NEWS.d/next/C API/2020-09-11-02-50-41.bpo-14916.QN1Y03.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed bug in the tokenizer that prevented ``PyRun_InteractiveOne`` from parsing from the provided FD. diff --git a/Misc/NEWS.d/next/C API/2021-10-18-16-54-24.bpo-45459.Y1pEZs.rst b/Misc/NEWS.d/next/C API/2021-10-18-16-54-24.bpo-45459.Y1pEZs.rst deleted file mode 100644 index a8d93227817c4..0000000000000 --- a/Misc/NEWS.d/next/C API/2021-10-18-16-54-24.bpo-45459.Y1pEZs.rst +++ /dev/null @@ -1,2 +0,0 @@ -:c:type:`Py_buffer` and various ``Py_buffer`` related functions are now -part of the limited API and stable ABI. diff --git a/Misc/NEWS.d/next/C API/2022-01-19-16-51-54.bpo-46433.Er9ApS.rst b/Misc/NEWS.d/next/C API/2022-01-19-16-51-54.bpo-46433.Er9ApS.rst deleted file mode 100644 index e1987c4536b5c..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-01-19-16-51-54.bpo-46433.Er9ApS.rst +++ /dev/null @@ -1,2 +0,0 @@ -The internal function _PyType_GetModuleByDef now correctly handles -inheritance patterns involving static types. diff --git a/Misc/NEWS.d/next/C API/2022-01-27-02-37-18.bpo-40170.XxQB0i.rst b/Misc/NEWS.d/next/C API/2022-01-27-02-37-18.bpo-40170.XxQB0i.rst deleted file mode 100644 index 7b743827bb168..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-01-27-02-37-18.bpo-40170.XxQB0i.rst +++ /dev/null @@ -1,2 +0,0 @@ -Move _Py_GetAllocatedBlocks() and _PyObject_DebugMallocStats() private -functions to the internal C API. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2022-01-27-02-51-22.bpo-40170.uPolek.rst b/Misc/NEWS.d/next/C API/2022-01-27-02-51-22.bpo-40170.uPolek.rst deleted file mode 100644 index 6b185f0284e65..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-01-27-02-51-22.bpo-40170.uPolek.rst +++ /dev/null @@ -1,4 +0,0 @@ -Remove the ``PyHeapType_GET_MEMBERS()`` macro. It was exposed in the public C -API by mistake, it must only be used by Python internally. Use the -``PyTypeObject.tp_members`` member instead. Patch by Victor Stinner. - diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-04-21-55-49.bpo-44024.M9m8Qd.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-04-21-55-49.bpo-44024.M9m8Qd.rst deleted file mode 100644 index 5037413353d28..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-04-21-55-49.bpo-44024.M9m8Qd.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve the exc:`TypeError` message for non-string second arguments passed to -the built-in functions :func:`getattr` and :func:`hasattr`. Patch by G?ry Ogam. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-12-11-11-36-48.bpo-46045.sfThay.rst b/Misc/NEWS.d/next/Core and Builtins/2021-12-11-11-36-48.bpo-46045.sfThay.rst deleted file mode 100644 index 97fd1883eb2ab..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-12-11-11-36-48.bpo-46045.sfThay.rst +++ /dev/null @@ -1 +0,0 @@ -Do not use POSIX semaphores on NetBSD diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-12-12-00-49-19.bpo-30512.nU9E9V.rst b/Misc/NEWS.d/next/Core and Builtins/2021-12-12-00-49-19.bpo-30512.nU9E9V.rst deleted file mode 100644 index da2ce12fec15d..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-12-12-00-49-19.bpo-30512.nU9E9V.rst +++ /dev/null @@ -1 +0,0 @@ -Add CAN Socket support for NetBSD. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-12-16-00-24-00.bpo-46091.rJ_e_e.rst b/Misc/NEWS.d/next/Core and Builtins/2021-12-16-00-24-00.bpo-46091.rJ_e_e.rst deleted file mode 100644 index a2eee0f3ebd51..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-12-16-00-24-00.bpo-46091.rJ_e_e.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correctly calculate indentation levels for lines with whitespace character -that are ended by line continuation characters. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-12-16-15-04-58.bpo-46028.zfWacB.rst b/Misc/NEWS.d/next/Core and Builtins/2021-12-16-15-04-58.bpo-46028.zfWacB.rst deleted file mode 100644 index cc34c0fa2405b..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-12-16-15-04-58.bpo-46028.zfWacB.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixes calculation of :data:`sys._base_executable` when inside a virtual -environment that uses symlinks with different binary names than the base -environment provides. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-12-23-12-32-45.bpo-46161.EljBmu.rst b/Misc/NEWS.d/next/Core and Builtins/2021-12-23-12-32-45.bpo-46161.EljBmu.rst deleted file mode 100644 index 3eeb358c52080..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-12-23-12-32-45.bpo-46161.EljBmu.rst +++ /dev/null @@ -1 +0,0 @@ -Fix the class building error when the arguments are constants and CALL_FUNCTION_EX is used. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-12-17-15-17.bpo-46361.mgI_j_.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-12-17-15-17.bpo-46361.mgI_j_.rst deleted file mode 100644 index eef877d5cbd8f..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-12-17-15-17.bpo-46361.mgI_j_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Ensure that "small" integers created by :meth:`int.from_bytes` and -:class:`decimal.Decimal` are properly cached. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-14-20-55-34.bpo-46383.v8MTl4.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-14-20-55-34.bpo-46383.v8MTl4.rst deleted file mode 100644 index 8f8b12732a690..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-14-20-55-34.bpo-46383.v8MTl4.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix invalid signature of ``_zoneinfo``'s ``module_free`` function to resolve -a crash on wasm32-emscripten platform. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-16-15-40-11.bpo-46406.g0mke-.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-16-15-40-11.bpo-46406.g0mke-.rst deleted file mode 100644 index 20d1e08bfd48b..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-16-15-40-11.bpo-46406.g0mke-.rst +++ /dev/null @@ -1,3 +0,0 @@ -The integer division ``//`` implementation has been optimized to better let the -compiler understand its constraints. It can be 20% faster on the amd64 platform -when dividing an int by a value smaller than ``2**30``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-17-12-57-27.bpo-46409.HouS6m.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-17-12-57-27.bpo-46409.HouS6m.rst deleted file mode 100644 index aa61bc5201118..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-17-12-57-27.bpo-46409.HouS6m.rst +++ /dev/null @@ -1,6 +0,0 @@ -Add new ``RETURN_GENERATOR`` bytecode to make generators. -Simplifies calling Python functions in the VM, as they no -longer any need to special case generator functions. - -Also add ``JUMP_NO_INTERRUPT`` bytecode that acts like -``JUMP_ABSOLUTE``, but does not check for interrupts. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-17-23-12-01.bpo-46407.2_5a7R.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-17-23-12-01.bpo-46407.2_5a7R.rst deleted file mode 100644 index e7f555f1ffc2f..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-17-23-12-01.bpo-46407.2_5a7R.rst +++ /dev/null @@ -1 +0,0 @@ -Optimize some modulo operations in ``Objects/longobject.c``. Patch by Jeremiah Vivian. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-20-17-13-49.bpo-43683.BqQ26Z.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-20-17-13-49.bpo-43683.BqQ26Z.rst deleted file mode 100644 index 737f44f296cb1..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-20-17-13-49.bpo-43683.BqQ26Z.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add ASYNC_GEN_WRAP opcode to wrap the value to be yielded in async -generators. Removes the need to special case async generators in the -``YIELD_VALUE`` instruction. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-21-12-24-14.bpo-46417.i3IqMf.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-21-12-24-14.bpo-46417.i3IqMf.rst deleted file mode 100644 index c7e2ee33500d9..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-21-12-24-14.bpo-46417.i3IqMf.rst +++ /dev/null @@ -1,3 +0,0 @@ -``python -X showrefcount`` now shows the total reference count after clearing -and destroyed the main Python interpreter. Previously, it was shown before. -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-22-14-39-23.bpo-46417.3U5SfN.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-22-14-39-23.bpo-46417.3U5SfN.rst deleted file mode 100644 index 54fe09b7ba454..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-22-14-39-23.bpo-46417.3U5SfN.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fix a race condition on setting a type ``__bases__`` attribute: the internal -function ``add_subclass()`` now gets the ``PyTypeObject.tp_subclasses`` -member after calling :c:func:`PyWeakref_NewRef` which can trigger a garbage -collection which can indirectly modify ``PyTypeObject.tp_subclasses``. Patch -by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-23-06-56-33.bpo-46481.X_FfnB.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-23-06-56-33.bpo-46481.X_FfnB.rst deleted file mode 100644 index edab2eb014430..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-23-06-56-33.bpo-46481.X_FfnB.rst +++ /dev/null @@ -1,2 +0,0 @@ -Speed up calls to :meth:`weakref.ref.__call__` by using the :pep:`590` -``vectorcall`` calling convention. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-24-15-39-34.bpo-46476.cvP1Mr.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-24-15-39-34.bpo-46476.cvP1Mr.rst deleted file mode 100644 index 26079839a5f25..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-24-15-39-34.bpo-46476.cvP1Mr.rst +++ /dev/null @@ -1 +0,0 @@ -Fix memory leak in code objects generated by deepfreeze. Patch by Kumar Aditya. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-24-16-58-01.bpo-46431.N6mKAx.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-24-16-58-01.bpo-46431.N6mKAx.rst deleted file mode 100644 index 3a2af9df03c38..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-24-16-58-01.bpo-46431.N6mKAx.rst +++ /dev/null @@ -1 +0,0 @@ -Improve error message on invalid calls to :meth:`BaseExceptionGroup.__new__`. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-24-21-24-41.bpo-46503.4UrPsE.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-24-21-24-41.bpo-46503.4UrPsE.rst deleted file mode 100644 index e48028d72ca8e..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-24-21-24-41.bpo-46503.4UrPsE.rst +++ /dev/null @@ -1 +0,0 @@ -Fix an assert when parsing some invalid \N escape sequences in f-strings. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-25-11-44-17.bpo-46329.SEhynE.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-25-11-44-17.bpo-46329.SEhynE.rst deleted file mode 100644 index 43332975dc042..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-25-11-44-17.bpo-46329.SEhynE.rst +++ /dev/null @@ -1,12 +0,0 @@ -Use two or three bytecodes to implement most calls. - -Calls without named arguments are implemented as a sequence of two -instructions: ``PRECALL; CALL``. Calls with named arguments are implemented -as a sequence of three instructions: ``PRECALL; KW_NAMES; CALL``. There are -two different ``PRECALL`` instructions: ``PRECALL_FUNTION`` and -``PRECALL_METHOD``. The latter pairs with ``LOAD_METHOD``. - -This partition into pre-call and call allows better specialization, and thus -better performance ultimately. - -There is no change in semantics. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-25-17-40-07.bpo-46528.2Qmni9.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-25-17-40-07.bpo-46528.2Qmni9.rst deleted file mode 100644 index f1639f8b3f06e..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-25-17-40-07.bpo-46528.2Qmni9.rst +++ /dev/null @@ -1,3 +0,0 @@ -Replace several stack manipulation instructions (``DUP_TOP``, -``DUP_TOP_TWO``, ``ROT_TWO``, ``ROT_THREE``, ``ROT_FOUR``, and ``ROT_N``) -with new :opcode:`COPY` and :opcode:`SWAP` instructions. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-25-19-34-55.bpo-46527.mQLNPk.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-25-19-34-55.bpo-46527.mQLNPk.rst deleted file mode 100644 index c9fd0ed05e2ae..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-25-19-34-55.bpo-46527.mQLNPk.rst +++ /dev/null @@ -1,2 +0,0 @@ -Allow passing ``iterable`` as a keyword argument to :func:`enumerate` again. -Patch by Jelle Zijlstra. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-27-10-49-34.bpo-46458.5Gm3Gv.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-27-10-49-34.bpo-46458.5Gm3Gv.rst deleted file mode 100644 index 25f9ca3b45422..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-27-10-49-34.bpo-46458.5Gm3Gv.rst +++ /dev/null @@ -1,4 +0,0 @@ -Reorder code emitted by the compiler for a :keyword:`try`-:keyword:`except` -block so that the :keyword:`else` block's code immediately follows the -:keyword:`try` body (without a jump). This is more optimal for the happy -path. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-30-18-23-08.bpo-44977.BQV_zS.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-30-18-23-08.bpo-44977.BQV_zS.rst deleted file mode 100644 index 84c1191bdbd31..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-30-18-23-08.bpo-44977.BQV_zS.rst +++ /dev/null @@ -1,3 +0,0 @@ -The delegation of :func:`int` to :meth:`__trunc__` is now deprecated. -Calling ``int(a)`` when ``type(a)`` implements :meth:`__trunc__` but not -:meth:`__int__` or :meth:`__index__` now raises a :exc:`DeprecationWarning`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-01-01-17-28.bpo-45885.CjyNf_.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-01-01-17-28.bpo-45885.CjyNf_.rst deleted file mode 100644 index 6395bd1f18d5e..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-02-01-01-17-28.bpo-45885.CjyNf_.rst +++ /dev/null @@ -1 +0,0 @@ -Added more fined-grained specialization failure stats regarding the ``COMPARE_OP`` bytecode. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-01-10-23-21.bpo-46564.6Xc2_H.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-01-10-23-21.bpo-46564.6Xc2_H.rst deleted file mode 100644 index 4ffa6800989d7..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-02-01-10-23-21.bpo-46564.6Xc2_H.rst +++ /dev/null @@ -1 +0,0 @@ -Do not create frame objects when creating :class:`super` object. Patch by Kumar Aditya. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-01-14-30-56.bpo-45773.Up77LD.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-01-14-30-56.bpo-45773.Up77LD.rst deleted file mode 100644 index 45da5116fc940..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-02-01-14-30-56.bpo-45773.Up77LD.rst +++ /dev/null @@ -1 +0,0 @@ -Remove two invalid "peephole" optimizations from the bytecode compiler. diff --git a/Misc/NEWS.d/next/Documentation/2022-01-21-21-33-48.bpo-46463.fBbdTG.rst b/Misc/NEWS.d/next/Documentation/2022-01-21-21-33-48.bpo-46463.fBbdTG.rst deleted file mode 100644 index d418190bb8fc8..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-01-21-21-33-48.bpo-46463.fBbdTG.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixes :file:`escape4chm.py` script used when building the CHM documentation -file diff --git a/Misc/NEWS.d/next/IDLE/2022-01-26-19-33-55.bpo-45296.LzZKdU.rst b/Misc/NEWS.d/next/IDLE/2022-01-26-19-33-55.bpo-45296.LzZKdU.rst deleted file mode 100644 index a5b0f8b4ffa80..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2022-01-26-19-33-55.bpo-45296.LzZKdU.rst +++ /dev/null @@ -1,4 +0,0 @@ -Clarify close, quit, and exit in IDLE. In the File menu, 'Close' and 'Exit' -are now 'Close Window' (the current one) and 'Exit' is now 'Exit IDLE' -(by closing all windows). In Shell, 'quit()' and 'exit()' mean 'close Shell'. -If there are no other windows, this also exits IDLE. diff --git a/Misc/NEWS.d/next/Library/2021-07-31-23-18-50.bpo-44791.4jFdpO.rst b/Misc/NEWS.d/next/Library/2021-07-31-23-18-50.bpo-44791.4jFdpO.rst deleted file mode 100644 index 8182aa4e5358a..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-31-23-18-50.bpo-44791.4jFdpO.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fix substitution of :class:`~typing.ParamSpec` in -:data:`~typing.Concatenate` with different parameter expressions. -Substitution with a list of types returns now a tuple of types. Substitution -with ``Concatenate`` returns now a ``Concatenate`` with concatenated lists -of arguments. diff --git a/Misc/NEWS.d/next/Library/2021-12-15-06-29-00.bpo-46080.AuQpLt.rst b/Misc/NEWS.d/next/Library/2021-12-15-06-29-00.bpo-46080.AuQpLt.rst deleted file mode 100644 index e42d84e31e759..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-12-15-06-29-00.bpo-46080.AuQpLt.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix exception in argparse help text generation if a -:class:`argparse.BooleanOptionalAction` argument's default is -``argparse.SUPPRESS`` and it has ``help`` specified. Patch by Felix Fontein. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-12-16-23-42-54.bpo-46103.LMnZAN.rst b/Misc/NEWS.d/next/Library/2021-12-16-23-42-54.bpo-46103.LMnZAN.rst deleted file mode 100644 index 3becbc3de8fc2..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-12-16-23-42-54.bpo-46103.LMnZAN.rst +++ /dev/null @@ -1,2 +0,0 @@ -Now :func:`inspect.getmembers` only gets :attr:`__bases__` attribute from -class type. Patch by Weipeng Hong. diff --git a/Misc/NEWS.d/next/Library/2021-12-18-18-41-30.bpo-46124.ESPrb7.rst b/Misc/NEWS.d/next/Library/2021-12-18-18-41-30.bpo-46124.ESPrb7.rst deleted file mode 100644 index 26f9f81303a96..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-12-18-18-41-30.bpo-46124.ESPrb7.rst +++ /dev/null @@ -1 +0,0 @@ -Update :mod:`zoneinfo` to rely on importlib.resources traversable API. diff --git a/Misc/NEWS.d/next/Library/2021-12-28-11-55-10.bpo-21987.avBK-p.rst b/Misc/NEWS.d/next/Library/2021-12-28-11-55-10.bpo-21987.avBK-p.rst deleted file mode 100644 index 305dd16d53b49..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-12-28-11-55-10.bpo-21987.avBK-p.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix an issue with :meth:`tarfile.TarFile.getmember` getting a directory name -with a trailing slash. diff --git a/Misc/NEWS.d/next/Library/2021-12-29-13-42-55.bpo-26552.1BqeAn.rst b/Misc/NEWS.d/next/Library/2021-12-29-13-42-55.bpo-26552.1BqeAn.rst deleted file mode 100644 index 85b6a64ef53d1..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-12-29-13-42-55.bpo-26552.1BqeAn.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed case where failing :func:`asyncio.ensure_future` did not close the coroutine. Patch by Kumar Aditya. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-12-29-14-42-09.bpo-43118.BoVi_5.rst b/Misc/NEWS.d/next/Library/2021-12-29-14-42-09.bpo-43118.BoVi_5.rst deleted file mode 100644 index a37c22cd78c09..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-12-29-14-42-09.bpo-43118.BoVi_5.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix a bug in :func:`inspect.signature` that was causing it to fail on some -subclasses of classes with a ``__text_signature__`` referencing module -globals. Patch by Weipeng Hong. diff --git a/Misc/NEWS.d/next/Library/2022-01-03-16-25-06.bpo-46242.f4l_CL.rst b/Misc/NEWS.d/next/Library/2022-01-03-16-25-06.bpo-46242.f4l_CL.rst deleted file mode 100644 index 6a5b5fdffda40..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-03-16-25-06.bpo-46242.f4l_CL.rst +++ /dev/null @@ -1 +0,0 @@ -Improve error message when creating a new :class:`enum.Enum` type subclassing an existing ``Enum`` with ``_member_names_`` using :meth:`enum.Enum.__call__`. diff --git a/Misc/NEWS.d/next/Library/2022-01-04-18-05-25.bpo-46258.DYgwRo.rst b/Misc/NEWS.d/next/Library/2022-01-04-18-05-25.bpo-46258.DYgwRo.rst deleted file mode 100644 index b918ed1a5d9e0..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-04-18-05-25.bpo-46258.DYgwRo.rst +++ /dev/null @@ -1,2 +0,0 @@ -Speed up :func:`math.isqrt` for small positive integers by replacing two -division steps with a lookup table. diff --git a/Misc/NEWS.d/next/Library/2022-01-05-03-09-29.bpo-43012.RVhLIL.rst b/Misc/NEWS.d/next/Library/2022-01-05-03-09-29.bpo-43012.RVhLIL.rst deleted file mode 100644 index c6a6723a96b34..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-05-03-09-29.bpo-43012.RVhLIL.rst +++ /dev/null @@ -1,2 +0,0 @@ -The pathlib module's obsolete and internal ``_Accessor`` class has been -removed to prepare the terrain for upcoming enhancements to the module. diff --git a/Misc/NEWS.d/next/Library/2022-01-05-03-21-21.bpo-29688.W06bSH.rst b/Misc/NEWS.d/next/Library/2022-01-05-03-21-21.bpo-29688.W06bSH.rst deleted file mode 100644 index 1a202e59b075e..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-05-03-21-21.bpo-29688.W06bSH.rst +++ /dev/null @@ -1 +0,0 @@ -Document :meth:`pathlib.Path.absolute` (which has always existed). diff --git a/Misc/NEWS.d/next/Library/2022-01-09-15-04-56.bpo-46316.AMTyd0.rst b/Misc/NEWS.d/next/Library/2022-01-09-15-04-56.bpo-46316.AMTyd0.rst deleted file mode 100644 index 09acb77855f15..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-09-15-04-56.bpo-46316.AMTyd0.rst +++ /dev/null @@ -1 +0,0 @@ -Optimize :meth:`pathlib.Path.iterdir` by removing an unnecessary check for special entries. diff --git a/Misc/NEWS.d/next/Library/2022-01-13-11-41-24.bpo-40066.1QuVli.rst b/Misc/NEWS.d/next/Library/2022-01-13-11-41-24.bpo-40066.1QuVli.rst deleted file mode 100644 index 2df487855785e..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-13-11-41-24.bpo-40066.1QuVli.rst +++ /dev/null @@ -1,2 +0,0 @@ -``IntEnum``, ``IntFlag``, and ``StrEnum`` use the mixed-in type for their -``str()`` and ``format()`` output. diff --git a/Misc/NEWS.d/next/Library/2022-01-16-14-07-14.bpo-40280.LtFHfF.rst b/Misc/NEWS.d/next/Library/2022-01-16-14-07-14.bpo-40280.LtFHfF.rst deleted file mode 100644 index f5d76760678f6..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-16-14-07-14.bpo-40280.LtFHfF.rst +++ /dev/null @@ -1,4 +0,0 @@ -:mod:`subprocess` now imports Windows-specific imports when -``msvcrt`` module is available, and POSIX-specific imports on all other -platforms. This gives a clean exception when ``_posixsubprocess`` is not -available (e.g. Emscripten browser target). diff --git a/Misc/NEWS.d/next/Library/2022-01-17-10-00-02.bpo-46414.Ld0b_y.rst b/Misc/NEWS.d/next/Library/2022-01-17-10-00-02.bpo-46414.Ld0b_y.rst deleted file mode 100644 index 0fdbfa77d9bc8..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-17-10-00-02.bpo-46414.Ld0b_y.rst +++ /dev/null @@ -1 +0,0 @@ -Add :func:`typing.reveal_type`. Patch by Jelle Zijlstra. diff --git a/Misc/NEWS.d/next/Library/2022-01-18-17-24-21.bpo-43869.NayN12.rst b/Misc/NEWS.d/next/Library/2022-01-18-17-24-21.bpo-43869.NayN12.rst deleted file mode 100644 index 5486c95b0689b..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-18-17-24-21.bpo-43869.NayN12.rst +++ /dev/null @@ -1,2 +0,0 @@ -Python uses the same time Epoch on all platforms. Add an explicit unit test -to ensure that it's the case. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2022-01-20-10-35-10.bpo-46434.geS-aP.rst b/Misc/NEWS.d/next/Library/2022-01-20-10-35-10.bpo-46434.geS-aP.rst deleted file mode 100644 index 6000781fa5aea..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-20-10-35-10.bpo-46434.geS-aP.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`pdb` now gracefully handles ``help`` when :attr:`__doc__` is missing, -for example when run with pregenerated optimized ``.pyc`` files. diff --git a/Misc/NEWS.d/next/Library/2022-01-20-10-35-50.bpo-46422.1UAEHL.rst b/Misc/NEWS.d/next/Library/2022-01-20-10-35-50.bpo-46422.1UAEHL.rst deleted file mode 100644 index 831f526359062..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-20-10-35-50.bpo-46422.1UAEHL.rst +++ /dev/null @@ -1 +0,0 @@ -Use ``dis.Positions`` in ``dis.Instruction`` instead of a regular ``tuple``. diff --git a/Misc/NEWS.d/next/Library/2022-01-21-18-19-45.bpo-41906.YBaquj.rst b/Misc/NEWS.d/next/Library/2022-01-21-18-19-45.bpo-41906.YBaquj.rst deleted file mode 100644 index be707130875f2..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-21-18-19-45.bpo-41906.YBaquj.rst +++ /dev/null @@ -1,2 +0,0 @@ -Support passing filter instances in the ``filters`` values of ``handlers`` and -``loggers`` in the dictionary passed to :func:`logging.config.dictConfig`. diff --git a/Misc/NEWS.d/next/Library/2022-01-22-05-05-08.bpo-46469.plUab5.rst b/Misc/NEWS.d/next/Library/2022-01-22-05-05-08.bpo-46469.plUab5.rst deleted file mode 100644 index 0d0e4b5d3d735..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-22-05-05-08.bpo-46469.plUab5.rst +++ /dev/null @@ -1 +0,0 @@ -:mod:`asyncio` generic classes now return :class:`types.GenericAlias` in ``__class_getitem__`` instead of the same class. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2022-01-22-13-17-35.bpo-46470.MnNhgU.rst b/Misc/NEWS.d/next/Library/2022-01-22-13-17-35.bpo-46470.MnNhgU.rst deleted file mode 100644 index 45b9cea3cd56a..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-22-13-17-35.bpo-46470.MnNhgU.rst +++ /dev/null @@ -1 +0,0 @@ -Remove unused branch from ``typing._remove_dups_flatten`` diff --git a/Misc/NEWS.d/next/Library/2022-01-22-14-45-46.bpo-46474.2DUC62.rst b/Misc/NEWS.d/next/Library/2022-01-22-14-45-46.bpo-46474.2DUC62.rst deleted file mode 100644 index a5eafdf30f148..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-22-14-45-46.bpo-46474.2DUC62.rst +++ /dev/null @@ -1,2 +0,0 @@ -Removed private method from ``importlib.metadata.Path``. Sync with -importlib_metadata 4.10.0. diff --git a/Misc/NEWS.d/next/Library/2022-01-22-14-49-10.bpo-46474.eKQhvx.rst b/Misc/NEWS.d/next/Library/2022-01-22-14-49-10.bpo-46474.eKQhvx.rst deleted file mode 100644 index 156b7de4f6787..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-22-14-49-10.bpo-46474.eKQhvx.rst +++ /dev/null @@ -1,2 +0,0 @@ -In ``importlib.metadata.EntryPoint.pattern``, avoid potential REDoS by -limiting ambiguity in consecutive whitespace. diff --git a/Misc/NEWS.d/next/Library/2022-01-23-18-04-45.bpo-41403.SgoHqV.rst b/Misc/NEWS.d/next/Library/2022-01-23-18-04-45.bpo-41403.SgoHqV.rst deleted file mode 100644 index ede159b25641f..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-23-18-04-45.bpo-41403.SgoHqV.rst +++ /dev/null @@ -1,3 +0,0 @@ -Make :meth:`mock.patch` raise a :exc:`TypeError` with a relevant error -message on invalid arg. Previously it allowed a cryptic -:exc:`AttributeError` to escape. diff --git a/Misc/NEWS.d/next/Library/2022-01-23-19-37-00.bpo-46436.Biz1p9.rst b/Misc/NEWS.d/next/Library/2022-01-23-19-37-00.bpo-46436.Biz1p9.rst deleted file mode 100644 index ccfd949506443..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-23-19-37-00.bpo-46436.Biz1p9.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix command-line option ``-d``/``--directory`` in module :mod:`http.server` -which is ignored when combined with command-line option ``--cgi``. Patch by -G?ry Ogam. diff --git a/Misc/NEWS.d/next/Library/2022-01-24-13-00-09.bpo-46483.9XnmKp.rst b/Misc/NEWS.d/next/Library/2022-01-24-13-00-09.bpo-46483.9XnmKp.rst deleted file mode 100644 index 89cc818a9c59d..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-24-13-00-09.bpo-46483.9XnmKp.rst +++ /dev/null @@ -1 +0,0 @@ -Remove :meth:`~object.__class_getitem__` from :class:`pathlib.PurePath` as this class was not supposed to be generic. diff --git a/Misc/NEWS.d/next/Library/2022-01-24-23-55-30.bpo-46491.jmIKHo.rst b/Misc/NEWS.d/next/Library/2022-01-24-23-55-30.bpo-46491.jmIKHo.rst deleted file mode 100644 index f66e8868f753f..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-24-23-55-30.bpo-46491.jmIKHo.rst +++ /dev/null @@ -1 +0,0 @@ -Allow :data:`typing.Annotated` to wrap :data:`typing.Final` and :data:`typing.ClassVar`. Patch by Gregory Beauregard. diff --git a/Misc/NEWS.d/next/Library/2022-01-25-10-59-41.bpo-46510.PM5svI.rst b/Misc/NEWS.d/next/Library/2022-01-25-10-59-41.bpo-46510.PM5svI.rst deleted file mode 100644 index b416a1692270b..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-25-10-59-41.bpo-46510.PM5svI.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add missing test for :class:`types.TracebackType` and -:class:`types.FrameType`. Calculate them directly from the caught exception -without calling :func:`sys.exc_info`. diff --git a/Misc/NEWS.d/next/Library/2022-01-26-20-36-30.bpo-46539.23iW1d.rst b/Misc/NEWS.d/next/Library/2022-01-26-20-36-30.bpo-46539.23iW1d.rst deleted file mode 100644 index 2bdde21b6e58e..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-26-20-36-30.bpo-46539.23iW1d.rst +++ /dev/null @@ -1 +0,0 @@ -In :func:`typing.get_type_hints`, support evaluating stringified ``ClassVar`` and ``Final`` annotations inside ``Annotated``. Patch by Gregory Beauregard. diff --git a/Misc/NEWS.d/next/Library/2022-01-26-23-58-48.bpo-45162.4Jmg_j.rst b/Misc/NEWS.d/next/Library/2022-01-26-23-58-48.bpo-45162.4Jmg_j.rst deleted file mode 100644 index 29fee1ef9ce59..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-26-23-58-48.bpo-45162.4Jmg_j.rst +++ /dev/null @@ -1,3 +0,0 @@ -The deprecated :mod:`unittest` APIs removed in 3.11a1 have been -temporarily restored to be removed in 3.12 while cleanups in external -projects go in. diff --git a/Misc/NEWS.d/next/Library/2022-01-27-11-16-59.bpo-45173.wreRF2.rst b/Misc/NEWS.d/next/Library/2022-01-27-11-16-59.bpo-45173.wreRF2.rst deleted file mode 100644 index ee5a88f621498..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-27-11-16-59.bpo-45173.wreRF2.rst +++ /dev/null @@ -1 +0,0 @@ -Note the configparser deprecations will be removed in Python 3.12. diff --git a/Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst b/Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst deleted file mode 100644 index adbc50a4bf9b7..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-27-12-24-38.bpo-46487.UDkN2z.rst +++ /dev/null @@ -1 +0,0 @@ -Add the ``get_write_buffer_limits`` method to :class:`asyncio.transports.WriteTransport` and to the SSL transport. diff --git a/Misc/NEWS.d/next/Library/2022-01-27-13-30-02.bpo-46544.oFDVWj.rst b/Misc/NEWS.d/next/Library/2022-01-27-13-30-02.bpo-46544.oFDVWj.rst deleted file mode 100644 index 63b47e55f1b18..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-27-13-30-02.bpo-46544.oFDVWj.rst +++ /dev/null @@ -1,2 +0,0 @@ -Don't leak ``x`` & ``uspace`` intermediate vars in -:class:`textwrap.TextWrapper`. diff --git a/Misc/NEWS.d/next/Library/2022-01-28-08-47-53.bpo-46553.f7Uc96.rst b/Misc/NEWS.d/next/Library/2022-01-28-08-47-53.bpo-46553.f7Uc96.rst deleted file mode 100644 index 2c03912afcb45..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-28-08-47-53.bpo-46553.f7Uc96.rst +++ /dev/null @@ -1 +0,0 @@ -In :func:`typing.get_type_hints`, support evaluating bare stringified ``ClassVar`` annotations. Patch by Gregory Beauregard. diff --git a/Misc/NEWS.d/next/Library/2022-01-28-19-48-31.bpo-46565.bpZXO4.rst b/Misc/NEWS.d/next/Library/2022-01-28-19-48-31.bpo-46565.bpZXO4.rst deleted file mode 100644 index 9b0969ea5897b..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-28-19-48-31.bpo-46565.bpZXO4.rst +++ /dev/null @@ -1 +0,0 @@ -Remove loop variables that are leaking into modules' namespaces. diff --git a/Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst b/Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst deleted file mode 100644 index 7785faa1c4cbf..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-31-15-40-38.bpo-46591.prBD1M.rst +++ /dev/null @@ -1 +0,0 @@ -Make the IDLE doc URL on the About IDLE dialog clickable. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2022-02-03-12-07-41.bpo-46624.f_Qqh0.rst b/Misc/NEWS.d/next/Library/2022-02-03-12-07-41.bpo-46624.f_Qqh0.rst deleted file mode 100644 index b0203b9a8b50c..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-02-03-12-07-41.bpo-46624.f_Qqh0.rst +++ /dev/null @@ -1 +0,0 @@ -Restore support for non-integer arguments of :func:`random.randrange` and :func:`random.randint`. diff --git a/Misc/NEWS.d/next/Tests/2021-12-18-22-23-50.bpo-46126.0LH3Yb.rst b/Misc/NEWS.d/next/Tests/2021-12-18-22-23-50.bpo-46126.0LH3Yb.rst deleted file mode 100644 index b7360b36454ea..0000000000000 --- a/Misc/NEWS.d/next/Tests/2021-12-18-22-23-50.bpo-46126.0LH3Yb.rst +++ /dev/null @@ -1 +0,0 @@ -Disable 'descriptions' when running tests internally. diff --git a/Misc/NEWS.d/next/Tests/2022-01-14-23-22-41.bpo-40280.nHLWoD.rst b/Misc/NEWS.d/next/Tests/2022-01-14-23-22-41.bpo-40280.nHLWoD.rst deleted file mode 100644 index 67134f1191cd2..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-01-14-23-22-41.bpo-40280.nHLWoD.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add :func:`test.support.requires_subprocess` decorator to mark tests which -require working :mod:`subprocess` module or ``os.spawn*``. The -wasm32-emscripten platform has no support for processes. diff --git a/Misc/NEWS.d/next/Tests/2022-01-16-14-11-57.bpo-40280.fNnFfx.rst b/Misc/NEWS.d/next/Tests/2022-01-16-14-11-57.bpo-40280.fNnFfx.rst deleted file mode 100644 index 2d66db1210854..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-01-16-14-11-57.bpo-40280.fNnFfx.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :func:`test.support.requires_fork` decorators to mark tests that require -a working :func:`os.fork`. diff --git a/Misc/NEWS.d/next/Tests/2022-01-17-13-10-04.bpo-13886.5mZH4b.rst b/Misc/NEWS.d/next/Tests/2022-01-17-13-10-04.bpo-13886.5mZH4b.rst deleted file mode 100644 index cd19dce37d5c8..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-01-17-13-10-04.bpo-13886.5mZH4b.rst +++ /dev/null @@ -1,3 +0,0 @@ -Skip test_builtin PTY tests on non-ASCII characters if the readline module -is loaded. The readline module changes input() behavior, but test_builtin is -not intented to test the readline module. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2022-01-28-01-17-10.bpo-46542.xRLTdj.rst b/Misc/NEWS.d/next/Tests/2022-01-28-01-17-10.bpo-46542.xRLTdj.rst deleted file mode 100644 index c6b64ce017b6c..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-01-28-01-17-10.bpo-46542.xRLTdj.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``test_json`` tests checking for :exc:`RecursionError`: modify these tests -to use ``support.infinite_recursion()``. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst b/Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst deleted file mode 100644 index be50fc8cbe0a5..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-01-29-12-37-53.bpo-46576.-prRaV.rst +++ /dev/null @@ -1,3 +0,0 @@ -test_peg_generator now disables compiler optimization when testing -compilation of its own C extensions to significantly speed up the -testing on non-debug builds of CPython. diff --git a/Misc/NEWS.d/next/Tests/2022-01-31-17-34-13.bpo-46542.RTMm1T.rst b/Misc/NEWS.d/next/Tests/2022-01-31-17-34-13.bpo-46542.RTMm1T.rst deleted file mode 100644 index 5596498724930..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-01-31-17-34-13.bpo-46542.RTMm1T.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a Python crash in test_lib2to3 when using Python built in debug mode: -limit the recursion limit. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2022-02-01-17-13-53.bpo-46600.FMCk8Z.rst b/Misc/NEWS.d/next/Tests/2022-02-01-17-13-53.bpo-46600.FMCk8Z.rst deleted file mode 100644 index 0ae1d4d181d42..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-02-01-17-13-53.bpo-46600.FMCk8Z.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix test_gdb.test_pycfunction() for Python built with ``clang -Og``. -Tolerate inlined functions in the gdb traceback. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst b/Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst deleted file mode 100644 index 00c29b1ca4089..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-02-02-02-24-04.bpo-44359.kPPSmN.rst +++ /dev/null @@ -1,2 +0,0 @@ -test_ftplib now silently ignores socket errors to prevent logging unhandled -threading exceptions. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst b/Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst deleted file mode 100644 index 31c63c3d8f181..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-02-02-18-14-38.bpo-46616.URvBtE.rst +++ /dev/null @@ -1,2 +0,0 @@ -Ensures ``test_importlib.test_windows`` cleans up registry keys after -completion. diff --git a/Misc/NEWS.d/next/Tests/2022-02-03-00-21-32.bpo-43478.0nfcam.rst b/Misc/NEWS.d/next/Tests/2022-02-03-00-21-32.bpo-43478.0nfcam.rst deleted file mode 100644 index 7c8fc47cfc751..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-02-03-00-21-32.bpo-43478.0nfcam.rst +++ /dev/null @@ -1 +0,0 @@ -Mocks can no longer be provided as the specs for other Mocks. As a result, an already-mocked object cannot be passed to `mock.Mock()`. This can uncover bugs in tests since these Mock-derived Mocks will always pass certain tests (e.g. isinstance) and builtin assert functions (e.g. assert_called_once_with) will unconditionally pass. diff --git a/Misc/NEWS.d/next/Windows/2021-09-01-10-48-11.bpo-44934.W1xPATH.rst b/Misc/NEWS.d/next/Windows/2021-09-01-10-48-11.bpo-44934.W1xPATH.rst deleted file mode 100644 index 0f1c25a0705df..0000000000000 --- a/Misc/NEWS.d/next/Windows/2021-09-01-10-48-11.bpo-44934.W1xPATH.rst +++ /dev/null @@ -1 +0,0 @@ -The installer now offers a command-line only option to add the installation directory to the end of :envvar:`PATH` instead of at the start. diff --git a/Misc/NEWS.d/next/Windows/2022-01-13-22-31-09.bpo-46362.f2cuEb.rst b/Misc/NEWS.d/next/Windows/2022-01-13-22-31-09.bpo-46362.f2cuEb.rst deleted file mode 100644 index 0b59cd28ba4fd..0000000000000 --- a/Misc/NEWS.d/next/Windows/2022-01-13-22-31-09.bpo-46362.f2cuEb.rst +++ /dev/null @@ -1,2 +0,0 @@ -os.path.abspath("C:\CON") is now fixed to return "\\.\CON", not the same path. -The regression was true of all legacy DOS devices such as COM1, LPT1, or NUL. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Windows/2022-01-25-14-48-39.bpo-33125.5WyY_J.rst b/Misc/NEWS.d/next/Windows/2022-01-25-14-48-39.bpo-33125.5WyY_J.rst deleted file mode 100644 index 54811db67add8..0000000000000 --- a/Misc/NEWS.d/next/Windows/2022-01-25-14-48-39.bpo-33125.5WyY_J.rst +++ /dev/null @@ -1,2 +0,0 @@ -The traditional EXE/MSI based installer for Windows is now available for -ARM64 diff --git a/Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst b/Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst deleted file mode 100644 index 3705266c154b7..0000000000000 --- a/Misc/NEWS.d/next/macOS/2022-01-26-12-04-09.bpo-45925.yBSiYO.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer to SQLite 3.37.2. \ No newline at end of file diff --git a/README.rst b/README.rst index dcc1c39d78a08..36611add5ccac 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.11.0 alpha 4 +This is Python version 3.11.0 alpha 5 ===================================== .. image:: https://github.com/python/cpython/workflows/Tests/badge.svg From webhook-mailer at python.org Thu Feb 3 23:40:03 2022 From: webhook-mailer at python.org (terryjreedy) Date: Fri, 04 Feb 2022 04:40:03 -0000 Subject: [Python-checkins] bpo-46588: fix typo in test_calltip.py (GH-31119) Message-ID: https://github.com/python/cpython/commit/222865daabfa7a8b12ca9a5e9c23b9ce217448f1 commit: 222865daabfa7a8b12ca9a5e9c23b9ce217448f1 branch: main author: Caio Agiani committer: terryjreedy date: 2022-02-03T23:39:59-05:00 summary: bpo-46588: fix typo in test_calltip.py (GH-31119) files: M Lib/idlelib/idle_test/test_calltip.py diff --git a/Lib/idlelib/idle_test/test_calltip.py b/Lib/idlelib/idle_test/test_calltip.py index b23915c5ab784..e8d2bd17cb681 100644 --- a/Lib/idlelib/idle_test/test_calltip.py +++ b/Lib/idlelib/idle_test/test_calltip.py @@ -106,7 +106,7 @@ def test_signature_wrap(self): If you want to completely replace the main wrapping algorithm, you\'ll probably have to override _wrap_chunks().''') - def test_properly_formated(self): + def test_properly_formatted(self): def foo(s='a'*100): pass From webhook-mailer at python.org Fri Feb 4 00:05:48 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 04 Feb 2022 05:05:48 -0000 Subject: [Python-checkins] bpo-46588: fix typo in test_calltip.py (GH-31119) Message-ID: https://github.com/python/cpython/commit/663370aea5dcf9074455b45283e980c7bc353674 commit: 663370aea5dcf9074455b45283e980c7bc353674 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-03T21:05:42-08:00 summary: bpo-46588: fix typo in test_calltip.py (GH-31119) (cherry picked from commit 222865daabfa7a8b12ca9a5e9c23b9ce217448f1) Co-authored-by: Caio Agiani files: M Lib/idlelib/idle_test/test_calltip.py diff --git a/Lib/idlelib/idle_test/test_calltip.py b/Lib/idlelib/idle_test/test_calltip.py index b23915c5ab784..e8d2bd17cb681 100644 --- a/Lib/idlelib/idle_test/test_calltip.py +++ b/Lib/idlelib/idle_test/test_calltip.py @@ -106,7 +106,7 @@ def test_signature_wrap(self): If you want to completely replace the main wrapping algorithm, you\'ll probably have to override _wrap_chunks().''') - def test_properly_formated(self): + def test_properly_formatted(self): def foo(s='a'*100): pass From webhook-mailer at python.org Fri Feb 4 00:11:23 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 04 Feb 2022 05:11:23 -0000 Subject: [Python-checkins] bpo-46588: fix typo in test_calltip.py (GH-31119) Message-ID: https://github.com/python/cpython/commit/9ce0b00fb1172e743de985eda28e3335aa95014a commit: 9ce0b00fb1172e743de985eda28e3335aa95014a branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-03T21:11:15-08:00 summary: bpo-46588: fix typo in test_calltip.py (GH-31119) (cherry picked from commit 222865daabfa7a8b12ca9a5e9c23b9ce217448f1) Co-authored-by: Caio Agiani files: M Lib/idlelib/idle_test/test_calltip.py diff --git a/Lib/idlelib/idle_test/test_calltip.py b/Lib/idlelib/idle_test/test_calltip.py index b23915c5ab784..e8d2bd17cb681 100644 --- a/Lib/idlelib/idle_test/test_calltip.py +++ b/Lib/idlelib/idle_test/test_calltip.py @@ -106,7 +106,7 @@ def test_signature_wrap(self): If you want to completely replace the main wrapping algorithm, you\'ll probably have to override _wrap_chunks().''') - def test_properly_formated(self): + def test_properly_formatted(self): def foo(s='a'*100): pass From webhook-mailer at python.org Fri Feb 4 01:49:53 2022 From: webhook-mailer at python.org (methane) Date: Fri, 04 Feb 2022 06:49:53 -0000 Subject: [Python-checkins] Optimize images by IMGbot (GH-21348) Message-ID: https://github.com/python/cpython/commit/ba650af7d660084e08859dd1ee1917cccee24e88 commit: ba650af7d660084e08859dd1ee1917cccee24e88 branch: main author: Manish Kumar ? committer: methane date: 2022-02-04T15:49:43+09:00 summary: Optimize images by IMGbot (GH-21348) Co-authored-by: ImgBotApp files: M Doc/howto/logging_flow.png M Doc/library/hashlib-blake2-tree.png M Doc/library/pathlib-inheritance.svg M Doc/library/tk_msg.png M Doc/using/win_installer.png M Lib/idlelib/Icons/idle_16.gif M Lib/idlelib/Icons/idle_16.png M Lib/idlelib/Icons/idle_256.png M Lib/idlelib/Icons/idle_32.gif M Lib/idlelib/Icons/idle_32.png M Lib/idlelib/Icons/idle_48.png M Lib/idlelib/Icons/minusnode.gif M Lib/idlelib/Icons/plusnode.gif M Lib/idlelib/Icons/python.gif M Lib/idlelib/Icons/tk.gif M Lib/test/imghdrdata/python.gif M Lib/test/test_email/data/PyBanner048.gif M PC/icons/logox128.png M PC/icons/py.png M PC/icons/pythonwx150.png M PC/icons/pythonwx44.png M PC/icons/pythonx150.png M PC/icons/pythonx44.png M PC/icons/pythonx50.png M Tools/msi/bundle/SideBar.png diff --git a/Doc/howto/logging_flow.png b/Doc/howto/logging_flow.png index fac4acd775530..d65e597f811db 100644 Binary files a/Doc/howto/logging_flow.png and b/Doc/howto/logging_flow.png differ diff --git a/Doc/library/hashlib-blake2-tree.png b/Doc/library/hashlib-blake2-tree.png index 73e849444ed7d..faef21b55f96b 100644 Binary files a/Doc/library/hashlib-blake2-tree.png and b/Doc/library/hashlib-blake2-tree.png differ diff --git a/Doc/library/pathlib-inheritance.svg b/Doc/library/pathlib-inheritance.svg index 49057f678fd7d..01f8684a2b201 100644 --- a/Doc/library/pathlib-inheritance.svg +++ b/Doc/library/pathlib-inheritance.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Doc/library/tk_msg.png b/Doc/library/tk_msg.png index c122d8f8ae5ba..6495e63e84650 100644 Binary files a/Doc/library/tk_msg.png and b/Doc/library/tk_msg.png differ diff --git a/Doc/using/win_installer.png b/Doc/using/win_installer.png index 9c18ff19cf5e8..03bf2d7b16c59 100644 Binary files a/Doc/using/win_installer.png and b/Doc/using/win_installer.png differ diff --git a/Lib/idlelib/Icons/idle_16.gif b/Lib/idlelib/Icons/idle_16.gif index 9f001b1d79cf6..bcedcd6400390 100644 Binary files a/Lib/idlelib/Icons/idle_16.gif and b/Lib/idlelib/Icons/idle_16.gif differ diff --git a/Lib/idlelib/Icons/idle_16.png b/Lib/idlelib/Icons/idle_16.png index 6abde0af90cb6..77d8f711804f9 100644 Binary files a/Lib/idlelib/Icons/idle_16.png and b/Lib/idlelib/Icons/idle_16.png differ diff --git a/Lib/idlelib/Icons/idle_256.png b/Lib/idlelib/Icons/idle_256.png index 99ffa6fad4a92..64f276b40d23b 100644 Binary files a/Lib/idlelib/Icons/idle_256.png and b/Lib/idlelib/Icons/idle_256.png differ diff --git a/Lib/idlelib/Icons/idle_32.gif b/Lib/idlelib/Icons/idle_32.gif index af5b2d52cce89..a1b12a0531d64 100644 Binary files a/Lib/idlelib/Icons/idle_32.gif and b/Lib/idlelib/Icons/idle_32.gif differ diff --git a/Lib/idlelib/Icons/idle_32.png b/Lib/idlelib/Icons/idle_32.png index 41b70dbc37766..2aaa55805ed53 100644 Binary files a/Lib/idlelib/Icons/idle_32.png and b/Lib/idlelib/Icons/idle_32.png differ diff --git a/Lib/idlelib/Icons/idle_48.png b/Lib/idlelib/Icons/idle_48.png index e5fa9280e21f8..705eec42e8a64 100644 Binary files a/Lib/idlelib/Icons/idle_48.png and b/Lib/idlelib/Icons/idle_48.png differ diff --git a/Lib/idlelib/Icons/minusnode.gif b/Lib/idlelib/Icons/minusnode.gif index c72e46ff863e4..173e97095913a 100644 Binary files a/Lib/idlelib/Icons/minusnode.gif and b/Lib/idlelib/Icons/minusnode.gif differ diff --git a/Lib/idlelib/Icons/plusnode.gif b/Lib/idlelib/Icons/plusnode.gif index 13ace90eb3269..abedde047f2e2 100644 Binary files a/Lib/idlelib/Icons/plusnode.gif and b/Lib/idlelib/Icons/plusnode.gif differ diff --git a/Lib/idlelib/Icons/python.gif b/Lib/idlelib/Icons/python.gif index b189c2c2d22c1..01b13e3583403 100644 Binary files a/Lib/idlelib/Icons/python.gif and b/Lib/idlelib/Icons/python.gif differ diff --git a/Lib/idlelib/Icons/tk.gif b/Lib/idlelib/Icons/tk.gif index a603f5ecb08a9..03bf3832abb7f 100644 Binary files a/Lib/idlelib/Icons/tk.gif and b/Lib/idlelib/Icons/tk.gif differ diff --git a/Lib/test/imghdrdata/python.gif b/Lib/test/imghdrdata/python.gif index 96fd9fef76b10..efa0be3861d79 100644 Binary files a/Lib/test/imghdrdata/python.gif and b/Lib/test/imghdrdata/python.gif differ diff --git a/Lib/test/test_email/data/PyBanner048.gif b/Lib/test/test_email/data/PyBanner048.gif index 1a5c87f647fbf..7e308f542b864 100644 Binary files a/Lib/test/test_email/data/PyBanner048.gif and b/Lib/test/test_email/data/PyBanner048.gif differ diff --git a/PC/icons/logox128.png b/PC/icons/logox128.png index d2655c72e7df4..a403de5818cfe 100644 Binary files a/PC/icons/logox128.png and b/PC/icons/logox128.png differ diff --git a/PC/icons/py.png b/PC/icons/py.png index 5c184e6a745f3..629022a70bdc4 100644 Binary files a/PC/icons/py.png and b/PC/icons/py.png differ diff --git a/PC/icons/pythonwx150.png b/PC/icons/pythonwx150.png index 4c3eb316739c7..589873aeb100b 100644 Binary files a/PC/icons/pythonwx150.png and b/PC/icons/pythonwx150.png differ diff --git a/PC/icons/pythonwx44.png b/PC/icons/pythonwx44.png index e3b32a871f90a..8cd8dd0286f68 100644 Binary files a/PC/icons/pythonwx44.png and b/PC/icons/pythonwx44.png differ diff --git a/PC/icons/pythonx150.png b/PC/icons/pythonx150.png index 5f8d30418386f..e00aa758edcd4 100644 Binary files a/PC/icons/pythonx150.png and b/PC/icons/pythonx150.png differ diff --git a/PC/icons/pythonx44.png b/PC/icons/pythonx44.png index 3881daaef2335..db0e9b91d40fe 100644 Binary files a/PC/icons/pythonx44.png and b/PC/icons/pythonx44.png differ diff --git a/PC/icons/pythonx50.png b/PC/icons/pythonx50.png index 7cc3aecd0242b..8eb5ffce221fa 100644 Binary files a/PC/icons/pythonx50.png and b/PC/icons/pythonx50.png differ diff --git a/Tools/msi/bundle/SideBar.png b/Tools/msi/bundle/SideBar.png index a23ce5e145848..52f15dd46c18f 100644 Binary files a/Tools/msi/bundle/SideBar.png and b/Tools/msi/bundle/SideBar.png differ From webhook-mailer at python.org Fri Feb 4 02:15:26 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 04 Feb 2022 07:15:26 -0000 Subject: [Python-checkins] Optimize images by IMGbot (GH-21348) Message-ID: https://github.com/python/cpython/commit/ee3d050e85381f5117f01b709f138cd094b52253 commit: ee3d050e85381f5117f01b709f138cd094b52253 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-03T23:15:17-08:00 summary: Optimize images by IMGbot (GH-21348) Co-authored-by: ImgBotApp (cherry picked from commit ba650af7d660084e08859dd1ee1917cccee24e88) Co-authored-by: Manish Kumar ? files: M Doc/howto/logging_flow.png M Doc/library/hashlib-blake2-tree.png M Doc/library/pathlib-inheritance.svg M Doc/library/tk_msg.png M Doc/using/win_installer.png M Lib/idlelib/Icons/idle_16.gif M Lib/idlelib/Icons/idle_16.png M Lib/idlelib/Icons/idle_256.png M Lib/idlelib/Icons/idle_32.gif M Lib/idlelib/Icons/idle_32.png M Lib/idlelib/Icons/idle_48.png M Lib/idlelib/Icons/minusnode.gif M Lib/idlelib/Icons/plusnode.gif M Lib/idlelib/Icons/python.gif M Lib/idlelib/Icons/tk.gif M Lib/test/imghdrdata/python.gif M Lib/test/test_email/data/PyBanner048.gif M PC/icons/logox128.png M PC/icons/py.png M PC/icons/pythonwx150.png M PC/icons/pythonwx44.png M PC/icons/pythonx150.png M PC/icons/pythonx44.png M PC/icons/pythonx50.png M Tools/msi/bundle/SideBar.png diff --git a/Doc/howto/logging_flow.png b/Doc/howto/logging_flow.png index fac4acd775530..d65e597f811db 100644 Binary files a/Doc/howto/logging_flow.png and b/Doc/howto/logging_flow.png differ diff --git a/Doc/library/hashlib-blake2-tree.png b/Doc/library/hashlib-blake2-tree.png index 73e849444ed7d..faef21b55f96b 100644 Binary files a/Doc/library/hashlib-blake2-tree.png and b/Doc/library/hashlib-blake2-tree.png differ diff --git a/Doc/library/pathlib-inheritance.svg b/Doc/library/pathlib-inheritance.svg index 49057f678fd7d..01f8684a2b201 100644 --- a/Doc/library/pathlib-inheritance.svg +++ b/Doc/library/pathlib-inheritance.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Doc/library/tk_msg.png b/Doc/library/tk_msg.png index c122d8f8ae5ba..6495e63e84650 100644 Binary files a/Doc/library/tk_msg.png and b/Doc/library/tk_msg.png differ diff --git a/Doc/using/win_installer.png b/Doc/using/win_installer.png index 9c18ff19cf5e8..03bf2d7b16c59 100644 Binary files a/Doc/using/win_installer.png and b/Doc/using/win_installer.png differ diff --git a/Lib/idlelib/Icons/idle_16.gif b/Lib/idlelib/Icons/idle_16.gif index 9f001b1d79cf6..bcedcd6400390 100644 Binary files a/Lib/idlelib/Icons/idle_16.gif and b/Lib/idlelib/Icons/idle_16.gif differ diff --git a/Lib/idlelib/Icons/idle_16.png b/Lib/idlelib/Icons/idle_16.png index 6abde0af90cb6..77d8f711804f9 100644 Binary files a/Lib/idlelib/Icons/idle_16.png and b/Lib/idlelib/Icons/idle_16.png differ diff --git a/Lib/idlelib/Icons/idle_256.png b/Lib/idlelib/Icons/idle_256.png index 99ffa6fad4a92..64f276b40d23b 100644 Binary files a/Lib/idlelib/Icons/idle_256.png and b/Lib/idlelib/Icons/idle_256.png differ diff --git a/Lib/idlelib/Icons/idle_32.gif b/Lib/idlelib/Icons/idle_32.gif index af5b2d52cce89..a1b12a0531d64 100644 Binary files a/Lib/idlelib/Icons/idle_32.gif and b/Lib/idlelib/Icons/idle_32.gif differ diff --git a/Lib/idlelib/Icons/idle_32.png b/Lib/idlelib/Icons/idle_32.png index 41b70dbc37766..2aaa55805ed53 100644 Binary files a/Lib/idlelib/Icons/idle_32.png and b/Lib/idlelib/Icons/idle_32.png differ diff --git a/Lib/idlelib/Icons/idle_48.png b/Lib/idlelib/Icons/idle_48.png index e5fa9280e21f8..705eec42e8a64 100644 Binary files a/Lib/idlelib/Icons/idle_48.png and b/Lib/idlelib/Icons/idle_48.png differ diff --git a/Lib/idlelib/Icons/minusnode.gif b/Lib/idlelib/Icons/minusnode.gif index c72e46ff863e4..173e97095913a 100644 Binary files a/Lib/idlelib/Icons/minusnode.gif and b/Lib/idlelib/Icons/minusnode.gif differ diff --git a/Lib/idlelib/Icons/plusnode.gif b/Lib/idlelib/Icons/plusnode.gif index 13ace90eb3269..abedde047f2e2 100644 Binary files a/Lib/idlelib/Icons/plusnode.gif and b/Lib/idlelib/Icons/plusnode.gif differ diff --git a/Lib/idlelib/Icons/python.gif b/Lib/idlelib/Icons/python.gif index b189c2c2d22c1..01b13e3583403 100644 Binary files a/Lib/idlelib/Icons/python.gif and b/Lib/idlelib/Icons/python.gif differ diff --git a/Lib/idlelib/Icons/tk.gif b/Lib/idlelib/Icons/tk.gif index a603f5ecb08a9..03bf3832abb7f 100644 Binary files a/Lib/idlelib/Icons/tk.gif and b/Lib/idlelib/Icons/tk.gif differ diff --git a/Lib/test/imghdrdata/python.gif b/Lib/test/imghdrdata/python.gif index 96fd9fef76b10..efa0be3861d79 100644 Binary files a/Lib/test/imghdrdata/python.gif and b/Lib/test/imghdrdata/python.gif differ diff --git a/Lib/test/test_email/data/PyBanner048.gif b/Lib/test/test_email/data/PyBanner048.gif index 1a5c87f647fbf..7e308f542b864 100644 Binary files a/Lib/test/test_email/data/PyBanner048.gif and b/Lib/test/test_email/data/PyBanner048.gif differ diff --git a/PC/icons/logox128.png b/PC/icons/logox128.png index d2655c72e7df4..a403de5818cfe 100644 Binary files a/PC/icons/logox128.png and b/PC/icons/logox128.png differ diff --git a/PC/icons/py.png b/PC/icons/py.png index 5c184e6a745f3..629022a70bdc4 100644 Binary files a/PC/icons/py.png and b/PC/icons/py.png differ diff --git a/PC/icons/pythonwx150.png b/PC/icons/pythonwx150.png index 4c3eb316739c7..589873aeb100b 100644 Binary files a/PC/icons/pythonwx150.png and b/PC/icons/pythonwx150.png differ diff --git a/PC/icons/pythonwx44.png b/PC/icons/pythonwx44.png index e3b32a871f90a..8cd8dd0286f68 100644 Binary files a/PC/icons/pythonwx44.png and b/PC/icons/pythonwx44.png differ diff --git a/PC/icons/pythonx150.png b/PC/icons/pythonx150.png index 5f8d30418386f..e00aa758edcd4 100644 Binary files a/PC/icons/pythonx150.png and b/PC/icons/pythonx150.png differ diff --git a/PC/icons/pythonx44.png b/PC/icons/pythonx44.png index 3881daaef2335..db0e9b91d40fe 100644 Binary files a/PC/icons/pythonx44.png and b/PC/icons/pythonx44.png differ diff --git a/PC/icons/pythonx50.png b/PC/icons/pythonx50.png index 7cc3aecd0242b..8eb5ffce221fa 100644 Binary files a/PC/icons/pythonx50.png and b/PC/icons/pythonx50.png differ diff --git a/Tools/msi/bundle/SideBar.png b/Tools/msi/bundle/SideBar.png index a23ce5e145848..52f15dd46c18f 100644 Binary files a/Tools/msi/bundle/SideBar.png and b/Tools/msi/bundle/SideBar.png differ From webhook-mailer at python.org Fri Feb 4 02:31:38 2022 From: webhook-mailer at python.org (methane) Date: Fri, 04 Feb 2022 07:31:38 -0000 Subject: [Python-checkins] Optimize images by IMGbot (GH-21348) Message-ID: https://github.com/python/cpython/commit/34895f694ccddbd4c9320a625c1b4b139c9c3bb3 commit: 34895f694ccddbd4c9320a625c1b4b139c9c3bb3 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: methane date: 2022-02-04T16:31:21+09:00 summary: Optimize images by IMGbot (GH-21348) Co-authored-by: ImgBotApp (cherry picked from commit ba650af7d660084e08859dd1ee1917cccee24e88) files: M Doc/howto/logging_flow.png M Doc/library/hashlib-blake2-tree.png M Doc/library/pathlib-inheritance.svg M Doc/library/tk_msg.png M Doc/using/win_installer.png M Lib/idlelib/Icons/idle_16.gif M Lib/idlelib/Icons/idle_16.png M Lib/idlelib/Icons/idle_256.png M Lib/idlelib/Icons/idle_32.gif M Lib/idlelib/Icons/idle_32.png M Lib/idlelib/Icons/idle_48.png M Lib/idlelib/Icons/minusnode.gif M Lib/idlelib/Icons/plusnode.gif M Lib/idlelib/Icons/python.gif M Lib/idlelib/Icons/tk.gif M Lib/test/imghdrdata/python.gif M Lib/test/test_email/data/PyBanner048.gif M PC/icons/logox128.png M PC/icons/py.png M PC/icons/pythonwx150.png M PC/icons/pythonwx44.png M PC/icons/pythonx150.png M PC/icons/pythonx44.png M PC/icons/pythonx50.png M Tools/msi/bundle/SideBar.png diff --git a/Doc/howto/logging_flow.png b/Doc/howto/logging_flow.png index fac4acd7755302..d65e597f811db5 100644 Binary files a/Doc/howto/logging_flow.png and b/Doc/howto/logging_flow.png differ diff --git a/Doc/library/hashlib-blake2-tree.png b/Doc/library/hashlib-blake2-tree.png index 73e849444ed7d3..faef21b55f96b1 100644 Binary files a/Doc/library/hashlib-blake2-tree.png and b/Doc/library/hashlib-blake2-tree.png differ diff --git a/Doc/library/pathlib-inheritance.svg b/Doc/library/pathlib-inheritance.svg index 49057f678fd7d0..01f8684a2b201c 100644 --- a/Doc/library/pathlib-inheritance.svg +++ b/Doc/library/pathlib-inheritance.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Doc/library/tk_msg.png b/Doc/library/tk_msg.png index c122d8f8ae5ba9..6495e63e84650d 100644 Binary files a/Doc/library/tk_msg.png and b/Doc/library/tk_msg.png differ diff --git a/Doc/using/win_installer.png b/Doc/using/win_installer.png index 9c18ff19cf5e81..03bf2d7b16c599 100644 Binary files a/Doc/using/win_installer.png and b/Doc/using/win_installer.png differ diff --git a/Lib/idlelib/Icons/idle_16.gif b/Lib/idlelib/Icons/idle_16.gif index 9f001b1d79cf69..bcedcd64003906 100644 Binary files a/Lib/idlelib/Icons/idle_16.gif and b/Lib/idlelib/Icons/idle_16.gif differ diff --git a/Lib/idlelib/Icons/idle_16.png b/Lib/idlelib/Icons/idle_16.png index 6abde0af90cb6b..77d8f711804f95 100644 Binary files a/Lib/idlelib/Icons/idle_16.png and b/Lib/idlelib/Icons/idle_16.png differ diff --git a/Lib/idlelib/Icons/idle_256.png b/Lib/idlelib/Icons/idle_256.png index 99ffa6fad4a92d..64f276b40d23b7 100644 Binary files a/Lib/idlelib/Icons/idle_256.png and b/Lib/idlelib/Icons/idle_256.png differ diff --git a/Lib/idlelib/Icons/idle_32.gif b/Lib/idlelib/Icons/idle_32.gif index af5b2d52cce895..a1b12a0531d64a 100644 Binary files a/Lib/idlelib/Icons/idle_32.gif and b/Lib/idlelib/Icons/idle_32.gif differ diff --git a/Lib/idlelib/Icons/idle_32.png b/Lib/idlelib/Icons/idle_32.png index 41b70dbc37766a..2aaa55805ed530 100644 Binary files a/Lib/idlelib/Icons/idle_32.png and b/Lib/idlelib/Icons/idle_32.png differ diff --git a/Lib/idlelib/Icons/idle_48.png b/Lib/idlelib/Icons/idle_48.png index e5fa9280e21f86..705eec42e8a64e 100644 Binary files a/Lib/idlelib/Icons/idle_48.png and b/Lib/idlelib/Icons/idle_48.png differ diff --git a/Lib/idlelib/Icons/minusnode.gif b/Lib/idlelib/Icons/minusnode.gif index c72e46ff863e47..173e97095913ae 100644 Binary files a/Lib/idlelib/Icons/minusnode.gif and b/Lib/idlelib/Icons/minusnode.gif differ diff --git a/Lib/idlelib/Icons/plusnode.gif b/Lib/idlelib/Icons/plusnode.gif index 13ace90eb3269a..abedde047f2e2b 100644 Binary files a/Lib/idlelib/Icons/plusnode.gif and b/Lib/idlelib/Icons/plusnode.gif differ diff --git a/Lib/idlelib/Icons/python.gif b/Lib/idlelib/Icons/python.gif index b189c2c2d22c12..01b13e35834038 100644 Binary files a/Lib/idlelib/Icons/python.gif and b/Lib/idlelib/Icons/python.gif differ diff --git a/Lib/idlelib/Icons/tk.gif b/Lib/idlelib/Icons/tk.gif index a603f5ecb08a95..03bf3832abb7f6 100644 Binary files a/Lib/idlelib/Icons/tk.gif and b/Lib/idlelib/Icons/tk.gif differ diff --git a/Lib/test/imghdrdata/python.gif b/Lib/test/imghdrdata/python.gif index 96fd9fef76b108..efa0be3861d79f 100644 Binary files a/Lib/test/imghdrdata/python.gif and b/Lib/test/imghdrdata/python.gif differ diff --git a/Lib/test/test_email/data/PyBanner048.gif b/Lib/test/test_email/data/PyBanner048.gif index 1a5c87f647fbf3..7e308f542b864c 100644 Binary files a/Lib/test/test_email/data/PyBanner048.gif and b/Lib/test/test_email/data/PyBanner048.gif differ diff --git a/PC/icons/logox128.png b/PC/icons/logox128.png index d2655c72e7df49..a403de5818cfec 100644 Binary files a/PC/icons/logox128.png and b/PC/icons/logox128.png differ diff --git a/PC/icons/py.png b/PC/icons/py.png index 5c184e6a745f36..629022a70bdc44 100644 Binary files a/PC/icons/py.png and b/PC/icons/py.png differ diff --git a/PC/icons/pythonwx150.png b/PC/icons/pythonwx150.png index 4c3eb316739c79..589873aeb100b2 100644 Binary files a/PC/icons/pythonwx150.png and b/PC/icons/pythonwx150.png differ diff --git a/PC/icons/pythonwx44.png b/PC/icons/pythonwx44.png index e3b32a871f90a7..8cd8dd0286f681 100644 Binary files a/PC/icons/pythonwx44.png and b/PC/icons/pythonwx44.png differ diff --git a/PC/icons/pythonx150.png b/PC/icons/pythonx150.png index 5f8d30418386fd..e00aa758edcd47 100644 Binary files a/PC/icons/pythonx150.png and b/PC/icons/pythonx150.png differ diff --git a/PC/icons/pythonx44.png b/PC/icons/pythonx44.png index 3881daaef2335a..db0e9b91d40fe5 100644 Binary files a/PC/icons/pythonx44.png and b/PC/icons/pythonx44.png differ diff --git a/PC/icons/pythonx50.png b/PC/icons/pythonx50.png index 7cc3aecd0242b9..8eb5ffce221fae 100644 Binary files a/PC/icons/pythonx50.png and b/PC/icons/pythonx50.png differ diff --git a/Tools/msi/bundle/SideBar.png b/Tools/msi/bundle/SideBar.png index a23ce5e1458488..52f15dd46c18fe 100644 Binary files a/Tools/msi/bundle/SideBar.png and b/Tools/msi/bundle/SideBar.png differ From webhook-mailer at python.org Fri Feb 4 04:56:50 2022 From: webhook-mailer at python.org (markshannon) Date: Fri, 04 Feb 2022 09:56:50 -0000 Subject: [Python-checkins] Add miss stats for specialized instructions. (GH-31108) Message-ID: https://github.com/python/cpython/commit/832876b99212999c063cbf41bdacc574da699190 commit: 832876b99212999c063cbf41bdacc574da699190 branch: main author: Mark Shannon committer: markshannon date: 2022-02-04T09:56:46Z summary: Add miss stats for specialized instructions. (GH-31108) files: M Python/ceval.c M Python/specialize.c M Tools/scripts/summarize_stats.py diff --git a/Python/ceval.c b/Python/ceval.c index b4029d1081dcb..e6b5d3ae24237 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5403,6 +5403,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr #define MISS_WITH_CACHE(opname) \ opname ## _miss: \ { \ + STAT_INC(opcode, miss); \ STAT_INC(opname, miss); \ _PyAdaptiveEntry *cache = &GET_CACHE()->adaptive; \ cache->counter--; \ diff --git a/Python/specialize.c b/Python/specialize.c index 4070d6a6a0be4..b7ef478ee5590 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -38,6 +38,33 @@ */ +/* Map from opcode to adaptive opcode. + Values of zero are ignored. */ +static uint8_t adaptive_opcodes[256] = { + [LOAD_ATTR] = LOAD_ATTR_ADAPTIVE, + [LOAD_GLOBAL] = LOAD_GLOBAL_ADAPTIVE, + [LOAD_METHOD] = LOAD_METHOD_ADAPTIVE, + [BINARY_SUBSCR] = BINARY_SUBSCR_ADAPTIVE, + [STORE_SUBSCR] = STORE_SUBSCR_ADAPTIVE, + [CALL] = CALL_ADAPTIVE, + [STORE_ATTR] = STORE_ATTR_ADAPTIVE, + [BINARY_OP] = BINARY_OP_ADAPTIVE, + [COMPARE_OP] = COMPARE_OP_ADAPTIVE, +}; + +/* The number of cache entries required for a "family" of instructions. */ +static uint8_t cache_requirements[256] = { + [LOAD_ATTR] = 2, /* _PyAdaptiveEntry and _PyAttrCache */ + [LOAD_GLOBAL] = 2, /* _PyAdaptiveEntry and _PyLoadGlobalCache */ + [LOAD_METHOD] = 3, /* _PyAdaptiveEntry, _PyAttrCache and _PyObjectCache */ + [BINARY_SUBSCR] = 2, /* _PyAdaptiveEntry, _PyObjectCache */ + [STORE_SUBSCR] = 0, + [CALL] = 2, /* _PyAdaptiveEntry and _PyObjectCache/_PyCallCache */ + [STORE_ATTR] = 2, /* _PyAdaptiveEntry and _PyAttrCache */ + [BINARY_OP] = 1, // _PyAdaptiveEntry + [COMPARE_OP] = 1, /* _PyAdaptiveEntry */ +}; + Py_ssize_t _Py_QuickenedCount = 0; #ifdef Py_STATS PyStats _py_stats = { 0 }; @@ -144,7 +171,14 @@ _Py_GetSpecializationStats(void) { static void print_spec_stats(FILE *out, OpcodeStats *stats) { + /* Mark some opcodes as specializable for stats, + * even though we don't specialize them yet. */ + fprintf(out, " opcode[%d].specializable : 1\n", FOR_ITER); + fprintf(out, " opcode[%d].specializable : 1\n", UNPACK_SEQUENCE); for (int i = 0; i < 256; i++) { + if (adaptive_opcodes[i]) { + fprintf(out, " opcode[%d].specializable : 1\n", i); + } PRINT_STAT(i, specialization.success); PRINT_STAT(i, specialization.failure); PRINT_STAT(i, specialization.hit); @@ -266,33 +300,6 @@ get_cache_count(SpecializedCacheOrInstruction *quickened) { return quickened[0].entry.zero.cache_count; } -/* Map from opcode to adaptive opcode. - Values of zero are ignored. */ -static uint8_t adaptive_opcodes[256] = { - [LOAD_ATTR] = LOAD_ATTR_ADAPTIVE, - [LOAD_GLOBAL] = LOAD_GLOBAL_ADAPTIVE, - [LOAD_METHOD] = LOAD_METHOD_ADAPTIVE, - [BINARY_SUBSCR] = BINARY_SUBSCR_ADAPTIVE, - [STORE_SUBSCR] = STORE_SUBSCR_ADAPTIVE, - [CALL] = CALL_ADAPTIVE, - [STORE_ATTR] = STORE_ATTR_ADAPTIVE, - [BINARY_OP] = BINARY_OP_ADAPTIVE, - [COMPARE_OP] = COMPARE_OP_ADAPTIVE, -}; - -/* The number of cache entries required for a "family" of instructions. */ -static uint8_t cache_requirements[256] = { - [LOAD_ATTR] = 2, /* _PyAdaptiveEntry and _PyAttrCache */ - [LOAD_GLOBAL] = 2, /* _PyAdaptiveEntry and _PyLoadGlobalCache */ - [LOAD_METHOD] = 3, /* _PyAdaptiveEntry, _PyAttrCache and _PyObjectCache */ - [BINARY_SUBSCR] = 2, /* _PyAdaptiveEntry, _PyObjectCache */ - [STORE_SUBSCR] = 0, - [CALL] = 2, /* _PyAdaptiveEntry and _PyObjectCache/_PyCallCache */ - [STORE_ATTR] = 2, /* _PyAdaptiveEntry and _PyAttrCache */ - [BINARY_OP] = 1, // _PyAdaptiveEntry - [COMPARE_OP] = 1, /* _PyAdaptiveEntry */ -}; - /* Return the oparg for the cache_offset and instruction index. * * If no cache is needed then return the original oparg. diff --git a/Tools/scripts/summarize_stats.py b/Tools/scripts/summarize_stats.py index f67a35a04a9dd..6d0020739a31f 100644 --- a/Tools/scripts/summarize_stats.py +++ b/Tools/scripts/summarize_stats.py @@ -22,11 +22,10 @@ pass opname.append(name) - TOTAL = "specialization.deferred", "specialization.hit", "specialization.miss", "execution_count" def print_specialization_stats(name, family_stats): - if "specialization.failure" not in family_stats: + if "specializable" not in family_stats: return total = sum(family_stats.get(kind, 0) for kind in TOTAL) if total == 0: @@ -87,13 +86,18 @@ def main(): for i, opcode_stat in enumerate(opcode_stats): if "execution_count" in opcode_stat: count = opcode_stat['execution_count'] - counts.append((count, opname[i])) + miss = 0 + if "specializable" not in opcode_stat: + miss = opcode_stat.get("specialization.miss") + counts.append((count, opname[i], miss)) total += count counts.sort(reverse=True) cummulative = 0 - for (count, name) in counts: + for (count, name, miss) in counts: cummulative += count print(f"{name}: {count} {100*count/total:0.1f}% {100*cummulative/total:0.1f}%") + if miss: + print(f" Misses: {miss} {100*miss/count:0.1f}%") print("Specialization stats:") for i, opcode_stat in enumerate(opcode_stats): name = opname[i] From webhook-mailer at python.org Fri Feb 4 11:11:50 2022 From: webhook-mailer at python.org (zooba) Date: Fri, 04 Feb 2022 16:11:50 -0000 Subject: [Python-checkins] bpo-46629: Update classicAppCompat.sccd for new signing certificate (GH-31111) Message-ID: https://github.com/python/cpython/commit/9b4e3d94a5746af093392ed8e977b26fcc1bfd11 commit: 9b4e3d94a5746af093392ed8e977b26fcc1bfd11 branch: main author: Steve Dower committer: zooba date: 2022-02-04T16:11:19Z summary: bpo-46629: Update classicAppCompat.sccd for new signing certificate (GH-31111) files: M PC/classicAppCompat.can.xml M PC/classicAppCompat.sccd diff --git a/PC/classicAppCompat.can.xml b/PC/classicAppCompat.can.xml index f00475c8da312..df361f8e3e2cd 100644 --- a/PC/classicAppCompat.can.xml +++ b/PC/classicAppCompat.can.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/PC/classicAppCompat.sccd b/PC/classicAppCompat.sccd index 97648985a2ccb..d7a70cdd0533c 100644 --- a/PC/classicAppCompat.sccd +++ b/PC/classicAppCompat.sccd @@ -1,28 +1,41 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 From webhook-mailer at python.org Fri Feb 4 11:34:22 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 04 Feb 2022 16:34:22 -0000 Subject: [Python-checkins] bpo-46629: Update classicAppCompat.sccd for new signing certificate (GH-31111) Message-ID: https://github.com/python/cpython/commit/7b5b23c31db87cfc5e09ec297147499ba1d47d31 commit: 7b5b23c31db87cfc5e09ec297147499ba1d47d31 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-04T08:34:12-08:00 summary: bpo-46629: Update classicAppCompat.sccd for new signing certificate (GH-31111) (cherry picked from commit 9b4e3d94a5746af093392ed8e977b26fcc1bfd11) Co-authored-by: Steve Dower files: M PC/classicAppCompat.can.xml M PC/classicAppCompat.sccd diff --git a/PC/classicAppCompat.can.xml b/PC/classicAppCompat.can.xml index f00475c8da312..df361f8e3e2cd 100644 --- a/PC/classicAppCompat.can.xml +++ b/PC/classicAppCompat.can.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/PC/classicAppCompat.sccd b/PC/classicAppCompat.sccd index 97648985a2ccb..d7a70cdd0533c 100644 --- a/PC/classicAppCompat.sccd +++ b/PC/classicAppCompat.sccd @@ -1,28 +1,41 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 From webhook-mailer at python.org Fri Feb 4 11:38:23 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 04 Feb 2022 16:38:23 -0000 Subject: [Python-checkins] bpo-46629: Update classicAppCompat.sccd for new signing certificate (GH-31111) Message-ID: https://github.com/python/cpython/commit/6da436497a79dea0f3bb756c2d78921b2838e03b commit: 6da436497a79dea0f3bb756c2d78921b2838e03b branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-04T08:38:09-08:00 summary: bpo-46629: Update classicAppCompat.sccd for new signing certificate (GH-31111) (cherry picked from commit 9b4e3d94a5746af093392ed8e977b26fcc1bfd11) Co-authored-by: Steve Dower files: M PC/classicAppCompat.can.xml M PC/classicAppCompat.sccd diff --git a/PC/classicAppCompat.can.xml b/PC/classicAppCompat.can.xml index f00475c8da312..df361f8e3e2cd 100644 --- a/PC/classicAppCompat.can.xml +++ b/PC/classicAppCompat.can.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/PC/classicAppCompat.sccd b/PC/classicAppCompat.sccd index 97648985a2ccb..d7a70cdd0533c 100644 --- a/PC/classicAppCompat.sccd +++ b/PC/classicAppCompat.sccd @@ -1,28 +1,41 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 From webhook-mailer at python.org Fri Feb 4 12:57:13 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 04 Feb 2022 17:57:13 -0000 Subject: [Python-checkins] bpo-46608: exclude marshalled-frozen data if deep-freezing to save 300 KB space (GH-31074) Message-ID: https://github.com/python/cpython/commit/bf95ff91f2c1fc5a57190491f9ccdc63458b089e commit: bf95ff91f2c1fc5a57190491f9ccdc63458b089e branch: main author: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-02-04T09:57:03-08:00 summary: bpo-46608: exclude marshalled-frozen data if deep-freezing to save 300 KB space (GH-31074) This reduces the size of the data segment by **300 KB** of the executable because if the modules are deep-frozen then the marshalled frozen data just wastes space. This was inspired by comment by @gvanrossum in https://github.com/python/cpython/pull/29118#issuecomment-958521863. Note: There is a new option `--deepfreeze-only` in `freeze_modules.py` to change this behavior, it is on be default to save disk space. ```console # du -s ./python before 27892 ./python # du -s ./python after 27524 ./python ``` Automerge-Triggered-By: GH:ericsnowcurrently files: A Misc/NEWS.d/next/Build/2022-02-02-11-26-46.bpo-46608.cXH9po.rst M Doc/c-api/import.rst M Doc/whatsnew/3.11.rst M Include/cpython/import.h M Lib/ctypes/test/test_values.py M Python/frozen.c M Python/import.c M Tools/freeze/makefreeze.py M Tools/scripts/freeze_modules.py diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst index d2ae6b6d4e471..5e2333a74ce64 100644 --- a/Doc/c-api/import.rst +++ b/Doc/c-api/import.rst @@ -256,8 +256,12 @@ Importing Modules const char *name; const unsigned char *code; int size; + bool is_package; }; + .. versionchanged:: 3.11 + The new ``is_package`` field indicates whether the module is a package or not. + This replaces setting the ``size`` field to a negative value. .. c:var:: const struct _frozen* PyImport_FrozenModules diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 18d4652fb4293..1558d67d9a89f 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -650,6 +650,11 @@ C API Changes fields of the result from the exception instance (the ``value`` field). (Contributed by Irit Katriel in :issue:`45711`.) +* :c:struct:`_frozen` has a new ``is_package`` field to indicate whether + or not the frozen module is a package. Previously, a negative value + in the ``size`` field was the indicator. Now only non-negative values + be used for ``size``. + (Contributed by Kumar Aditya in :issue:`46608`.) New Features ------------ diff --git a/Include/cpython/import.h b/Include/cpython/import.h index 5ec637e7ab3b8..da9fb770a9245 100644 --- a/Include/cpython/import.h +++ b/Include/cpython/import.h @@ -32,6 +32,7 @@ struct _frozen { const char *name; /* ASCII encoded string */ const unsigned char *code; int size; + bool is_package; PyObject *(*get_code)(void); }; diff --git a/Lib/ctypes/test/test_values.py b/Lib/ctypes/test/test_values.py index 3e8b13768b421..b2db426d10f43 100644 --- a/Lib/ctypes/test/test_values.py +++ b/Lib/ctypes/test/test_values.py @@ -54,6 +54,7 @@ class struct_frozen(Structure): _fields_ = [("name", c_char_p), ("code", POINTER(c_ubyte)), ("size", c_int), + ("is_package", c_bool), ("get_code", POINTER(c_ubyte)), # Function ptr ] FrozenTable = POINTER(struct_frozen) @@ -71,13 +72,14 @@ class struct_frozen(Structure): modname = entry.name.decode("ascii") modules.append(modname) with self.subTest(modname): - # Do a sanity check on entry.size and entry.code. - self.assertGreater(abs(entry.size), 10) - self.assertTrue([entry.code[i] for i in range(abs(entry.size))]) + if entry.size != 0: + # Do a sanity check on entry.size and entry.code. + self.assertGreater(abs(entry.size), 10) + self.assertTrue([entry.code[i] for i in range(abs(entry.size))]) # Check the module's package-ness. with import_helper.frozen_modules(): spec = importlib.util.find_spec(modname) - if entry.size < 0: + if entry.is_package: # It's a package. self.assertIsNotNone(spec.submodule_search_locations) else: diff --git a/Misc/NEWS.d/next/Build/2022-02-02-11-26-46.bpo-46608.cXH9po.rst b/Misc/NEWS.d/next/Build/2022-02-02-11-26-46.bpo-46608.cXH9po.rst new file mode 100644 index 0000000000000..13c73a614e5e8 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-02-02-11-26-46.bpo-46608.cXH9po.rst @@ -0,0 +1,2 @@ +Exclude marshalled-frozen data if deep-freezing to save 300 KB disk space. This includes adding +a new ``is_package`` field to :c:struct:`_frozen`. Patch by Kumar Aditya. diff --git a/Python/frozen.c b/Python/frozen.c index 25cf0a8d37c78..c5b36f73b4a47 100644 --- a/Python/frozen.c +++ b/Python/frozen.c @@ -39,29 +39,6 @@ #include "pycore_import.h" /* Includes for frozen modules: */ -#include "frozen_modules/importlib._bootstrap.h" -#include "frozen_modules/importlib._bootstrap_external.h" -#include "frozen_modules/zipimport.h" -#include "frozen_modules/abc.h" -#include "frozen_modules/codecs.h" -#include "frozen_modules/io.h" -#include "frozen_modules/_collections_abc.h" -#include "frozen_modules/_sitebuiltins.h" -#include "frozen_modules/genericpath.h" -#include "frozen_modules/ntpath.h" -#include "frozen_modules/posixpath.h" -#include "frozen_modules/os.h" -#include "frozen_modules/site.h" -#include "frozen_modules/stat.h" -#include "frozen_modules/importlib.util.h" -#include "frozen_modules/importlib.machinery.h" -#include "frozen_modules/runpy.h" -#include "frozen_modules/__hello__.h" -#include "frozen_modules/__phello__.h" -#include "frozen_modules/__phello__.ham.h" -#include "frozen_modules/__phello__.ham.eggs.h" -#include "frozen_modules/__phello__.spam.h" -#include "frozen_modules/frozen_only.h" /* End includes */ #define GET_CODE(name) _Py_get_##name##_toplevel @@ -98,49 +75,47 @@ extern PyObject *_Py_get___phello___spam_toplevel(void); extern PyObject *_Py_get_frozen_only_toplevel(void); /* End extern declarations */ -/* Note that a negative size indicates a package. */ - static const struct _frozen bootstrap_modules[] = { - {"_frozen_importlib", _Py_M__importlib__bootstrap, (int)sizeof(_Py_M__importlib__bootstrap), GET_CODE(importlib__bootstrap)}, - {"_frozen_importlib_external", _Py_M__importlib__bootstrap_external, (int)sizeof(_Py_M__importlib__bootstrap_external), GET_CODE(importlib__bootstrap_external)}, - {"zipimport", _Py_M__zipimport, (int)sizeof(_Py_M__zipimport), GET_CODE(zipimport)}, + {"_frozen_importlib", NULL, 0, false, GET_CODE(importlib__bootstrap)}, + {"_frozen_importlib_external", NULL, 0, false, GET_CODE(importlib__bootstrap_external)}, + {"zipimport", NULL, 0, false, GET_CODE(zipimport)}, {0, 0, 0} /* bootstrap sentinel */ }; static const struct _frozen stdlib_modules[] = { /* stdlib - startup, without site (python -S) */ - {"abc", _Py_M__abc, (int)sizeof(_Py_M__abc), GET_CODE(abc)}, - {"codecs", _Py_M__codecs, (int)sizeof(_Py_M__codecs), GET_CODE(codecs)}, - {"io", _Py_M__io, (int)sizeof(_Py_M__io), GET_CODE(io)}, + {"abc", NULL, 0, false, GET_CODE(abc)}, + {"codecs", NULL, 0, false, GET_CODE(codecs)}, + {"io", NULL, 0, false, GET_CODE(io)}, /* stdlib - startup, with site */ - {"_collections_abc", _Py_M___collections_abc, (int)sizeof(_Py_M___collections_abc), GET_CODE(_collections_abc)}, - {"_sitebuiltins", _Py_M___sitebuiltins, (int)sizeof(_Py_M___sitebuiltins), GET_CODE(_sitebuiltins)}, - {"genericpath", _Py_M__genericpath, (int)sizeof(_Py_M__genericpath), GET_CODE(genericpath)}, - {"ntpath", _Py_M__ntpath, (int)sizeof(_Py_M__ntpath), GET_CODE(ntpath)}, - {"posixpath", _Py_M__posixpath, (int)sizeof(_Py_M__posixpath), GET_CODE(posixpath)}, - {"os.path", _Py_M__posixpath, (int)sizeof(_Py_M__posixpath), GET_CODE(posixpath)}, - {"os", _Py_M__os, (int)sizeof(_Py_M__os), GET_CODE(os)}, - {"site", _Py_M__site, (int)sizeof(_Py_M__site), GET_CODE(site)}, - {"stat", _Py_M__stat, (int)sizeof(_Py_M__stat), GET_CODE(stat)}, + {"_collections_abc", NULL, 0, false, GET_CODE(_collections_abc)}, + {"_sitebuiltins", NULL, 0, false, GET_CODE(_sitebuiltins)}, + {"genericpath", NULL, 0, false, GET_CODE(genericpath)}, + {"ntpath", NULL, 0, false, GET_CODE(ntpath)}, + {"posixpath", NULL, 0, false, GET_CODE(posixpath)}, + {"os.path", NULL, 0, false, GET_CODE(posixpath)}, + {"os", NULL, 0, false, GET_CODE(os)}, + {"site", NULL, 0, false, GET_CODE(site)}, + {"stat", NULL, 0, false, GET_CODE(stat)}, /* runpy - run module with -m */ - {"importlib.util", _Py_M__importlib_util, (int)sizeof(_Py_M__importlib_util), GET_CODE(importlib_util)}, - {"importlib.machinery", _Py_M__importlib_machinery, (int)sizeof(_Py_M__importlib_machinery), GET_CODE(importlib_machinery)}, - {"runpy", _Py_M__runpy, (int)sizeof(_Py_M__runpy), GET_CODE(runpy)}, + {"importlib.util", NULL, 0, false, GET_CODE(importlib_util)}, + {"importlib.machinery", NULL, 0, false, GET_CODE(importlib_machinery)}, + {"runpy", NULL, 0, false, GET_CODE(runpy)}, {0, 0, 0} /* stdlib sentinel */ }; static const struct _frozen test_modules[] = { - {"__hello__", _Py_M____hello__, (int)sizeof(_Py_M____hello__), GET_CODE(__hello__)}, - {"__hello_alias__", _Py_M____hello__, (int)sizeof(_Py_M____hello__), GET_CODE(__hello__)}, - {"__phello_alias__", _Py_M____hello__, -(int)sizeof(_Py_M____hello__), GET_CODE(__hello__)}, - {"__phello_alias__.spam", _Py_M____hello__, (int)sizeof(_Py_M____hello__), GET_CODE(__hello__)}, - {"__phello__", _Py_M____phello__, -(int)sizeof(_Py_M____phello__), GET_CODE(__phello__)}, - {"__phello__.__init__", _Py_M____phello__, (int)sizeof(_Py_M____phello__), GET_CODE(__phello__)}, - {"__phello__.ham", _Py_M____phello___ham, -(int)sizeof(_Py_M____phello___ham), GET_CODE(__phello___ham)}, - {"__phello__.ham.__init__", _Py_M____phello___ham, (int)sizeof(_Py_M____phello___ham), GET_CODE(__phello___ham)}, - {"__phello__.ham.eggs", _Py_M____phello___ham_eggs, (int)sizeof(_Py_M____phello___ham_eggs), GET_CODE(__phello___ham_eggs)}, - {"__phello__.spam", _Py_M____phello___spam, (int)sizeof(_Py_M____phello___spam), GET_CODE(__phello___spam)}, - {"__hello_only__", _Py_M__frozen_only, (int)sizeof(_Py_M__frozen_only), GET_CODE(frozen_only)}, + {"__hello__", NULL, 0, false, GET_CODE(__hello__)}, + {"__hello_alias__", NULL, 0, false, GET_CODE(__hello__)}, + {"__phello_alias__", NULL, 0, true, GET_CODE(__hello__)}, + {"__phello_alias__.spam", NULL, 0, false, GET_CODE(__hello__)}, + {"__phello__", NULL, 0, true, GET_CODE(__phello__)}, + {"__phello__.__init__", NULL, 0, false, GET_CODE(__phello__)}, + {"__phello__.ham", NULL, 0, true, GET_CODE(__phello___ham)}, + {"__phello__.ham.__init__", NULL, 0, false, GET_CODE(__phello___ham)}, + {"__phello__.ham.eggs", NULL, 0, false, GET_CODE(__phello___ham_eggs)}, + {"__phello__.spam", NULL, 0, false, GET_CODE(__phello___spam)}, + {"__hello_only__", NULL, 0, false, GET_CODE(frozen_only)}, {0, 0, 0} /* test sentinel */ }; const struct _frozen *_PyImport_FrozenBootstrap = bootstrap_modules; diff --git a/Python/import.c b/Python/import.c index 51b779ca17c52..be60c431f7ef8 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1297,13 +1297,21 @@ find_frozen(PyObject *nameobj, struct frozen_info *info) info->nameobj = nameobj; // borrowed info->data = (const char *)p->code; info->get_code = p->get_code; - info->size = p->size < 0 ? -(p->size) : p->size; - info->is_package = p->size < 0 ? true : false; + info->size = p->size; + info->is_package = p->is_package; + if (p->size < 0) { + // backward compatibility with negative size values + info->size = -(p->size); + info->is_package = true; + } info->origname = name; info->is_alias = resolve_module_alias(name, _PyImport_FrozenAliases, &info->origname); } - + if (p->code == NULL && p->size == 0 && p->get_code != NULL) { + /* It is only deepfrozen. */ + return FROZEN_OKAY; + } if (p->code == NULL) { /* It is frozen but marked as un-importable. */ return FROZEN_EXCLUDED; @@ -2224,7 +2232,7 @@ _imp_get_frozen_object_impl(PyObject *module, PyObject *name, if (info.nameobj == NULL) { info.nameobj = name; } - if (info.size == 0) { + if (info.size == 0 && info.get_code == NULL) { /* Does not contain executable code. */ set_frozen_error(FROZEN_INVALID, name); return NULL; diff --git a/Tools/freeze/makefreeze.py b/Tools/freeze/makefreeze.py index d7d05db88a96c..bc5f8567448bf 100644 --- a/Tools/freeze/makefreeze.py +++ b/Tools/freeze/makefreeze.py @@ -45,19 +45,19 @@ def makefreeze(base, dict, debug=0, entry_point=None, fail_import=()): print("freezing", mod, "...") str = marshal.dumps(m.__code__) size = len(str) + is_package = 'false' if m.__path__: - # Indicate package by negative size - size = -size - done.append((mod, mangled, size)) + is_package = 'true' + done.append((mod, mangled, size, is_package)) writecode(outfp, mangled, str) if debug: print("generating table of frozen modules") with bkfile.open(base + 'frozen.c', 'w') as outfp: - for mod, mangled, size in done: + for mod, mangled, size, _ in done: outfp.write('extern unsigned char M_%s[];\n' % mangled) outfp.write(header) - for mod, mangled, size in done: - outfp.write('\t{"%s", M_%s, %d},\n' % (mod, mangled, size)) + for mod, mangled, size, is_package in done: + outfp.write('\t{"%s", M_%s, %d, %s},\n' % (mod, mangled, size, is_package)) outfp.write('\n') # The following modules have a NULL code pointer, indicating # that the frozen program should not search for them on the host diff --git a/Tools/scripts/freeze_modules.py b/Tools/scripts/freeze_modules.py index 6d10758b5285c..03dcf939f978e 100644 --- a/Tools/scripts/freeze_modules.py +++ b/Tools/scripts/freeze_modules.py @@ -9,7 +9,7 @@ import ntpath import posixpath import sys - +import argparse from update_file import updating_file_with_tmpfile @@ -463,14 +463,15 @@ def replace_block(lines, start_marker, end_marker, replacements, file): return lines[:start_pos + 1] + replacements + lines[end_pos:] -def regen_frozen(modules): +def regen_frozen(modules, deepfreeze_only: bool): headerlines = [] parentdir = os.path.dirname(FROZEN_FILE) - for src in _iter_sources(modules): - # Adding a comment to separate sections here doesn't add much, - # so we don't. - header = relpath_for_posix_display(src.frozenfile, parentdir) - headerlines.append(f'#include "{header}"') + if not deepfreeze_only: + for src in _iter_sources(modules): + # Adding a comment to separate sections here doesn't add much, + # so we don't. + header = relpath_for_posix_display(src.frozenfile, parentdir) + headerlines.append(f'#include "{header}"') externlines = [] bootstraplines = [] @@ -500,9 +501,13 @@ def regen_frozen(modules): externlines.append("extern PyObject *%s(void);" % get_code_name) symbol = mod.symbol - pkg = '-' if mod.ispkg else '' - line = ('{"%s", %s, %s(int)sizeof(%s), GET_CODE(%s)},' - ) % (mod.name, symbol, pkg, symbol, code_name) + pkg = 'true' if mod.ispkg else 'false' + if deepfreeze_only: + line = ('{"%s", NULL, 0, %s, GET_CODE(%s)},' + ) % (mod.name, pkg, code_name) + else: + line = ('{"%s", %s, (int)sizeof(%s), %s, GET_CODE(%s)},' + ) % (mod.name, symbol, symbol, pkg, code_name) lines.append(line) if mod.isalias: @@ -710,18 +715,19 @@ def regen_pcbuild(modules): ####################################### # the script -def main(): +def main(deepfreeze_only: bool): # Expand the raw specs, preserving order. modules = list(parse_frozen_specs()) # Regen build-related files. regen_makefile(modules) regen_pcbuild(modules) - regen_frozen(modules) + regen_frozen(modules, deepfreeze_only) if __name__ == '__main__': - argv = sys.argv[1:] - if argv: - sys.exit(f'ERROR: got unexpected args {argv}') - main() + parser = argparse.ArgumentParser() + parser.add_argument("--deepfreeze-only", action="store_true", + help="Only use deepfrozen modules", default=True) + args = parser.parse_args() + main(args.deepfreeze_only) From webhook-mailer at python.org Fri Feb 4 14:59:48 2022 From: webhook-mailer at python.org (terryjreedy) Date: Fri, 04 Feb 2022 19:59:48 -0000 Subject: [Python-checkins] [3.10] bpo-46609: Update asyncio-task coroutine doc (GH-31132) Message-ID: https://github.com/python/cpython/commit/5603db43ba7ba5568b7516d0e28730a2bc1e1f26 commit: 5603db43ba7ba5568b7516d0e28730a2bc1e1f26 branch: 3.10 author: Terry Jan Reedy committer: terryjreedy date: 2022-02-04T14:59:23-05:00 summary: [3.10] bpo-46609: Update asyncio-task coroutine doc (GH-31132) @coroutine in removed in 3.11, not 3.10. files: M Doc/library/asyncio-task.rst diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index 1175b0537c051..7f4cc70386157 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -1057,7 +1057,7 @@ Generator-based Coroutines .. note:: Support for generator-based coroutines is **deprecated** and - is scheduled for removal in Python 3.10. + is removed in Python 3.11. Generator-based coroutines predate async/await syntax. They are Python generators that use ``yield from`` expressions to await From webhook-mailer at python.org Fri Feb 4 15:46:17 2022 From: webhook-mailer at python.org (terryjreedy) Date: Fri, 04 Feb 2022 20:46:17 -0000 Subject: [Python-checkins] [3.9] bpo-46609: Update asyncio-task coroutine doc (GH-31132) Message-ID: https://github.com/python/cpython/commit/459e26f0987a12a19238baba422e13a8f7fcfca3 commit: 459e26f0987a12a19238baba422e13a8f7fcfca3 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: terryjreedy date: 2022-02-04T15:46:09-05:00 summary: [3.9] bpo-46609: Update asyncio-task coroutine doc (GH-31132) @coroutine in removed in 3.11, not 3.10. (cherry picked from commit 5603db43ba7ba5568b7516d0e28730a2bc1e1f26) Co-authored-by: Terry Jan Reedy files: M Doc/library/asyncio-task.rst diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index e8bee20bc76bc..38b12e44b6de2 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -991,7 +991,7 @@ Generator-based Coroutines .. note:: Support for generator-based coroutines is **deprecated** and - is scheduled for removal in Python 3.10. + is removed in Python 3.11. Generator-based coroutines predate async/await syntax. They are Python generators that use ``yield from`` expressions to await @@ -1019,7 +1019,7 @@ enforced. This decorator should not be used for :keyword:`async def` coroutines. - .. deprecated-removed:: 3.8 3.10 + .. deprecated-removed:: 3.8 3.11 Use :keyword:`async def` instead. From webhook-mailer at python.org Fri Feb 4 22:54:34 2022 From: webhook-mailer at python.org (ethanfurman) Date: Sat, 05 Feb 2022 03:54:34 -0000 Subject: [Python-checkins] bpo-31369: include ``RegexFlag`` in ``re.__all__`` (GH-30279) Message-ID: https://github.com/python/cpython/commit/fea7290a0ecee09bbce571d4d10f5881b7ea3485 commit: fea7290a0ecee09bbce571d4d10f5881b7ea3485 branch: main author: andrei kulakov committer: ethanfurman date: 2022-02-04T19:54:28-08:00 summary: bpo-31369: include ``RegexFlag`` in ``re.__all__`` (GH-30279) * added RegexFlag to re.__all__; added RegexFlag.NOFLAG Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Library/2021-12-27-18-28-44.bpo-31369.b9yM94.rst M Doc/library/re.rst M Lib/re.py diff --git a/Doc/library/re.rst b/Doc/library/re.rst index b12ce4b9744f9..8d62e3bf4d8d8 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -637,6 +637,11 @@ form. programs that use only a few regular expressions at a time needn't worry about compiling regular expressions. +.. class:: RegexFlag + + An :class:`enum.IntFlag` class containing the regex options listed below. + + .. versionadded:: 3.11 - added to ``__all__`` .. data:: A ASCII @@ -710,6 +715,17 @@ form. string and immediately before the newline (if any) at the end of the string. Corresponds to the inline flag ``(?m)``. +.. data:: NOFLAG + + Indicates no flag being applied, the value is ``0``. This flag may be used + as a default value for a function keyword argument or as a base value that + will be conditionally ORed with other flags. Example of use as a default + value:: + + def myfunc(text, flag=re.NOFLAG): + return re.match(text, flag) + + .. versionadded:: 3.11 .. data:: S DOTALL diff --git a/Lib/re.py b/Lib/re.py index a7ab9b3706748..e9a745dc581a6 100644 --- a/Lib/re.py +++ b/Lib/re.py @@ -137,7 +137,7 @@ "findall", "finditer", "compile", "purge", "template", "escape", "error", "Pattern", "Match", "A", "I", "L", "M", "S", "X", "U", "ASCII", "IGNORECASE", "LOCALE", "MULTILINE", "DOTALL", "VERBOSE", - "UNICODE", + "UNICODE", "NOFLAG", "RegexFlag", ] __version__ = "2.2.1" @@ -145,6 +145,7 @@ @enum.global_enum @enum._simple_enum(enum.IntFlag, boundary=enum.KEEP) class RegexFlag: + NOFLAG = 0 ASCII = A = sre_compile.SRE_FLAG_ASCII # assume ascii "locale" IGNORECASE = I = sre_compile.SRE_FLAG_IGNORECASE # ignore case LOCALE = L = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale diff --git a/Misc/NEWS.d/next/Library/2021-12-27-18-28-44.bpo-31369.b9yM94.rst b/Misc/NEWS.d/next/Library/2021-12-27-18-28-44.bpo-31369.b9yM94.rst new file mode 100644 index 0000000000000..2bb9e62de1f40 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-12-27-18-28-44.bpo-31369.b9yM94.rst @@ -0,0 +1,2 @@ +Add :class:`~re.RegexFlag` to ``re.__all__`` and documented it. Add +:data:`~re.RegexFlag.NOFLAG` to indicate no flags being set. From webhook-mailer at python.org Sat Feb 5 10:50:11 2022 From: webhook-mailer at python.org (gvanrossum) Date: Sat, 05 Feb 2022 15:50:11 -0000 Subject: [Python-checkins] Fix __init_subclass__ using self instead of class (#31135) Message-ID: https://github.com/python/cpython/commit/2f077b6991f59c51989b65618317297c1eb0fb95 commit: 2f077b6991f59c51989b65618317297c1eb0fb95 branch: main author: Gregory Beauregard committer: gvanrossum date: 2022-02-05T07:50:00-08:00 summary: Fix __init_subclass__ using self instead of class (#31135) files: M Lib/typing.py diff --git a/Lib/typing.py b/Lib/typing.py index 0cf9755022e9b..e4e32b5b320d0 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -349,7 +349,7 @@ class _Final: __slots__ = ('__weakref__',) - def __init_subclass__(self, /, *args, **kwds): + def __init_subclass__(cls, /, *args, **kwds): if '_root' not in kwds: raise TypeError("Cannot subclass special typing classes") From webhook-mailer at python.org Sat Feb 5 10:59:58 2022 From: webhook-mailer at python.org (gvanrossum) Date: Sat, 05 Feb 2022 15:59:58 -0000 Subject: [Python-checkins] bpo-46608: Fix argument parsing in freeze_modules.py (GH-31131) Message-ID: https://github.com/python/cpython/commit/9d4161a60ca8b470148ffd6c73e3110a0aa6d66f commit: 9d4161a60ca8b470148ffd6c73e3110a0aa6d66f branch: main author: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> committer: gvanrossum date: 2022-02-05T07:59:48-08:00 summary: bpo-46608: Fix argument parsing in freeze_modules.py (GH-31131) files: M Tools/scripts/freeze_modules.py diff --git a/Tools/scripts/freeze_modules.py b/Tools/scripts/freeze_modules.py index 03dcf939f978e..0dc61e2fe32b2 100644 --- a/Tools/scripts/freeze_modules.py +++ b/Tools/scripts/freeze_modules.py @@ -463,10 +463,10 @@ def replace_block(lines, start_marker, end_marker, replacements, file): return lines[:start_pos + 1] + replacements + lines[end_pos:] -def regen_frozen(modules, deepfreeze_only: bool): +def regen_frozen(modules, frozen_modules: bool): headerlines = [] parentdir = os.path.dirname(FROZEN_FILE) - if not deepfreeze_only: + if frozen_modules: for src in _iter_sources(modules): # Adding a comment to separate sections here doesn't add much, # so we don't. @@ -502,7 +502,7 @@ def regen_frozen(modules, deepfreeze_only: bool): symbol = mod.symbol pkg = 'true' if mod.ispkg else 'false' - if deepfreeze_only: + if not frozen_modules: line = ('{"%s", NULL, 0, %s, GET_CODE(%s)},' ) % (mod.name, pkg, code_name) else: @@ -715,19 +715,21 @@ def regen_pcbuild(modules): ####################################### # the script -def main(deepfreeze_only: bool): +parser = argparse.ArgumentParser() +parser.add_argument("--frozen-modules", action="store_true", + help="Use both frozen and deepfrozen modules. (default: uses only deepfrozen modules)") + +def main(): + args = parser.parse_args() + frozen_modules: bool = args.frozen_modules # Expand the raw specs, preserving order. modules = list(parse_frozen_specs()) # Regen build-related files. regen_makefile(modules) regen_pcbuild(modules) - regen_frozen(modules, deepfreeze_only) + regen_frozen(modules, frozen_modules) if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument("--deepfreeze-only", action="store_true", - help="Only use deepfrozen modules", default=True) - args = parser.parse_args() - main(args.deepfreeze_only) + main() From webhook-mailer at python.org Sat Feb 5 14:52:29 2022 From: webhook-mailer at python.org (tiran) Date: Sat, 05 Feb 2022 19:52:29 -0000 Subject: [Python-checkins] bpo-40280: Address more test failures on Emscripten (GH-31050) Message-ID: https://github.com/python/cpython/commit/96b344c2f15cb09251018f57f19643fe20637392 commit: 96b344c2f15cb09251018f57f19643fe20637392 branch: main author: Christian Heimes committer: tiran date: 2022-02-05T20:52:01+01:00 summary: bpo-40280: Address more test failures on Emscripten (GH-31050) Co-authored-by: Brett Cannon files: A Misc/NEWS.d/next/Build/2022-01-31-15-15-08.bpo-40280.r1AYNW.rst M Lib/test/support/__init__.py M Lib/test/support/os_helper.py M Lib/test/test_builtin.py M Lib/test/test_capi.py M Lib/test/test_faulthandler.py M Lib/test/test_fileio.py M Lib/test/test_genericalias.py M Lib/test/test_getpass.py M Lib/test/test_inspect.py M Lib/test/test_interpreters.py M Lib/test/test_io.py M Lib/test/test_os.py M Lib/test/test_posix.py M Lib/test/test_pwd.py M Lib/test/test_pyexpat.py M Lib/test/test_resource.py M Lib/test/test_zipfile.py M Modules/clinic/resource.c.h M Modules/posixmodule.c M Modules/resource.c M Modules/timemodule.c M Tools/wasm/README.md M Tools/wasm/config.site-wasm32-emscripten M configure M configure.ac M pyconfig.h.in diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index e5eb66e9068e7..9d0d3d9c9b619 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -1278,6 +1278,8 @@ def reap_children(): # Need os.waitpid(-1, os.WNOHANG): Windows is not supported if not (hasattr(os, 'waitpid') and hasattr(os, 'WNOHANG')): return + elif not has_subprocess_support: + return # Reap all our dead child processes so we don't leave zombies around. # These hog resources and might be causing some of the buildbots to die. diff --git a/Lib/test/support/os_helper.py b/Lib/test/support/os_helper.py index 50aa7a7176c0a..c761d7bd3d2b6 100644 --- a/Lib/test/support/os_helper.py +++ b/Lib/test/support/os_helper.py @@ -502,7 +502,7 @@ def __fspath__(self): def fd_count(): """Count the number of open file descriptors. """ - if sys.platform.startswith(('linux', 'freebsd')): + if sys.platform.startswith(('linux', 'freebsd', 'emscripten')): try: names = os.listdir("/proc/self/fd") # Subtract one because listdir() internally opens a file diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index c6e67cc2910cf..a601a524d6eb7 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -393,6 +393,7 @@ def test_compile_top_level_await_no_coro(self): msg=f"source={source} mode={mode}") + @unittest.skipIf(support.is_emscripten, "socket.accept is broken") def test_compile_top_level_await(self): """Test whether code some top level await can be compiled. @@ -1213,6 +1214,7 @@ def test_open_default_encoding(self): os.environ.clear() os.environ.update(old_environ) + @support.requires_subprocess() def test_open_non_inheritable(self): fileobj = open(__file__, encoding="utf-8") with fileobj: diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index ccf8ceda49831..089088d97a66e 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -611,6 +611,7 @@ def check_fatal_error(self, code, expected, not_expected=()): self.assertNotIn(name, modules) self.assertEqual(len(modules), total) + @support.requires_subprocess() def test_fatal_error(self): # By default, stdlib extension modules are ignored, # but not test modules. @@ -880,6 +881,7 @@ class Test_testinternalcapi(unittest.TestCase): if name.startswith('test_')) + at support.requires_subprocess() class PyMemDebugTests(unittest.TestCase): PYTHONMALLOC = 'debug' # '0x04c06e0' or '04C06E0' diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py index daacdeef5bc80..8d106daaf6520 100644 --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -19,6 +19,9 @@ except ImportError: _testcapi = None +if not support.has_subprocess_support: + raise unittest.SkipTest("test module requires subprocess") + TIMEOUT = 0.5 MS_WINDOWS = (os.name == 'nt') diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py index 4269b0e53f56d..e4984d3cd559e 100644 --- a/Lib/test/test_fileio.py +++ b/Lib/test/test_fileio.py @@ -9,7 +9,7 @@ from weakref import proxy from functools import wraps -from test.support import cpython_only, swap_attr, gc_collect +from test.support import cpython_only, swap_attr, gc_collect, is_emscripten from test.support.os_helper import (TESTFN, TESTFN_UNICODE, make_bad_fd) from test.support.warnings_helper import check_warnings from collections import UserList @@ -373,7 +373,7 @@ def testAbles(self): self.assertEqual(f.isatty(), False) f.close() - if sys.platform != "win32": + if sys.platform != "win32" and not is_emscripten: try: f = self.FileIO("/dev/tty", "a") except OSError: diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 706cc5ea1af2f..d311281c578a2 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -24,14 +24,20 @@ from fileinput import FileInput from itertools import chain from http.cookies import Morsel -from multiprocessing.managers import ValueProxy -from multiprocessing.pool import ApplyResult +try: + from multiprocessing.managers import ValueProxy + from multiprocessing.pool import ApplyResult + from multiprocessing.queues import SimpleQueue as MPSimpleQueue +except ImportError: + # _multiprocessing module is optional + ValueProxy = None + ApplyResult = None + MPSimpleQueue = None try: from multiprocessing.shared_memory import ShareableList except ImportError: # multiprocessing.shared_memory is not available on e.g. Android ShareableList = None -from multiprocessing.queues import SimpleQueue as MPSimpleQueue from os import DirEntry from re import Pattern, Match from types import GenericAlias, MappingProxyType, AsyncGeneratorType @@ -79,13 +85,14 @@ class BaseTest(unittest.TestCase): Queue, SimpleQueue, _AssertRaisesContext, SplitResult, ParseResult, - ValueProxy, ApplyResult, WeakSet, ReferenceType, ref, - ShareableList, MPSimpleQueue, + ShareableList, Future, _WorkItem, Morsel] if ctypes is not None: generic_types.extend((ctypes.Array, ctypes.LibraryLoader)) + if ValueProxy is not None: + generic_types.extend((ValueProxy, ApplyResult, MPSimpleQueue)) def test_subscriptable(self): for t in self.generic_types: diff --git a/Lib/test/test_getpass.py b/Lib/test/test_getpass.py index 3452e46213a76..98ecec94336e3 100644 --- a/Lib/test/test_getpass.py +++ b/Lib/test/test_getpass.py @@ -28,6 +28,9 @@ def test_username_priorities_of_env_values(self, environ): getpass.getuser() except ImportError: # in case there's no pwd module pass + except KeyError: + # current user has no pwd entry + pass self.assertEqual( environ.get.call_args_list, [mock.call(x) for x in ('LOGNAME', 'USER', 'LNAME', 'USERNAME')]) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index a553431bdccfb..29589a726768f 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -788,6 +788,7 @@ def test_nested_class_definition_inside_function(self): self.assertSourceEqual(mod2.cls213, 218, 222) self.assertSourceEqual(mod2.cls213().func219(), 220, 221) + @unittest.skipIf(support.is_emscripten, "socket.accept is broken") def test_nested_class_definition_inside_async_function(self): import asyncio self.addCleanup(asyncio.set_event_loop_policy, None) diff --git a/Lib/test/test_interpreters.py b/Lib/test/test_interpreters.py index 6266aa7c33b32..48c7119fff1cf 100644 --- a/Lib/test/test_interpreters.py +++ b/Lib/test/test_interpreters.py @@ -5,7 +5,8 @@ import unittest import time -import _xxsubinterpreters as _interpreters +from test.support import import_helper +_interpreters = import_helper.import_module('_xxsubinterpreters') from test.support import interpreters diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index a10611abb13f4..e9abd153a3e8c 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -76,6 +76,10 @@ def _default_chunk_size(): with open(__file__, "r", encoding="latin-1") as f: return f._CHUNK_SIZE +requires_alarm = unittest.skipUnless( + hasattr(signal, "alarm"), "test requires signal.alarm()" +) + class MockRawIOWithoutRead: """A RawIO implementation without read(), so as to exercise the default @@ -4435,12 +4439,15 @@ def _read(): if e.errno != errno.EBADF: raise + @requires_alarm def test_interrupted_write_unbuffered(self): self.check_interrupted_write(b"xy", b"xy", mode="wb", buffering=0) + @requires_alarm def test_interrupted_write_buffered(self): self.check_interrupted_write(b"xy", b"xy", mode="wb") + @requires_alarm def test_interrupted_write_text(self): self.check_interrupted_write("xy", b"xy", mode="w", encoding="ascii") @@ -4472,9 +4479,11 @@ def on_alarm(*args): wio.close() os.close(r) + @requires_alarm def test_reentrant_write_buffered(self): self.check_reentrant_write(b"xy", mode="wb") + @requires_alarm def test_reentrant_write_text(self): self.check_reentrant_write("xy", mode="w", encoding="ascii") @@ -4502,10 +4511,12 @@ def alarm_handler(sig, frame): os.close(w) os.close(r) + @requires_alarm def test_interrupted_read_retry_buffered(self): self.check_interrupted_read_retry(lambda x: x.decode('latin1'), mode="rb") + @requires_alarm def test_interrupted_read_retry_text(self): self.check_interrupted_read_retry(lambda x: x, mode="r", encoding="latin1") @@ -4578,9 +4589,11 @@ def alarm2(sig, frame): if e.errno != errno.EBADF: raise + @requires_alarm def test_interrupted_write_retry_buffered(self): self.check_interrupted_write_retry(b"x", mode="wb") + @requires_alarm def test_interrupted_write_retry_text(self): self.check_interrupted_write_retry("x", mode="w", encoding="latin1") diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 84c27f346c340..660691579c163 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -992,6 +992,7 @@ def _empty_mapping(self): @unittest.skipUnless(unix_shell and os.path.exists(unix_shell), 'requires a shell') @unittest.skipUnless(hasattr(os, 'popen'), "needs os.popen()") + @support.requires_subprocess() def test_update2(self): os.environ.clear() os.environ.update(HELLO="World") @@ -1002,6 +1003,7 @@ def test_update2(self): @unittest.skipUnless(unix_shell and os.path.exists(unix_shell), 'requires a shell') @unittest.skipUnless(hasattr(os, 'popen'), "needs os.popen()") + @support.requires_subprocess() def test_os_popen_iter(self): with os.popen("%s -c 'echo \"line