From f56268a2cd38b3fe2be1e4361d3d8b581e73559b Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Sun, 26 Sep 2021 19:32:18 +0300 Subject: [PATCH 001/263] bpo-45280: Add test for empty `NamedTuple` in `test_typing` (GH-28559) Co-authored-by: Dong-hee Na --- Lib/test/test_typing.py | 13 +++++++++++++ .../Tests/2021-09-25-11-05-31.bpo-45280.3MA6lC.rst | 1 + 2 files changed, 14 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2021-09-25-11-05-31.bpo-45280.3MA6lC.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index d1887f7eee4437..38397a07e57179 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -4115,6 +4115,19 @@ def test_namedtuple_special_keyword_names(self): self.assertEqual(a.typename, 'foo') self.assertEqual(a.fields, [('bar', tuple)]) + def test_empty_namedtuple(self): + NT = NamedTuple('NT') + + class CNT(NamedTuple): + pass # empty body + + for struct in [NT, CNT]: + with self.subTest(struct=struct): + self.assertEqual(struct._fields, ()) + self.assertEqual(struct._field_defaults, {}) + self.assertEqual(struct.__annotations__, {}) + self.assertIsInstance(struct(), struct) + def test_namedtuple_errors(self): with self.assertRaises(TypeError): NamedTuple.__new__() diff --git a/Misc/NEWS.d/next/Tests/2021-09-25-11-05-31.bpo-45280.3MA6lC.rst b/Misc/NEWS.d/next/Tests/2021-09-25-11-05-31.bpo-45280.3MA6lC.rst new file mode 100644 index 00000000000000..71691f5ba2b89c --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2021-09-25-11-05-31.bpo-45280.3MA6lC.rst @@ -0,0 +1 @@ +Add a test case for empty :class:`typing.NamedTuple`. From 7b88f63e1dd4006b1a08b9c9f087dd13449ecc76 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Sun, 26 Sep 2021 23:24:19 +0200 Subject: [PATCH 002/263] bpo-44958: Revert GH-27844 (GH-28574) This reverts commit 050d1035957379d70e8601e6f5636637716a264b, but keeps the tests. --- Modules/_sqlite/cursor.c | 45 +++++++++++++++++++++---------------- Modules/_sqlite/statement.c | 32 ++++++++++---------------- Modules/_sqlite/statement.h | 2 +- 3 files changed, 39 insertions(+), 40 deletions(-) diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 9bac607e9c9a6b..38ccdcf5379d05 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -104,7 +104,12 @@ cursor_clear(pysqlite_Cursor *self) Py_CLEAR(self->row_cast_map); Py_CLEAR(self->lastrowid); Py_CLEAR(self->row_factory); - Py_CLEAR(self->statement); + if (self->statement) { + /* Reset the statement if the user has not closed the cursor */ + pysqlite_statement_reset(self->statement); + Py_CLEAR(self->statement); + } + return 0; } @@ -116,14 +121,6 @@ cursor_dealloc(pysqlite_Cursor *self) if (self->in_weakreflist != NULL) { PyObject_ClearWeakRefs((PyObject*)self); } - if (self->statement) { - /* A SELECT query will lock the affected database table(s), so we need - * to reset the statement to unlock the database before disappearing */ - sqlite3_stmt *stmt = self->statement->st; - if (sqlite3_stmt_readonly(stmt)) { - pysqlite_statement_reset(self->statement); - } - } tp->tp_clear((PyObject *)self); tp->tp_free(self); Py_DECREF(tp); @@ -518,19 +515,18 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation } } + if (self->statement != NULL) { + /* There is an active statement */ + pysqlite_statement_reset(self->statement); + } + /* reset description and rowcount */ Py_INCREF(Py_None); Py_SETREF(self->description, Py_None); self->rowcount = 0L; if (self->statement) { - /* A SELECT query will lock the affected database table(s), so we need - * to reset the statement to unlock the database before switching - * statements */ - sqlite3_stmt *stmt = self->statement->st; - if (sqlite3_stmt_readonly(stmt)) { - pysqlite_statement_reset(self->statement); - } + (void)pysqlite_statement_reset(self->statement); } PyObject *stmt = get_statement_from_cache(self, operation); @@ -553,6 +549,8 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation goto error; } } + + pysqlite_statement_reset(self->statement); pysqlite_statement_mark_dirty(self->statement); /* We start a transaction implicitly before a DML statement. @@ -572,7 +570,6 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation break; } - pysqlite_statement_reset(self->statement); pysqlite_statement_mark_dirty(self->statement); pysqlite_statement_bind_parameters(state, self->statement, parameters); @@ -590,6 +587,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation PyErr_Clear(); } } + (void)pysqlite_statement_reset(self->statement); _pysqlite_seterror(state, self->connection->db); goto error; } @@ -648,9 +646,13 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation } if (rc == SQLITE_DONE && !multiple) { + pysqlite_statement_reset(self->statement); Py_CLEAR(self->statement); } + if (multiple) { + pysqlite_statement_reset(self->statement); + } Py_XDECREF(parameters); } @@ -802,6 +804,7 @@ pysqlite_cursor_iternext(pysqlite_Cursor *self) sqlite3_stmt *stmt = self->statement->st; assert(stmt != NULL); if (sqlite3_data_count(stmt) == 0) { + (void)pysqlite_statement_reset(self->statement); Py_CLEAR(self->statement); return NULL; } @@ -812,7 +815,7 @@ pysqlite_cursor_iternext(pysqlite_Cursor *self) } int rc = pysqlite_step(stmt); if (rc == SQLITE_DONE) { - Py_CLEAR(self->statement); + (void)pysqlite_statement_reset(self->statement); } else if (rc != SQLITE_ROW) { (void)_pysqlite_seterror(self->connection->state, @@ -982,7 +985,11 @@ pysqlite_cursor_close_impl(pysqlite_Cursor *self, PyTypeObject *cls) return NULL; } - Py_CLEAR(self->statement); + if (self->statement) { + (void)pysqlite_statement_reset(self->statement); + Py_CLEAR(self->statement); + } + self->closed = 1; Py_RETURN_NONE; diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index 3016fe5bb45ce7..b20c91da3179c4 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -360,31 +360,23 @@ pysqlite_statement_bind_parameters(pysqlite_state *state, } } -void -pysqlite_statement_reset(pysqlite_Statement *self) +int pysqlite_statement_reset(pysqlite_Statement* self) { - sqlite3_stmt *stmt = self->st; - if (stmt == NULL || self->in_use == 0) { - return; - } + int rc; -#if SQLITE_VERSION_NUMBER >= 3020000 - /* Check if the statement has been run (that is, sqlite3_step() has been - * called at least once). Third parameter is non-zero in order to reset the - * run count. */ - if (sqlite3_stmt_status(stmt, SQLITE_STMTSTATUS_RUN, 1) == 0) { - return; - } -#endif + rc = SQLITE_OK; - int rc; - Py_BEGIN_ALLOW_THREADS - rc = sqlite3_reset(stmt); - Py_END_ALLOW_THREADS + if (self->in_use && self->st) { + Py_BEGIN_ALLOW_THREADS + rc = sqlite3_reset(self->st); + Py_END_ALLOW_THREADS - if (rc == SQLITE_OK) { - self->in_use = 0; + if (rc == SQLITE_OK) { + self->in_use = 0; + } } + + return rc; } void pysqlite_statement_mark_dirty(pysqlite_Statement* self) diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h index cce81ed910de04..b901c43c479ae2 100644 --- a/Modules/_sqlite/statement.h +++ b/Modules/_sqlite/statement.h @@ -44,7 +44,7 @@ void pysqlite_statement_bind_parameters(pysqlite_state *state, pysqlite_Statement *self, PyObject *parameters); -void pysqlite_statement_reset(pysqlite_Statement *self); +int pysqlite_statement_reset(pysqlite_Statement* self); void pysqlite_statement_mark_dirty(pysqlite_Statement* self); int pysqlite_statement_setup_types(PyObject *module); From a22be4943c119fecf5433d999227ff78fc2e5741 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 27 Sep 2021 14:20:31 +0200 Subject: [PATCH 003/263] bpo-45274: Fix Thread._wait_for_tstate_lock() race condition (GH-28532) Fix a race condition in the Thread.join() method of the threading module. If the function is interrupted by a signal and the signal handler raises an exception, make sure that the thread remains in a consistent state to prevent a deadlock. --- Lib/threading.py | 21 +++++++++++++++---- .../2021-09-23-22-17-26.bpo-45274.gPpa4E.rst | 5 +++++ 2 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-09-23-22-17-26.bpo-45274.gPpa4E.rst diff --git a/Lib/threading.py b/Lib/threading.py index c2b94a5045514f..1c74a8d81e3539 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -1094,11 +1094,24 @@ def _wait_for_tstate_lock(self, block=True, timeout=-1): # If the lock is acquired, the C code is done, and self._stop() is # called. That sets ._is_stopped to True, and ._tstate_lock to None. lock = self._tstate_lock - if lock is None: # already determined that the C code is done + if lock is None: + # already determined that the C code is done assert self._is_stopped - elif lock.acquire(block, timeout): - lock.release() - self._stop() + return + + try: + if lock.acquire(block, timeout): + lock.release() + self._stop() + except: + if lock.locked(): + # bpo-45274: lock.acquire() acquired the lock, but the function + # was interrupted with an exception before reaching the + # lock.release(). It can happen if a signal handler raises an + # exception, like CTRL+C which raises KeyboardInterrupt. + lock.release() + self._stop() + raise @property def name(self): diff --git a/Misc/NEWS.d/next/Library/2021-09-23-22-17-26.bpo-45274.gPpa4E.rst b/Misc/NEWS.d/next/Library/2021-09-23-22-17-26.bpo-45274.gPpa4E.rst new file mode 100644 index 00000000000000..94d06cef89b7be --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-09-23-22-17-26.bpo-45274.gPpa4E.rst @@ -0,0 +1,5 @@ +Fix a race condition in the :meth:`Thread.join() ` +method of the :mod:`threading` module. If the function is interrupted by a +signal and the signal handler raises an exception, make sure that the thread +remains in a consistent state to prevent a deadlock. Patch by Victor +Stinner. From e5f13ce5b48b551c09fdd0faeafa6ecf860de51c Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Mon, 27 Sep 2021 14:37:43 +0100 Subject: [PATCH 004/263] bpo-43914: Correctly highlight SyntaxError exceptions for invalid generator expression in function calls (GH-28576) --- Grammar/python.gram | 2 +- Lib/test/test_syntax.py | 13 ++++++++++++- Parser/parser.c | 6 +++--- Parser/pegen.c | 16 ++++++++++++++-- Parser/pegen.h | 2 +- 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/Grammar/python.gram b/Grammar/python.gram index 97114b20f5dc64..4443a5fda7c245 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -1057,7 +1057,7 @@ invalid_arguments: RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, PyPegen_last_item(b, comprehension_ty)->target, "Generator expression must be parenthesized") } | a=NAME b='=' expression for_if_clauses { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?")} - | a=args for_if_clauses { _PyPegen_nonparen_genexp_in_call(p, a) } + | a=args b=for_if_clauses { _PyPegen_nonparen_genexp_in_call(p, a, b) } | args ',' a=expression b=for_if_clauses { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, asdl_seq_GET(b, b->size-1)->target, "Generator expression must be parenthesized") } | a=args ',' args { _PyPegen_arguments_parsing_error(p, a) } diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index aa86d0cd1d4801..f4a507e91faa23 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -1274,7 +1274,8 @@ class SyntaxTestCase(unittest.TestCase): def _check_error(self, code, errtext, - filename="", mode="exec", subclass=None, lineno=None, offset=None): + filename="", mode="exec", subclass=None, + lineno=None, offset=None, end_lineno=None, end_offset=None): """Check that compiling code raises SyntaxError with errtext. errtest is a regular expression that must be present in the @@ -1294,6 +1295,11 @@ def _check_error(self, code, errtext, self.assertEqual(err.lineno, lineno) if offset is not None: self.assertEqual(err.offset, offset) + if end_lineno is not None: + self.assertEqual(err.end_lineno, end_lineno) + if end_offset is not None: + self.assertEqual(err.end_offset, end_offset) + else: self.fail("compile() did not raise SyntaxError") @@ -1433,6 +1439,11 @@ def test_kwargs_last3(self): self._check_error("int(**{'base': 10}, *['2'])", "iterable argument unpacking follows " "keyword argument unpacking") + + def test_generator_in_function_call(self): + self._check_error("foo(x, y for y in range(3) for z in range(2) if z , p)", + "Generator expression must be parenthesized", + lineno=1, end_lineno=1, offset=11, end_offset=53) def test_empty_line_after_linecont(self): # See issue-40847 diff --git a/Parser/parser.c b/Parser/parser.c index 3cea370c5ad2d0..beb2176e3bbf25 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -17880,15 +17880,15 @@ invalid_arguments_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args for_if_clauses")); expr_ty a; - asdl_comprehension_seq* for_if_clauses_var; + asdl_comprehension_seq* b; if ( (a = args_rule(p)) // args && - (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses + (b = for_if_clauses_rule(p)) // for_if_clauses ) { D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args for_if_clauses")); - _res = _PyPegen_nonparen_genexp_in_call ( p , a ); + _res = _PyPegen_nonparen_genexp_in_call ( p , a , b ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; D(p->level--); diff --git a/Parser/pegen.c b/Parser/pegen.c index c77c534ff090b2..7e2d37caae37a3 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -2551,8 +2551,17 @@ void *_PyPegen_arguments_parsing_error(Parser *p, expr_ty e) { return RAISE_SYNTAX_ERROR(msg); } + +static inline expr_ty +_PyPegen_get_last_comprehension_item(comprehension_ty comprehension) { + if (comprehension->ifs == NULL || asdl_seq_LEN(comprehension->ifs) == 0) { + return comprehension->iter; + } + return PyPegen_last_item(comprehension->ifs, expr_ty); +} + void * -_PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args) +_PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args, asdl_comprehension_seq *comprehensions) { /* The rule that calls this function is 'args for_if_clauses'. For the input f(L, x for x in y), L and x are in args and @@ -2566,8 +2575,11 @@ _PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args) return NULL; } - return RAISE_SYNTAX_ERROR_STARTING_FROM( + comprehension_ty last_comprehension = PyPegen_last_item(comprehensions, comprehension_ty); + + return RAISE_SYNTAX_ERROR_KNOWN_RANGE( (expr_ty) asdl_seq_GET(args->v.Call.args, len - 1), + _PyPegen_get_last_comprehension_item(last_comprehension), "Generator expression must be parenthesized" ); } diff --git a/Parser/pegen.h b/Parser/pegen.h index 57d11779efafe7..8721d7e891005a 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -327,7 +327,7 @@ _RAISE_SYNTAX_ERROR_INVALID_TARGET(Parser *p, TARGETS_TYPE type, void *e) } void *_PyPegen_arguments_parsing_error(Parser *, expr_ty); -void *_PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args); +void *_PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args, asdl_comprehension_seq *comprehensions); // Generated function in parse.c - function definition in python.gram From ae7839bbe817329dd015f9195da308a0f3fbd3e2 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Mon, 27 Sep 2021 10:00:32 -0600 Subject: [PATCH 005/263] bpo-45211: Move helpers from getpath.c to internal API. (gh-28550) This accomplishes 2 things: * consolidates some common code between getpath.c and getpathp.c * makes the helpers available to code in other files FWIW, the signature of the join_relfile() function (in fileutils.c) intentionally mirrors that of Windows' PathCchCombineEx(). Note that this change is mostly moving code around. No behavior is meant to change. https://bugs.python.org/issue45211 --- Include/internal/pycore_fileutils.h | 15 ++++ Include/internal/pycore_pystate.h | 11 +++ Lib/test/test_embed.py | 2 +- Modules/getpath.c | 64 +++-------------- PC/getpathp.c | 55 ++++++++------- Python/fileutils.c | 102 ++++++++++++++++++++++++++-- Python/initconfig.c | 5 -- Python/preconfig.c | 10 +-- 8 files changed, 164 insertions(+), 100 deletions(-) diff --git a/Include/internal/pycore_fileutils.h b/Include/internal/pycore_fileutils.h index c1c9244a1bc7c4..8491ed9b5ffe20 100644 --- a/Include/internal/pycore_fileutils.h +++ b/Include/internal/pycore_fileutils.h @@ -10,6 +10,12 @@ extern "C" { #include /* struct lconv */ +// This is used after getting NULL back from Py_DecodeLocale(). +#define DECODE_LOCALE_ERR(NAME, LEN) \ + ((LEN) == (size_t)-2) \ + ? _PyStatus_ERR("cannot decode " NAME) \ + : _PyStatus_NO_MEMORY() + PyAPI_DATA(int) _Py_HasFileSystemDefaultEncodeErrors; PyAPI_FUNC(int) _Py_DecodeUTF8Ex( @@ -33,6 +39,9 @@ PyAPI_FUNC(wchar_t*) _Py_DecodeUTF8_surrogateescape( Py_ssize_t arglen, size_t *wlen); +extern int +_Py_wstat(const wchar_t *, struct stat *); + PyAPI_FUNC(int) _Py_GetForceASCII(void); /* Reset "force ASCII" mode (if it was initialized). @@ -65,6 +74,12 @@ extern int _Py_EncodeNonUnicodeWchar_InPlace( Py_ssize_t size); #endif +extern wchar_t * _Py_join_relfile(const wchar_t *dirname, + const wchar_t *relfile); +extern int _Py_add_relfile(wchar_t *dirname, + const wchar_t *relfile, + size_t bufsize); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 4b894f3eff4967..aef318989aa6e5 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -30,6 +30,17 @@ _Py_IsMainInterpreter(PyInterpreterState *interp) } +static inline const PyConfig * +_Py_GetMainConfig(void) +{ + PyInterpreterState *interp = _PyRuntime.interpreters.main; + if (interp == NULL) { + return NULL; + } + return _PyInterpreterState_GetConfig(interp); +} + + /* Only handle signals on the main thread of the main interpreter. */ static inline int _Py_ThreadCanHandleSignals(PyInterpreterState *interp) diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index e1b466a7b56b18..cda814c3ed34ee 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -434,7 +434,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'pathconfig_warnings': 1, '_init_main': 1, '_isolated_interpreter': 0, - 'use_frozen_modules': False, + 'use_frozen_modules': 0, } if MS_WINDOWS: CONFIG_COMPAT.update({ diff --git a/Modules/getpath.c b/Modules/getpath.c index 363d62a0657ebd..de1c6e3fbb657b 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -115,11 +115,6 @@ extern "C" { #define BUILD_LANDMARK L"Modules/Setup.local" -#define DECODE_LOCALE_ERR(NAME, LEN) \ - ((LEN) == (size_t)-2) \ - ? _PyStatus_ERR("cannot decode " NAME) \ - : _PyStatus_NO_MEMORY() - #define PATHLEN_ERR() _PyStatus_ERR("path configuration: path too long") typedef struct { @@ -149,23 +144,6 @@ static const wchar_t delimiter[2] = {DELIM, '\0'}; static const wchar_t separator[2] = {SEP, '\0'}; -/* Get file status. Encode the path to the locale encoding. */ -static int -_Py_wstat(const wchar_t* path, struct stat *buf) -{ - int err; - char *fname; - fname = _Py_EncodeLocaleRaw(path, NULL); - if (fname == NULL) { - errno = EINVAL; - return -1; - } - err = stat(fname, buf); - PyMem_RawFree(fname); - return err; -} - - static void reduce(wchar_t *dir) { @@ -235,28 +213,18 @@ isdir(const wchar_t *filename) static PyStatus joinpath(wchar_t *path, const wchar_t *path2, size_t path_len) { - size_t n; - if (!_Py_isabs(path2)) { - n = wcslen(path); - if (n >= path_len) { + if (_Py_isabs(path2)) { + if (wcslen(path2) >= path_len) { return PATHLEN_ERR(); } - - if (n > 0 && path[n-1] != SEP) { - path[n++] = SEP; - } + wcscpy(path, path2); } else { - n = 0; - } - - size_t k = wcslen(path2); - if (n + k >= path_len) { - return PATHLEN_ERR(); + if (_Py_add_relfile(path, path2, path_len) < 0) { + return PATHLEN_ERR(); + } + return _PyStatus_OK(); } - wcsncpy(path + n, path2, k); - path[n + k] = '\0'; - return _PyStatus_OK(); } @@ -283,23 +251,7 @@ joinpath2(const wchar_t *path, const wchar_t *path2) if (_Py_isabs(path2)) { return _PyMem_RawWcsdup(path2); } - - size_t len = wcslen(path); - int add_sep = (len > 0 && path[len - 1] != SEP); - len += add_sep; - len += wcslen(path2); - - wchar_t *new_path = PyMem_RawMalloc((len + 1) * sizeof(wchar_t)); - if (new_path == NULL) { - return NULL; - } - - wcscpy(new_path, path); - if (add_sep) { - wcscat(new_path, separator); - } - wcscat(new_path, path2); - return new_path; + return _Py_join_relfile(path, path2); } diff --git a/PC/getpathp.c b/PC/getpathp.c index 603a1eb13c4ff0..38009465ae649c 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -82,6 +82,7 @@ #include "Python.h" #include "pycore_initconfig.h" // PyStatus #include "pycore_pathconfig.h" // _PyPathConfig +#include "pycore_fileutils.h" // _Py_add_relfile() #include "osdefs.h" // SEP, ALTSEP #include @@ -115,10 +116,6 @@ * with a semicolon separated path prior to calling Py_Initialize. */ -#ifndef LANDMARK -# define LANDMARK L"lib\\os.py" -#endif - #define INIT_ERR_BUFFER_OVERFLOW() _PyStatus_ERR("buffer overflow") @@ -216,7 +213,7 @@ exists(const wchar_t *filename) Assumes 'filename' MAXPATHLEN+1 bytes long - may extend 'filename' by one character. */ static int -ismodule(wchar_t *filename, int update_filename) +ismodule(wchar_t *filename) { size_t n; @@ -231,9 +228,8 @@ ismodule(wchar_t *filename, int update_filename) filename[n] = L'c'; filename[n + 1] = L'\0'; exist = exists(filename); - if (!update_filename) { - filename[n] = L'\0'; - } + // Drop the 'c' we just added. + filename[n] = L'\0'; return exist; } return 0; @@ -253,7 +249,7 @@ ismodule(wchar_t *filename, int update_filename) static void join(wchar_t *buffer, const wchar_t *stuff) { - if (FAILED(PathCchCombineEx(buffer, MAXPATHLEN+1, buffer, stuff, 0))) { + if (_Py_add_relfile(buffer, stuff, MAXPATHLEN+1) < 0) { Py_FatalError("buffer overflow in getpathp.c's join()"); } } @@ -273,30 +269,37 @@ canonicalize(wchar_t *buffer, const wchar_t *path) return _PyStatus_OK(); } - -/* gotlandmark only called by search_for_prefix, which ensures - 'prefix' is null terminated in bounds. join() ensures - 'landmark' can not overflow prefix if too long. */ static int -gotlandmark(const wchar_t *prefix, const wchar_t *landmark) +is_stdlibdir(wchar_t *stdlibdir) { - wchar_t filename[MAXPATHLEN+1]; - memset(filename, 0, sizeof(filename)); - wcscpy_s(filename, Py_ARRAY_LENGTH(filename), prefix); - join(filename, landmark); - return ismodule(filename, FALSE); + wchar_t *filename = stdlibdir; +#ifndef LANDMARK +# define LANDMARK L"os.py" +#endif + /* join() ensures 'landmark' can not overflow prefix if too long. */ + join(filename, LANDMARK); + return ismodule(filename); } - /* assumes argv0_path is MAXPATHLEN+1 bytes long, already \0 term'd. assumption provided by only caller, calculate_path() */ static int -search_for_prefix(wchar_t *prefix, const wchar_t *argv0_path, const wchar_t *landmark) +search_for_prefix(wchar_t *prefix, const wchar_t *argv0_path) { - /* Search from argv0_path, until landmark is found */ - wcscpy_s(prefix, MAXPATHLEN + 1, argv0_path); + /* Search from argv0_path, until LANDMARK is found. + We guarantee 'prefix' is null terminated in bounds. */ + wcscpy_s(prefix, MAXPATHLEN+1, argv0_path); + wchar_t stdlibdir[MAXPATHLEN+1]; + wcscpy_s(stdlibdir, Py_ARRAY_LENGTH(stdlibdir), prefix); + /* We initialize with the longest possible path, in case it doesn't fit. + This also gives us an initial SEP at stdlibdir[wcslen(prefix)]. */ + join(stdlibdir, L"lib"); do { - if (gotlandmark(prefix, landmark)) { + assert(stdlibdir[wcslen(prefix)] == SEP); + /* Due to reduce() and our initial value, this result + is guaranteed to fit. */ + wcscpy(&stdlibdir[wcslen(prefix) + 1], L"lib"); + if (is_stdlibdir(stdlibdir)) { return 1; } reduce(prefix); @@ -758,7 +761,7 @@ calculate_home_prefix(PyCalculatePath *calculate, reduce(prefix); calculate->home = prefix; } - else if (search_for_prefix(prefix, argv0_path, LANDMARK)) { + else if (search_for_prefix(prefix, argv0_path)) { calculate->home = prefix; } else { @@ -936,7 +939,7 @@ calculate_module_search_path(PyCalculatePath *calculate, lookBuf[nchars] = L'\0'; /* Up one level to the parent */ reduce(lookBuf); - if (search_for_prefix(prefix, lookBuf, LANDMARK)) { + if (search_for_prefix(prefix, lookBuf)) { break; } /* If we are out of paths to search - give up */ diff --git a/Python/fileutils.c b/Python/fileutils.c index 9e732ddca55cec..2492d0567d84aa 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -7,6 +7,7 @@ #ifdef MS_WINDOWS # include # include +# include // PathCchCombineEx extern int winerror_to_errno(int); #endif @@ -1205,6 +1206,31 @@ _Py_fstat(int fd, struct _Py_stat_struct *status) return 0; } +/* Like _Py_stat() but with a raw filename. */ +int +_Py_wstat(const wchar_t* path, struct stat *buf) +{ + int err; +#ifdef MS_WINDOWS + struct _stat wstatbuf; + err = _wstat(path, &wstatbuf); + if (!err) { + buf->st_mode = wstatbuf.st_mode; + } +#else + char *fname; + fname = _Py_EncodeLocaleRaw(path, NULL); + if (fname == NULL) { + errno = EINVAL; + return -1; + } + err = stat(fname, buf); + PyMem_RawFree(fname); +#endif + return err; +} + + /* Call _wstat() on Windows, or encode the path to the filesystem encoding and call stat() otherwise. Only fill st_mode attribute on Windows. @@ -1216,7 +1242,6 @@ _Py_stat(PyObject *path, struct stat *statbuf) { #ifdef MS_WINDOWS int err; - struct _stat wstatbuf; #if USE_UNICODE_WCHAR_CACHE const wchar_t *wpath = _PyUnicode_AsUnicode(path); @@ -1226,9 +1251,7 @@ _Py_stat(PyObject *path, struct stat *statbuf) if (wpath == NULL) return -2; - err = _wstat(wpath, &wstatbuf); - if (!err) - statbuf->st_mode = wstatbuf.st_mode; + err = _Py_wstat(wpath, statbuf); #if !USE_UNICODE_WCHAR_CACHE PyMem_Free(wpath); #endif /* USE_UNICODE_WCHAR_CACHE */ @@ -2072,6 +2095,77 @@ _Py_abspath(const wchar_t *path, wchar_t **abspath_p) } +// The caller must ensure "buffer" is big enough. +static int +join_relfile(wchar_t *buffer, size_t bufsize, + const wchar_t *dirname, const wchar_t *relfile) +{ +#ifdef MS_WINDOWS + if (FAILED(PathCchCombineEx(buffer, bufsize, dirname, relfile, 0))) { + return -1; + } +#else + assert(!_Py_isabs(relfile)); + size_t dirlen = wcslen(dirname); + size_t rellen = wcslen(relfile); + size_t maxlen = bufsize - 1; + if (maxlen > MAXPATHLEN || dirlen >= maxlen || rellen >= maxlen - dirlen) { + return -1; + } + if (dirlen == 0) { + // We do not add a leading separator. + wcscpy(buffer, relfile); + } + else { + if (dirname != buffer) { + wcscpy(buffer, dirname); + } + size_t relstart = dirlen; + if (dirlen > 1 && dirname[dirlen - 1] != SEP) { + buffer[dirlen] = SEP; + relstart += 1; + } + wcscpy(&buffer[relstart], relfile); + } +#endif + return 0; +} + +/* Join the two paths together, like os.path.join(). Return NULL + if memory could not be allocated. The caller is responsible + for calling PyMem_RawFree() on the result. */ +wchar_t * +_Py_join_relfile(const wchar_t *dirname, const wchar_t *relfile) +{ + assert(dirname != NULL && relfile != NULL); + assert(!_Py_isabs(relfile)); + size_t maxlen = wcslen(dirname) + 1 + wcslen(relfile); + size_t bufsize = maxlen + 1; + wchar_t *filename = PyMem_RawMalloc(bufsize * sizeof(wchar_t)); + if (filename == NULL) { + return NULL; + } + assert(wcslen(dirname) < MAXPATHLEN); + assert(wcslen(relfile) < MAXPATHLEN - wcslen(dirname)); + join_relfile(filename, bufsize, dirname, relfile); + return filename; +} + +/* Join the two paths together, like os.path.join(). + dirname: the target buffer with the dirname already in place, + including trailing NUL + relfile: this must be a relative path + bufsize: total allocated size of the buffer + Return -1 if anything is wrong with the path lengths. */ +int +_Py_add_relfile(wchar_t *dirname, const wchar_t *relfile, size_t bufsize) +{ + assert(dirname != NULL && relfile != NULL); + assert(bufsize > 0); + return join_relfile(dirname, bufsize, dirname, relfile); +} + + /* Get the current directory. buflen is the buffer size in wide characters including the null character. Decode the path from the locale encoding. diff --git a/Python/initconfig.c b/Python/initconfig.c index 8740cc1cf7a2b3..40a5846f43b735 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -587,11 +587,6 @@ Py_GetArgcArgv(int *argc, wchar_t ***argv) /* --- PyConfig ---------------------------------------------- */ -#define DECODE_LOCALE_ERR(NAME, LEN) \ - (((LEN) == -2) \ - ? _PyStatus_ERR("cannot decode " NAME) \ - : _PyStatus_NO_MEMORY()) - #define MAX_HASH_SEED 4294967295UL diff --git a/Python/preconfig.c b/Python/preconfig.c index ae1cc3f90fca7f..d59273159a6711 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -1,4 +1,5 @@ #include "Python.h" +#include "pycore_fileutils.h" // DECODE_LOCALE_ERR #include "pycore_getopt.h" // _PyOS_GetOpt() #include "pycore_initconfig.h" // _PyArgv #include "pycore_pymem.h" // _PyMem_GetAllocatorName() @@ -6,12 +7,6 @@ #include // setlocale() -#define DECODE_LOCALE_ERR(NAME, LEN) \ - (((LEN) == -2) \ - ? _PyStatus_ERR("cannot decode " NAME) \ - : _PyStatus_NO_MEMORY()) - - /* Forward declarations */ static void preconfig_copy(PyPreConfig *config, const PyPreConfig *config2); @@ -87,8 +82,7 @@ _PyArgv_AsWstrList(const _PyArgv *args, PyWideStringList *list) wchar_t *arg = Py_DecodeLocale(args->bytes_argv[i], &len); if (arg == NULL) { _PyWideStringList_Clear(&wargv); - return DECODE_LOCALE_ERR("command line arguments", - (Py_ssize_t)len); + return DECODE_LOCALE_ERR("command line arguments", len); } wargv.items[i] = arg; wargv.length++; From 16b5bc68964c6126845f4cdd54b24996e71ae0ba Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Mon, 27 Sep 2021 10:52:19 -0600 Subject: [PATCH 006/263] Do not check isabs() on Windows. (gh-28584) I missed this in gh-28550. https://bugs.python.org/issue45211 --- Python/fileutils.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Python/fileutils.c b/Python/fileutils.c index 2492d0567d84aa..ecfdc5758eb84f 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -2138,7 +2138,9 @@ wchar_t * _Py_join_relfile(const wchar_t *dirname, const wchar_t *relfile) { assert(dirname != NULL && relfile != NULL); +#ifndef MS_WINDOWS assert(!_Py_isabs(relfile)); +#endif size_t maxlen = wcslen(dirname) + 1 + wcslen(relfile); size_t bufsize = maxlen + 1; wchar_t *filename = PyMem_RawMalloc(bufsize * sizeof(wchar_t)); From adc5d32f474595aa16a90369393440a0bc190777 Mon Sep 17 00:00:00 2001 From: Niyas Sait Date: Mon, 27 Sep 2021 20:52:54 +0100 Subject: [PATCH 007/263] Select correct tool platform when building on Windows ARM64 natively (GH-28491) --- PCbuild/pcbuild.proj | 7 ++++--- Tools/scripts/freeze_modules.py | 6 +++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/PCbuild/pcbuild.proj b/PCbuild/pcbuild.proj index b3cbd471c66ac9..f32422a0acf44a 100644 --- a/PCbuild/pcbuild.proj +++ b/PCbuild/pcbuild.proj @@ -1,5 +1,8 @@  + + + {CC9B93A2-439D-4058-9D29-6DCF43774405} Win32 @@ -15,9 +18,7 @@ - $(Platform) - Win32 - x64 + $(PreferredToolArchitecture) $(Configuration) Release diff --git a/Tools/scripts/freeze_modules.py b/Tools/scripts/freeze_modules.py index aa799d763a55b9..cfc6f7921c974c 100644 --- a/Tools/scripts/freeze_modules.py +++ b/Tools/scripts/freeze_modules.py @@ -8,6 +8,7 @@ import os import ntpath import posixpath +import platform import subprocess import sys import textwrap @@ -35,7 +36,10 @@ sys.exit("ERROR: missing _freeze_module") else: def find_tool(): - for arch in ['amd64', 'win32']: + archs = ['amd64', 'win32'] + if platform.machine() == "ARM64": + archs.append('arm64') + for arch in archs: for exe in ['_freeze_module.exe', '_freeze_module_d.exe']: tool = os.path.join(ROOT_DIR, 'PCbuild', arch, exe) if os.path.isfile(tool): From 20f439b6b9e1032930a31b88694ab9f37a09e6b4 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Mon, 27 Sep 2021 21:59:06 +0100 Subject: [PATCH 008/263] bpo-45249: Ensure the traceback module prints correctly syntax errors with ranges (GH-28575) --- Lib/test/test_traceback.py | 13 +++++++++++++ Lib/traceback.py | 27 +++++++++++++++++++++------ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 363165d06ef834..83d36e12c02d14 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -43,6 +43,9 @@ def syntax_error_with_caret(self): def syntax_error_with_caret_2(self): compile("1 +\n", "?", "exec") + def syntax_error_with_caret_range(self): + compile("f(x, y for y in range(30), z)", "?", "exec") + def syntax_error_bad_indentation(self): compile("def spam():\n print(1)\n print(2)", "?", "exec") @@ -59,18 +62,28 @@ def test_caret(self): self.assertTrue(err[1].strip() == "return x!") self.assertIn("^", err[2]) # third line has caret self.assertEqual(err[1].find("!"), err[2].find("^")) # in the right place + self.assertEqual(err[2].count("^"), 1) err = self.get_exception_format(self.syntax_error_with_caret_2, SyntaxError) self.assertIn("^", err[2]) # third line has caret self.assertEqual(err[2].count('\n'), 1) # and no additional newline self.assertEqual(err[1].find("+") + 1, err[2].find("^")) # in the right place + self.assertEqual(err[2].count("^"), 1) err = self.get_exception_format(self.syntax_error_with_caret_non_ascii, SyntaxError) self.assertIn("^", err[2]) # third line has caret self.assertEqual(err[2].count('\n'), 1) # and no additional newline self.assertEqual(err[1].find("+") + 1, err[2].find("^")) # in the right place + self.assertEqual(err[2].count("^"), 1) + + err = self.get_exception_format(self.syntax_error_with_caret_range, + SyntaxError) + self.assertIn("^", err[2]) # third line has caret + self.assertEqual(err[2].count('\n'), 1) # and no additional newline + self.assertEqual(err[1].find("y"), err[2].find("^")) # in the right place + self.assertEqual(err[2].count("^"), len("y for y in range(30)")) def test_nocaret(self): exc = SyntaxError("error", ("x.py", 23, None, "bad syntax")) diff --git a/Lib/traceback.py b/Lib/traceback.py index 1b537dc5a91142..3cb8e5700de448 100644 --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -622,10 +622,14 @@ class TracebackException: occurred. - :attr:`lineno` For syntax errors - the linenumber where the error occurred. + - :attr:`end_lineno` For syntax errors - the end linenumber where the error + occurred. Can be `None` if not present. - :attr:`text` For syntax errors - the text where the error occurred. - :attr:`offset` For syntax errors - the offset into the text where the error occurred. + - :attr:`end_offset` For syntax errors - the offset into the text where the + error occurred. Can be `None` if not present. - :attr:`msg` For syntax errors - the compiler error message. """ @@ -655,8 +659,11 @@ def __init__(self, exc_type, exc_value, exc_traceback, *, limit=None, self.filename = exc_value.filename lno = exc_value.lineno self.lineno = str(lno) if lno is not None else None + end_lno = exc_value.end_lineno + self.end_lineno = str(end_lno) if end_lno is not None else None self.text = exc_value.text self.offset = exc_value.offset + self.end_offset = exc_value.end_offset self.msg = exc_value.msg if lookup_lines: self._load_lines() @@ -771,12 +778,20 @@ def _format_syntax_error(self, stype): ltext = rtext.lstrip(' \n\f') spaces = len(rtext) - len(ltext) yield ' {}\n'.format(ltext) - # Convert 1-based column offset to 0-based index into stripped text - caret = (self.offset or 0) - 1 - spaces - if caret >= 0: - # non-space whitespace (likes tabs) must be kept for alignment - caretspace = ((c if c.isspace() else ' ') for c in ltext[:caret]) - yield ' {}^\n'.format(''.join(caretspace)) + + if self.offset is not None: + offset = self.offset + end_offset = self.end_offset if self.end_offset is not None else offset + if offset == end_offset or end_offset == -1: + end_offset = offset + 1 + + # Convert 1-based column offset to 0-based index into stripped text + colno = offset - 1 - spaces + end_colno = end_offset - 1 - spaces + if colno >= 0: + # non-space whitespace (likes tabs) must be kept for alignment + caretspace = ((c if c.isspace() else ' ') for c in ltext[:colno]) + yield ' {}{}'.format("".join(caretspace), ('^' * (end_colno - colno) + "\n")) msg = self.msg or "" yield "{}: {}{}\n".format(stype, msg, filename_suffix) From 95d31370829b7d729667588e0a9943217401ea5b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 27 Sep 2021 23:09:00 +0200 Subject: [PATCH 009/263] bpo-1596321: Fix threading._shutdown() for the main thread (GH-28549) Fix the threading._shutdown() function when the threading module was imported first from a thread different than the main thread: no longer log an error at Python exit. --- Lib/test/test_threading.py | 33 +++++++++++++++++++ Lib/threading.py | 25 +++++++++----- ...2021-09-24-17-20-23.bpo-1596321.3nhPUk.rst | 3 ++ 3 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-09-24-17-20-23.bpo-1596321.3nhPUk.rst diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index f5ba16ea08ecec..a8f3c139b24be1 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -928,6 +928,39 @@ def test_debug_deprecation(self): b'is deprecated and will be removed in Python 3.12') self.assertIn(msg, err) + def test_import_from_another_thread(self): + # bpo-1596321: If the threading module is first import from a thread + # different than the main thread, threading._shutdown() must handle + # this case without logging an error at Python exit. + code = textwrap.dedent(''' + import _thread + import sys + + event = _thread.allocate_lock() + event.acquire() + + def import_threading(): + import threading + event.release() + + if 'threading' in sys.modules: + raise Exception('threading is already imported') + + _thread.start_new_thread(import_threading, ()) + + # wait until the threading module is imported + event.acquire() + event.release() + + if 'threading' not in sys.modules: + raise Exception('threading is not imported') + + # don't wait until the thread completes + ''') + rc, out, err = assert_python_ok("-c", code) + self.assertEqual(out, b'') + self.assertEqual(err, b'') + class ThreadJoinOnShutdown(BaseTestCase): diff --git a/Lib/threading.py b/Lib/threading.py index 1c74a8d81e3539..9b0419c296fcd8 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -1517,20 +1517,29 @@ def _shutdown(): global _SHUTTING_DOWN _SHUTTING_DOWN = True - # Main thread - tlock = _main_thread._tstate_lock - # The main thread isn't finished yet, so its thread state lock can't have - # been released. - assert tlock is not None - assert tlock.locked() - tlock.release() - _main_thread._stop() # Call registered threading atexit functions before threads are joined. # Order is reversed, similar to atexit. for atexit_call in reversed(_threading_atexits): atexit_call() + # Main thread + if _main_thread.ident == get_ident(): + tlock = _main_thread._tstate_lock + # The main thread isn't finished yet, so its thread state lock can't + # have been released. + assert tlock is not None + assert tlock.locked() + tlock.release() + _main_thread._stop() + else: + # bpo-1596321: _shutdown() must be called in the main thread. + # If the threading module was not imported by the main thread, + # _main_thread is the thread which imported the threading module. + # In this case, ignore _main_thread, similar behavior than for threads + # spawned by C libraries or using _thread.start_new_thread(). + pass + # Join all non-deamon threads while True: with _shutdown_locks_lock: diff --git a/Misc/NEWS.d/next/Library/2021-09-24-17-20-23.bpo-1596321.3nhPUk.rst b/Misc/NEWS.d/next/Library/2021-09-24-17-20-23.bpo-1596321.3nhPUk.rst new file mode 100644 index 00000000000000..61a3e5abf395e1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-09-24-17-20-23.bpo-1596321.3nhPUk.rst @@ -0,0 +1,3 @@ +Fix the :func:`threading._shutdown` function when the :mod:`threading` module +was imported first from a thread different than the main thread: no longer log +an error at Python exit. From 953e733e6d0bc02fde0e4f808259218a95a3b902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Heissler?= Date: Tue, 28 Sep 2021 12:25:15 +0200 Subject: [PATCH 010/263] Fix typo in whatsnew: "ns" is 10^-9 secs and "us" is 10^-6 secs. (GH-28565) --- Doc/whatsnew/3.11.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 818208edbf2631..7121bbe35310d6 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -243,8 +243,8 @@ time ---- * On Unix, :func:`time.sleep` now uses the ``clock_nanosleep()`` or - ``nanosleep()`` function, if available, which has a resolution of 1 ns (10^-6 - sec), rather than using ``select()`` which has a resolution of 1 us (10^-9 + ``nanosleep()`` function, if available, which has a resolution of 1 ns (10^-9 + sec), rather than using ``select()`` which has a resolution of 1 us (10^-6 sec). (Contributed by Livius and Victor Stinner in :issue:`21302`.) From 8b7427b5541c6541e71136d184d7710fafac4ede Mon Sep 17 00:00:00 2001 From: Rajendra arora Date: Tue, 28 Sep 2021 16:26:41 +0530 Subject: [PATCH 011/263] Fixed typo in "decclarations" (GH-28578) --- Parser/asdl_c.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 5f0b89bba44890..37925a5783d6d0 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -145,7 +145,7 @@ def __init__(self, *args, **kwargs): # names where all the constructors # belonging to that type lack of any # fields. - # - identifiers: All identifiers used in the AST decclarations + # - identifiers: All identifiers used in the AST declarations # - singletons: List of all constructors that originates from # simple sums. # - types: List of all top level type names From db0133f98dd42d0fb82a7675bde175cec51bb860 Mon Sep 17 00:00:00 2001 From: Louis Sautier Date: Tue, 28 Sep 2021 13:00:51 +0200 Subject: [PATCH 012/263] [doc] fix minor typo for argparse (GH-28451) "A JSONDecodeError" instead of "An JSONDecodeError". --- Doc/library/argparse.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index ac8a2fd6195f40..2edf84e5f0444c 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1109,7 +1109,7 @@ Anything with more interesting error-handling or resource management should be done downstream after the arguments are parsed. For example, JSON or YAML conversions have complex error cases that require -better reporting than can be given by the ``type`` keyword. An +better reporting than can be given by the ``type`` keyword. A :exc:`~json.JSONDecodeError` would not be well formatted and a :exc:`FileNotFound` exception would not be handled at all. From a47d67cf46626d8dbd66a81ee7b5f1568afc0521 Mon Sep 17 00:00:00 2001 From: Rajendra arora Date: Tue, 28 Sep 2021 17:21:39 +0530 Subject: [PATCH 013/263] Optimized code format (GH-28599) Automerge-Triggered-By: GH:pablogsal --- Parser/string_parser.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Parser/string_parser.c b/Parser/string_parser.c index fb37d37553a552..2880d07e5f6fe3 100644 --- a/Parser/string_parser.c +++ b/Parser/string_parser.c @@ -1127,9 +1127,7 @@ _PyPegen_FstringParser_ConcatFstring(Parser *p, FstringParser *state, const char /* We know we have an expression. Convert any existing string to a Constant node. */ - if (!state->last_str) { - /* Do nothing. No previous literal. */ - } else { + if (state->last_str) { /* Convert the existing last_str literal to a Constant node. */ expr_ty last_str = make_str_node_and_del(p, &state->last_str, first_token, last_token); if (!last_str || ExprList_Append(&state->expr_list, last_str) < 0) { From e649e0658ff2af87b07d994c05ae048e16e31aae Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Tue, 28 Sep 2021 08:05:56 -0400 Subject: [PATCH 014/263] bpo-45296: Fix exit/quit message on Windows (GH-28577) IDLE recognizes Ctrl-D, as on other systems, instead of Ctrl-Z. --- Lib/idlelib/pyshell.py | 7 +++++++ Lib/idlelib/run.py | 7 +++++++ .../next/IDLE/2021-09-27-01-21-59.bpo-45296.9H8rdY.rst | 2 ++ 3 files changed, 16 insertions(+) create mode 100644 Misc/NEWS.d/next/IDLE/2021-09-27-01-21-59.bpo-45296.9H8rdY.rst diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 4e7440038ac997..6c333b0bc3b818 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -66,6 +66,13 @@ HOST = '127.0.0.1' # python execution server on localhost loopback PORT = 0 # someday pass in host, port for remote debug capability +try: # In case IDLE started with -n. + eof = 'Ctrl-D (end-of-file)' + exit.eof = eof + quit.eof = eof +except NameError: # In case python started with -S. + pass + # Override warnings module to write to warning_stream. Initialize to send IDLE # internal warnings to the console. ScriptBinding.check_syntax() will # temporarily redirect the stream to the shell window to display warnings when diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 3836727691229e..47c4cbdcb8c3f9 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -40,6 +40,13 @@ LOCALHOST = '127.0.0.1' +try: + eof = 'Ctrl-D (end-of-file)' + exit.eof = eof + quit.eof = eof +except NameError: # In case subprocess started with -S (maybe in future). + pass + def idle_formatwarning(message, category, filename, lineno, line=None): """Format warnings the IDLE way.""" diff --git a/Misc/NEWS.d/next/IDLE/2021-09-27-01-21-59.bpo-45296.9H8rdY.rst b/Misc/NEWS.d/next/IDLE/2021-09-27-01-21-59.bpo-45296.9H8rdY.rst new file mode 100644 index 00000000000000..52bade1e5327b9 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2021-09-27-01-21-59.bpo-45296.9H8rdY.rst @@ -0,0 +1,2 @@ +On Windows, change exit/quit message to suggest Ctrl-D, which works, instead +of , which does not work in IDLE. From 84975146a7ce64f1d50dcec8311b7f7188a5c962 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Tue, 28 Sep 2021 13:32:43 +0100 Subject: [PATCH 015/263] bpo-35606: Fix math.prod tests using 'start' as keyword parameter (GH-28595) --- Lib/test/test_math.py | 18 ++++++++++++------ Modules/mathmodule.c | 11 +++-------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 6d67d6293b2e7d..a9f1b1e11bcb39 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1803,16 +1803,22 @@ def test_prod(self): self.assertRaises(TypeError, prod) self.assertRaises(TypeError, prod, 42) self.assertRaises(TypeError, prod, ['a', 'b', 'c']) - self.assertRaises(TypeError, prod, ['a', 'b', 'c'], '') - self.assertRaises(TypeError, prod, [b'a', b'c'], b'') + self.assertRaises(TypeError, prod, ['a', 'b', 'c'], start='') + self.assertRaises(TypeError, prod, [b'a', b'c'], start=b'') values = [bytearray(b'a'), bytearray(b'b')] - self.assertRaises(TypeError, prod, values, bytearray(b'')) + self.assertRaises(TypeError, prod, values, start=bytearray(b'')) self.assertRaises(TypeError, prod, [[1], [2], [3]]) self.assertRaises(TypeError, prod, [{2:3}]) - self.assertRaises(TypeError, prod, [{2:3}]*2, {2:3}) - self.assertRaises(TypeError, prod, [[1], [2], [3]], []) + self.assertRaises(TypeError, prod, [{2:3}]*2, start={2:3}) + self.assertRaises(TypeError, prod, [[1], [2], [3]], start=[]) + + # Some odd cases + self.assertEqual(prod([2, 3], start='ab'), 'abababababab') + self.assertEqual(prod([2, 3], start=[1, 2]), [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]) + self.assertEqual(prod([], start={2: 3}), {2:3}) + with self.assertRaises(TypeError): - prod([10, 20], [30, 40]) # start is a keyword-only argument + prod([10, 20], 1) # start is a keyword-only argument self.assertEqual(prod([0, 1, 2, 3]), 0) self.assertEqual(prod([1, 0, 2, 3]), 0) diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index bd97b03205b7ca..5e9f63f6c6e025 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3082,14 +3082,9 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start) } if (result == NULL) { - result = PyLong_FromLong(1); - if (result == NULL) { - Py_DECREF(iter); - return NULL; - } - } else { - Py_INCREF(result); + result = _PyLong_GetOne(); } + Py_INCREF(result); #ifndef SLOW_PROD /* Fast paths for integers keeping temporary products in C. * Assumes all inputs are the same type. @@ -3105,7 +3100,7 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start) } /* Loop over all the items in the iterable until we finish, we overflow * or we found a non integer element */ - while(result == NULL) { + while (result == NULL) { item = PyIter_Next(iter); if (item == NULL) { Py_DECREF(iter); From 0c50b8c0b8274d54d6b71ed7bd21057d3642f138 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 28 Sep 2021 12:18:28 -0600 Subject: [PATCH 016/263] bpo-45211: Remember the stdlib dir during startup. (gh-28586) During runtime startup we figure out the stdlib dir but currently throw that information away. This change preserves it and exposes it via PyConfig.stdlib_dir, _Py_GetStdlibDir(), and sys._stdlib_dir. https://bugs.python.org/issue45211 --- Include/cpython/initconfig.h | 1 + Include/internal/pycore_pathconfig.h | 1 + Include/internal/pycore_pylifecycle.h | 1 + Lib/test/test_embed.py | 17 +++++++++++++++ Lib/test/test_sys.py | 10 +++++++++ Modules/getpath.c | 10 +++++++++ PC/getpathp.c | 12 +++++++++-- Python/initconfig.c | 5 +++++ Python/pathconfig.c | 31 ++++++++++++++++++++++++++- Python/sysmodule.c | 8 +++++++ 10 files changed, 93 insertions(+), 3 deletions(-) diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index 65d52c45783f18..05641001bcd749 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -184,6 +184,7 @@ typedef struct PyConfig { /* --- Path configuration outputs ----------- */ int module_search_paths_set; PyWideStringList module_search_paths; + wchar_t *stdlib_dir; wchar_t *executable; wchar_t *base_executable; wchar_t *prefix; diff --git a/Include/internal/pycore_pathconfig.h b/Include/internal/pycore_pathconfig.h index 15447f54490fb4..a258aab2397660 100644 --- a/Include/internal/pycore_pathconfig.h +++ b/Include/internal/pycore_pathconfig.h @@ -13,6 +13,7 @@ typedef struct _PyPathConfig { wchar_t *program_full_path; wchar_t *prefix; wchar_t *exec_prefix; + wchar_t *stdlib_dir; /* Set by Py_SetPath(), or computed by _PyConfig_InitPathConfig() */ wchar_t *module_search_path; /* Python program name */ diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 524be9d4cbb940..4f12fef8d65466 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -122,6 +122,7 @@ PyAPI_FUNC(PyStatus) _Py_PreInitializeFromConfig( const PyConfig *config, const struct _PyArgv *args); +PyAPI_FUNC(wchar_t *) _Py_GetStdlibDir(void); PyAPI_FUNC(int) _Py_HandleSystemExit(int *exitcode_p); diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index cda814c3ed34ee..aa2b3d7efbf996 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -406,6 +406,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'module_search_paths': GET_DEFAULT_CONFIG, 'module_search_paths_set': 1, 'platlibdir': sys.platlibdir, + 'stdlib_dir': GET_DEFAULT_CONFIG, 'site_import': 1, 'bytes_warning': 0, @@ -515,6 +516,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'exec_prefix', 'program_name', 'home', + 'stdlib_dir', # program_full_path and module_search_path are copied indirectly from # the core configuration in check_path_config(). ] @@ -1142,6 +1144,9 @@ def test_init_setpath(self): 'base_prefix': '', 'exec_prefix': '', 'base_exec_prefix': '', + # The current getpath.c doesn't determine the stdlib dir + # in this case. + 'stdlib_dir': '', } self.default_program_name(config) env = {'TESTPATH': os.path.pathsep.join(paths)} @@ -1162,6 +1167,9 @@ def test_init_setpath_config(self): 'base_prefix': '', 'exec_prefix': '', 'base_exec_prefix': '', + # The current getpath.c doesn't determine the stdlib dir + # in this case. + 'stdlib_dir': '', # overriden by PyConfig 'program_name': 'conf_program_name', 'base_executable': 'conf_executable', @@ -1251,6 +1259,7 @@ def test_init_setpythonhome(self): 'exec_prefix': exec_prefix, 'base_exec_prefix': exec_prefix, 'pythonpath_env': paths_str, + 'stdlib_dir': home, } self.default_program_name(config) env = {'TESTHOME': home, 'PYTHONPATH': paths_str} @@ -1288,6 +1297,9 @@ def test_init_pybuilddir(self): 'base_executable': executable, 'executable': executable, 'module_search_paths': module_search_paths, + # The current getpath.c doesn't determine the stdlib dir + # in this case. + 'stdlib_dir': None, } env = self.copy_paths_by_env(config) self.check_all_configs("test_init_compat_config", config, @@ -1345,6 +1357,7 @@ def test_init_pyvenv_cfg(self): if MS_WINDOWS: config['base_prefix'] = pyvenv_home config['prefix'] = pyvenv_home + config['stdlib_dir'] = os.path.join(pyvenv_home, 'lib') ver = sys.version_info dll = f'python{ver.major}' @@ -1353,6 +1366,10 @@ def test_init_pyvenv_cfg(self): dll += '.DLL' dll = os.path.join(os.path.dirname(executable), dll) path_config['python3_dll'] = dll + else: + # The current getpath.c doesn't determine the stdlib dir + # in this case. + config['stdlib_dir'] = None env = self.copy_paths_by_env(config) self.check_all_configs("test_init_compat_config", config, diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index e98803b48f6ac0..3b80904b28d3e2 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -13,6 +13,7 @@ from test.support import os_helper from test.support.script_helper import assert_python_ok, assert_python_failure from test.support import threading_helper +from test.support import import_helper import textwrap import unittest import warnings @@ -994,6 +995,15 @@ def test_module_names(self): for name in sys.stdlib_module_names: self.assertIsInstance(name, str) + def test_stdlib_dir(self): + os = import_helper.import_fresh_module('os') + marker = getattr(os, '__file__', None) + if marker and not os.path.exists(marker): + marker = None + expected = os.path.dirname(marker) if marker else None + actual = sys._stdlib_dir + self.assertEqual(actual, expected) + @test.support.cpython_only class UnraisableHookTest(unittest.TestCase): diff --git a/Modules/getpath.c b/Modules/getpath.c index de1c6e3fbb657b..56775e9cb44af0 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -1492,6 +1492,16 @@ calculate_path(PyCalculatePath *calculate, _PyPathConfig *pathconfig) } } + if (pathconfig->stdlib_dir == NULL) { + if (calculate->prefix_found) { + /* This must be done *before* calculate_set_prefix() is called. */ + pathconfig->stdlib_dir = _PyMem_RawWcsdup(calculate->prefix); + if (pathconfig->stdlib_dir == NULL) { + return _PyStatus_NO_MEMORY(); + } + } + } + if (pathconfig->prefix == NULL) { status = calculate_set_prefix(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { diff --git a/PC/getpathp.c b/PC/getpathp.c index 38009465ae649c..16bb4997f819b7 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -116,6 +116,8 @@ * with a semicolon separated path prior to calling Py_Initialize. */ +#define STDLIB_SUBDIR L"lib" + #define INIT_ERR_BUFFER_OVERFLOW() _PyStatus_ERR("buffer overflow") @@ -293,12 +295,12 @@ search_for_prefix(wchar_t *prefix, const wchar_t *argv0_path) wcscpy_s(stdlibdir, Py_ARRAY_LENGTH(stdlibdir), prefix); /* We initialize with the longest possible path, in case it doesn't fit. This also gives us an initial SEP at stdlibdir[wcslen(prefix)]. */ - join(stdlibdir, L"lib"); + join(stdlibdir, STDLIB_SUBDIR); do { assert(stdlibdir[wcslen(prefix)] == SEP); /* Due to reduce() and our initial value, this result is guaranteed to fit. */ - wcscpy(&stdlibdir[wcslen(prefix) + 1], L"lib"); + wcscpy(&stdlibdir[wcslen(prefix) + 1], STDLIB_SUBDIR); if (is_stdlibdir(stdlibdir)) { return 1; } @@ -1013,6 +1015,12 @@ calculate_path(PyCalculatePath *calculate, _PyPathConfig *pathconfig) } done: + if (pathconfig->stdlib_dir == NULL) { + pathconfig->stdlib_dir = _Py_join_relfile(prefix, STDLIB_SUBDIR); + if (pathconfig->stdlib_dir == NULL) { + return _PyStatus_NO_MEMORY(); + } + } if (pathconfig->prefix == NULL) { pathconfig->prefix = _PyMem_RawWcsdup(prefix); if (pathconfig->prefix == NULL) { diff --git a/Python/initconfig.c b/Python/initconfig.c index 40a5846f43b735..9fa202a7da5c02 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -669,6 +669,7 @@ PyConfig_Clear(PyConfig *config) _PyWideStringList_Clear(&config->xoptions); _PyWideStringList_Clear(&config->module_search_paths); config->module_search_paths_set = 0; + CLEAR(config->stdlib_dir); CLEAR(config->executable); CLEAR(config->base_executable); @@ -909,6 +910,7 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2) COPY_WSTRLIST(xoptions); COPY_WSTRLIST(module_search_paths); COPY_ATTR(module_search_paths_set); + COPY_WSTR_ATTR(stdlib_dir); COPY_WSTR_ATTR(executable); COPY_WSTR_ATTR(base_executable); @@ -1015,6 +1017,7 @@ _PyConfig_AsDict(const PyConfig *config) SET_ITEM_WSTR(home); SET_ITEM_INT(module_search_paths_set); SET_ITEM_WSTRLIST(module_search_paths); + SET_ITEM_WSTR(stdlib_dir); SET_ITEM_WSTR(executable); SET_ITEM_WSTR(base_executable); SET_ITEM_WSTR(prefix); @@ -1318,6 +1321,7 @@ _PyConfig_FromDict(PyConfig *config, PyObject *dict) // Path configuration output GET_UINT(module_search_paths_set); GET_WSTRLIST(module_search_paths); + GET_WSTR_OPT(stdlib_dir); GET_WSTR_OPT(executable); GET_WSTR_OPT(base_executable); GET_WSTR_OPT(prefix); @@ -3094,6 +3098,7 @@ _Py_DumpPathConfig(PyThreadState *tstate) PySys_WriteStderr(" environment = %i\n", config->use_environment); PySys_WriteStderr(" user site = %i\n", config->user_site_directory); PySys_WriteStderr(" import site = %i\n", config->site_import); + DUMP_CONFIG("stdlib dir", stdlib_dir); #undef DUMP_CONFIG #define DUMP_SYS(NAME) \ diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 470aba75bea969..d49bd3c854940d 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -54,6 +54,7 @@ pathconfig_clear(_PyPathConfig *config) CLEAR(config->program_full_path); CLEAR(config->prefix); CLEAR(config->exec_prefix); + CLEAR(config->stdlib_dir); CLEAR(config->module_search_path); CLEAR(config->program_name); CLEAR(config->home); @@ -83,6 +84,7 @@ pathconfig_copy(_PyPathConfig *config, const _PyPathConfig *config2) COPY_ATTR(prefix); COPY_ATTR(exec_prefix); COPY_ATTR(module_search_path); + COPY_ATTR(stdlib_dir); COPY_ATTR(program_name); COPY_ATTR(home); #ifdef MS_WINDOWS @@ -167,6 +169,7 @@ pathconfig_set_from_config(_PyPathConfig *pathconfig, const PyConfig *config) COPY_CONFIG(program_full_path, executable); COPY_CONFIG(prefix, prefix); COPY_CONFIG(exec_prefix, exec_prefix); + COPY_CONFIG(stdlib_dir, stdlib_dir); COPY_CONFIG(program_name, program_name); COPY_CONFIG(home, home); #ifdef MS_WINDOWS @@ -218,6 +221,7 @@ _PyPathConfig_AsDict(void) SET_ITEM_STR(prefix); SET_ITEM_STR(exec_prefix); SET_ITEM_STR(module_search_path); + SET_ITEM_STR(stdlib_dir); SET_ITEM_STR(program_name); SET_ITEM_STR(home); #ifdef MS_WINDOWS @@ -311,6 +315,7 @@ config_init_module_search_paths(PyConfig *config, _PyPathConfig *pathconfig) - exec_prefix - module_search_path + - stdlib_dir - prefix - program_full_path @@ -401,6 +406,7 @@ config_init_pathconfig(PyConfig *config, int compute_path_config) COPY_ATTR(program_full_path, executable); COPY_ATTR(prefix, prefix); COPY_ATTR(exec_prefix, exec_prefix); + COPY_ATTR(stdlib_dir, stdlib_dir); #undef COPY_ATTR @@ -486,16 +492,25 @@ Py_SetPath(const wchar_t *path) PyMem_RawFree(_Py_path_config.prefix); PyMem_RawFree(_Py_path_config.exec_prefix); + PyMem_RawFree(_Py_path_config.stdlib_dir); PyMem_RawFree(_Py_path_config.module_search_path); _Py_path_config.prefix = _PyMem_RawWcsdup(L""); _Py_path_config.exec_prefix = _PyMem_RawWcsdup(L""); + // XXX Copy this from the new module_search_path? + if (_Py_path_config.home != NULL) { + _Py_path_config.stdlib_dir = _PyMem_RawWcsdup(_Py_path_config.home); + } + else { + _Py_path_config.stdlib_dir = _PyMem_RawWcsdup(L""); + } _Py_path_config.module_search_path = _PyMem_RawWcsdup(path); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); if (_Py_path_config.prefix == NULL || _Py_path_config.exec_prefix == NULL + || _Py_path_config.stdlib_dir == NULL || _Py_path_config.module_search_path == NULL) { path_out_of_memory(__func__); @@ -515,10 +530,13 @@ Py_SetPythonHome(const wchar_t *home) PyMem_RawFree(_Py_path_config.home); _Py_path_config.home = _PyMem_RawWcsdup(home); + if (_Py_path_config.home != NULL) { + _Py_path_config.stdlib_dir = _PyMem_RawWcsdup(home); + } PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - if (_Py_path_config.home == NULL) { + if (_Py_path_config.home == NULL || _Py_path_config.stdlib_dir == NULL) { path_out_of_memory(__func__); } } @@ -572,6 +590,17 @@ Py_GetPath(void) } +wchar_t * +_Py_GetStdlibDir(void) +{ + wchar_t *stdlib_dir = _Py_path_config.stdlib_dir; + if (stdlib_dir != NULL && stdlib_dir[0] != L'\0') { + return stdlib_dir; + } + return NULL; +} + + wchar_t * Py_GetPrefix(void) { diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 5dfa917e8ffb20..6e7e45bf3fde20 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2974,6 +2974,14 @@ _PySys_UpdateConfig(PyThreadState *tstate) SET_SYS("_xoptions", sys_create_xoptions_dict(config)); + const wchar_t *stdlibdir = _Py_GetStdlibDir(); + if (stdlibdir != NULL) { + SET_SYS_FROM_WSTR("_stdlib_dir", stdlibdir); + } + else { + PyDict_SetItemString(sysdict, "_stdlib_dir", Py_None); + } + #undef SET_SYS_FROM_WSTR #undef COPY_LIST #undef COPY_WSTR From 4f05f15d7b25ef8b690cb94fdc4c8cb5521a4e27 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 28 Sep 2021 23:40:57 +0300 Subject: [PATCH 017/263] [docs] Improve the markup of powers (GH-28598) --- Doc/library/functions.rst | 4 ++-- Doc/library/hashlib.rst | 4 ++-- Doc/library/ipaddress.rst | 6 +++--- Doc/library/plistlib.rst | 2 +- Doc/reference/datamodel.rst | 2 +- Doc/using/cmdline.rst | 2 +- Doc/whatsnew/2.0.rst | 2 +- Doc/whatsnew/2.7.rst | 8 ++++---- Doc/whatsnew/3.1.rst | 8 ++++---- Doc/whatsnew/3.11.rst | 10 +++++----- Misc/NEWS.d/3.5.0a1.rst | 2 +- Misc/NEWS.d/3.6.4rc1.rst | 2 +- Misc/NEWS.d/3.7.0a3.rst | 2 +- Misc/NEWS.d/3.8.0a1.rst | 2 +- Misc/NEWS.d/3.9.0a1.rst | 2 +- .../2021-08-26-18-44-03.bpo-45018.pu8H9L.rst | 2 +- .../Library/2021-08-25-20-18-31.bpo-39218.BlO6jW.rst | 2 +- .../Library/2021-09-20-22-46-40.bpo-21302.h56430.rst | 2 +- 18 files changed, 32 insertions(+), 32 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 19d67e9d754c2c..a651d8829cd29c 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1345,8 +1345,8 @@ are always available. They are listed here in alphabetical order. coercion rules for binary arithmetic operators apply. For :class:`int` operands, the result has the same type as the operands (after coercion) unless the second argument is negative; in that case, all arguments are - converted to float and a float result is delivered. For example, ``10**2`` - returns ``100``, but ``10**-2`` returns ``0.01``. + converted to float and a float result is delivered. For example, ``pow(10, 2)`` + returns ``100``, but ``pow(10, -2)`` returns ``0.01``. For :class:`int` operands *base* and *exp*, if *mod* is present, *mod* must also be of integer type and *mod* must be nonzero. If *mod* is present and diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst index 37addee6cda809..77b35fd1d766c8 100644 --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -376,10 +376,10 @@ Constructor functions also accept the following tree hashing parameters: * *depth*: maximal depth of tree (1 to 255, 255 if unlimited, 1 in sequential mode). -* *leaf_size*: maximal byte length of leaf (0 to 2**32-1, 0 if unlimited or in +* *leaf_size*: maximal byte length of leaf (0 to ``2**32-1``, 0 if unlimited or in sequential mode). -* *node_offset*: node offset (0 to 2**64-1 for BLAKE2b, 0 to 2**48-1 for +* *node_offset*: node offset (0 to ``2**64-1`` for BLAKE2b, 0 to ``2**48-1`` for BLAKE2s, 0 for the first, leftmost, leaf, or in sequential mode). * *node_depth*: node depth (0 to 255, 0 for leaves, or in sequential mode). diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst index 2ab4dd83ad4dee..74d922d29db69c 100644 --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -41,7 +41,7 @@ IP addresses, networks and interfaces: Return an :class:`IPv4Address` or :class:`IPv6Address` object depending on the IP address passed as argument. Either IPv4 or IPv6 addresses may be - supplied; integers less than 2**32 will be considered to be IPv4 by default. + supplied; integers less than ``2**32`` will be considered to be IPv4 by default. A :exc:`ValueError` is raised if *address* does not represent a valid IPv4 or IPv6 address. @@ -56,7 +56,7 @@ IP addresses, networks and interfaces: Return an :class:`IPv4Network` or :class:`IPv6Network` object depending on the IP address passed as argument. *address* is a string or integer representing the IP network. Either IPv4 or IPv6 networks may be supplied; - integers less than 2**32 will be considered to be IPv4 by default. *strict* + integers less than ``2**32`` will be considered to be IPv4 by default. *strict* is passed to :class:`IPv4Network` or :class:`IPv6Network` constructor. A :exc:`ValueError` is raised if *address* does not represent a valid IPv4 or IPv6 address, or if the network has host bits set. @@ -70,7 +70,7 @@ IP addresses, networks and interfaces: Return an :class:`IPv4Interface` or :class:`IPv6Interface` object depending on the IP address passed as argument. *address* is a string or integer representing the IP address. Either IPv4 or IPv6 addresses may be supplied; - integers less than 2**32 will be considered to be IPv4 by default. A + integers less than ``2**32`` will be considered to be IPv4 by default. A :exc:`ValueError` is raised if *address* does not represent a valid IPv4 or IPv6 address. diff --git a/Doc/library/plistlib.rst b/Doc/library/plistlib.rst index ce6d4a85bf5e9d..5ded9661f08014 100644 --- a/Doc/library/plistlib.rst +++ b/Doc/library/plistlib.rst @@ -133,7 +133,7 @@ The following classes are available: encoded data, which contains UID (see PList manual). It has one attribute, :attr:`data`, which can be used to retrieve the int value - of the UID. :attr:`data` must be in the range `0 <= data < 2**64`. + of the UID. :attr:`data` must be in the range ``0 <= data < 2**64``. .. versionadded:: 3.8 diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 181e445bb7bc6e..f1334f047d4b73 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1558,7 +1558,7 @@ Basic customization This is intended to provide protection against a denial-of-service caused by carefully-chosen inputs that exploit the worst case performance of a - dict insertion, O(n^2) complexity. See + dict insertion, O(n\ :sup:`2`) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details. Changing hash values affects the iteration order of sets. diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index a9c0931363bfca..b42518e8731ca8 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -322,7 +322,7 @@ Miscellaneous options Hash randomization is intended to provide protection against a denial-of-service caused by carefully-chosen inputs that exploit the worst - case performance of a dict construction, O(n^2) complexity. See + case performance of a dict construction, O(n\ :sup:`2`) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details. :envvar:`PYTHONHASHSEED` allows you to set a fixed value for the hash diff --git a/Doc/whatsnew/2.0.rst b/Doc/whatsnew/2.0.rst index c0a6692049788b..0e1cf1fd0ce46c 100644 --- a/Doc/whatsnew/2.0.rst +++ b/Doc/whatsnew/2.0.rst @@ -791,7 +791,7 @@ Previously the Python virtual machine used 16-bit numbers in its bytecode, limiting the size of source files. In particular, this affected the maximum size of literal lists and dictionaries in Python source; occasionally people who are generating Python code would run into this limit. A patch by Charles G. -Waldman raises the limit from ``2^16`` to ``2^{32}``. +Waldman raises the limit from ``2**16`` to ``2**32``. Three new convenience functions intended for adding constants to a module's dictionary at module initialization time were added: :func:`PyModule_AddObject`, diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index d19c8e01ad8a00..abb65222ddd3d0 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -953,12 +953,12 @@ Several performance enhancements have been added: considered and traversed by the collector. (Contributed by Antoine Pitrou; :issue:`4688`.) -* Long integers are now stored internally either in base 2**15 or in base - 2**30, the base being determined at build time. Previously, they - were always stored in base 2**15. Using base 2**30 gives +* Long integers are now stored internally either in base ``2**15`` or in base + ``2**30``, the base being determined at build time. Previously, they + were always stored in base ``2**15``. Using base ``2**30`` gives significant performance improvements on 64-bit machines, but benchmark results on 32-bit machines have been mixed. Therefore, - the default is to use base 2**30 on 64-bit machines and base 2**15 + the default is to use base ``2**30`` on 64-bit machines and base ``2**15`` on 32-bit machines; on Unix, there's a new configure option :option:`!--enable-big-digits` that can be used to override this default. diff --git a/Doc/whatsnew/3.1.rst b/Doc/whatsnew/3.1.rst index 919fbeeb2ad857..f1e6d0c4f3dd68 100644 --- a/Doc/whatsnew/3.1.rst +++ b/Doc/whatsnew/3.1.rst @@ -474,12 +474,12 @@ Build and C API Changes Changes to Python's build process and to the C API include: -* Integers are now stored internally either in base 2**15 or in base - 2**30, the base being determined at build time. Previously, they - were always stored in base 2**15. Using base 2**30 gives +* Integers are now stored internally either in base ``2**15`` or in base + ``2**30``, the base being determined at build time. Previously, they + were always stored in base ``2**15``. Using base ``2**30`` gives significant performance improvements on 64-bit machines, but benchmark results on 32-bit machines have been mixed. Therefore, - the default is to use base 2**30 on 64-bit machines and base 2**15 + the default is to use base ``2**30`` on 64-bit machines and base ``2**15`` on 32-bit machines; on Unix, there's a new configure option ``--enable-big-digits`` that can be used to override this default. diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 7121bbe35310d6..484aad7d657628 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -243,14 +243,14 @@ time ---- * On Unix, :func:`time.sleep` now uses the ``clock_nanosleep()`` or - ``nanosleep()`` function, if available, which has a resolution of 1 ns (10^-9 - sec), rather than using ``select()`` which has a resolution of 1 us (10^-6 - sec). + ``nanosleep()`` function, if available, which has a resolution of 1 ns + (10\ :sup:`-9` sec), rather than using ``select()`` which has a resolution + of 1 us (10\ :sup:`-6` sec). (Contributed by Livius and Victor Stinner in :issue:`21302`.) * On Windows, :func:`time.sleep` now uses a waitable timer which has a - resolution of 100 ns (10^-7 sec). Previously, it had a solution of 1 ms - (10^-3 sec). + resolution of 100 ns (10\ :sup:`-7` sec). Previously, it had a solution of 1 ms + (10\ :sup:`-3` sec). (Contributed by Livius and Victor Stinner in :issue:`21302`.) unicodedata diff --git a/Misc/NEWS.d/3.5.0a1.rst b/Misc/NEWS.d/3.5.0a1.rst index a9eba80f5f9670..97bdef6c93213f 100644 --- a/Misc/NEWS.d/3.5.0a1.rst +++ b/Misc/NEWS.d/3.5.0a1.rst @@ -2648,7 +2648,7 @@ module. .. nonce: THJSYB .. section: Library -Changed FeedParser feed() to avoid O(N**2) behavior when parsing long line. +Changed FeedParser feed() to avoid O(N\ :sup:`2`) behavior when parsing long line. Original patch by Raymond Hettinger. .. diff --git a/Misc/NEWS.d/3.6.4rc1.rst b/Misc/NEWS.d/3.6.4rc1.rst index 36dfadda0fe1b3..dc9ab7ad56de89 100644 --- a/Misc/NEWS.d/3.6.4rc1.rst +++ b/Misc/NEWS.d/3.6.4rc1.rst @@ -22,7 +22,7 @@ Setting sys.tracebacklimit to 0 or less now suppresses printing tracebacks. Setting sys.tracebacklimit to None now causes using the default limit. Setting sys.tracebacklimit to an integer larger than LONG_MAX now means using the limit LONG_MAX rather than the default limit. -Fixed integer overflows in the case of more than 2**31 traceback items on +Fixed integer overflows in the case of more than ``2**31`` traceback items on Windows. Fixed output errors handling. diff --git a/Misc/NEWS.d/3.7.0a3.rst b/Misc/NEWS.d/3.7.0a3.rst index 8ef7a5118a1f55..067720efa516e0 100644 --- a/Misc/NEWS.d/3.7.0a3.rst +++ b/Misc/NEWS.d/3.7.0a3.rst @@ -100,7 +100,7 @@ Setting sys.tracebacklimit to 0 or less now suppresses printing tracebacks. Setting sys.tracebacklimit to None now causes using the default limit. Setting sys.tracebacklimit to an integer larger than LONG_MAX now means using the limit LONG_MAX rather than the default limit. -Fixed integer overflows in the case of more than 2**31 traceback items on +Fixed integer overflows in the case of more than ``2**31`` traceback items on Windows. Fixed output errors handling. diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index 89811c12a7948e..5cd3fa32105c27 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -3355,7 +3355,7 @@ if the ``PATH`` environment variable is not set. On Windows, fix multiprocessing.Connection for very large read: fix _winapi.PeekNamedPipe() and _winapi.ReadFile() for read larger than INT_MAX -(usually 2^31-1). +(usually ``2**31-1``). .. diff --git a/Misc/NEWS.d/3.9.0a1.rst b/Misc/NEWS.d/3.9.0a1.rst index fe9fc58e3979ae..0a6a6eb2871459 100644 --- a/Misc/NEWS.d/3.9.0a1.rst +++ b/Misc/NEWS.d/3.9.0a1.rst @@ -213,7 +213,7 @@ objects. Patch by Dong-hee Na and Inada Naoki. .. section: Core and Builtins :class:`bytearray`, :class:`~array.array` and :class:`~mmap.mmap` objects -allow now to export more than 2**31 buffers at a time. +allow now to export more than ``2**31`` buffers at a time. .. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-26-18-44-03.bpo-45018.pu8H9L.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-26-18-44-03.bpo-45018.pu8H9L.rst index 5bf13ef06f34c3..88ef80630ef9b3 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-26-18-44-03.bpo-45018.pu8H9L.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2021-08-26-18-44-03.bpo-45018.pu8H9L.rst @@ -1 +1 @@ -Fixed pickling of range iterators that iterated for over 2**32 times. +Fixed pickling of range iterators that iterated for over ``2**32`` times. diff --git a/Misc/NEWS.d/next/Library/2021-08-25-20-18-31.bpo-39218.BlO6jW.rst b/Misc/NEWS.d/next/Library/2021-08-25-20-18-31.bpo-39218.BlO6jW.rst index 7bcf9a222e33c3..f45dbfe463c87e 100644 --- a/Misc/NEWS.d/next/Library/2021-08-25-20-18-31.bpo-39218.BlO6jW.rst +++ b/Misc/NEWS.d/next/Library/2021-08-25-20-18-31.bpo-39218.BlO6jW.rst @@ -1 +1 @@ -Improve accuracy of variance calculations by using x*x instead of x**2. +Improve accuracy of variance calculations by using ``x*x`` instead of ``x**2``. diff --git a/Misc/NEWS.d/next/Library/2021-09-20-22-46-40.bpo-21302.h56430.rst b/Misc/NEWS.d/next/Library/2021-09-20-22-46-40.bpo-21302.h56430.rst index 22011b791e5f2d..1746d56f41b4c0 100644 --- a/Misc/NEWS.d/next/Library/2021-09-20-22-46-40.bpo-21302.h56430.rst +++ b/Misc/NEWS.d/next/Library/2021-09-20-22-46-40.bpo-21302.h56430.rst @@ -1,3 +1,3 @@ On Windows, :func:`time.sleep` now uses a waitable timer which has a resolution -of 100 ns (10^-7 sec). Previously, it had a solution of 1 ms (10^-3 sec). +of 100 ns (10\ :sup:`-7` sec). Previously, it had a solution of 1 ms (10\ :sup:`-3` sec). Patch by Livius and Victor Stinner. From e046aabbe386fdf32bae6ffb7fae5ce479fd10c6 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Wed, 29 Sep 2021 00:18:00 +0300 Subject: [PATCH 018/263] bpo-45269: test wrong `markers` type to `c_make_encoder` (GH-28540) --- Lib/test/test_json/test_speedups.py | 9 +++++++++ .../next/Tests/2021-09-24-10-41-49.bpo-45269.8jKEr8.rst | 1 + 2 files changed, 10 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2021-09-24-10-41-49.bpo-45269.8jKEr8.rst diff --git a/Lib/test/test_json/test_speedups.py b/Lib/test/test_json/test_speedups.py index fbfee1a582095b..682014cfd5b344 100644 --- a/Lib/test/test_json/test_speedups.py +++ b/Lib/test/test_json/test_speedups.py @@ -59,6 +59,15 @@ def bad_encoder2(*args): with self.assertRaises(ZeroDivisionError): enc('spam', 4) + def test_bad_markers_argument_to_encoder(self): + # https://bugs.python.org/issue45269 + with self.assertRaisesRegex( + TypeError, + r'make_encoder\(\) argument 1 must be dict or None, not int', + ): + self.json.encoder.c_make_encoder(1, None, None, None, ': ', ', ', + False, False, False) + def test_bad_bool_args(self): def test(name): self.json.encoder.JSONEncoder(**{name: BadBool()}).encode({'a': 1}) diff --git a/Misc/NEWS.d/next/Tests/2021-09-24-10-41-49.bpo-45269.8jKEr8.rst b/Misc/NEWS.d/next/Tests/2021-09-24-10-41-49.bpo-45269.8jKEr8.rst new file mode 100644 index 00000000000000..72dd9471134fff --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2021-09-24-10-41-49.bpo-45269.8jKEr8.rst @@ -0,0 +1 @@ +Cover case when invalid ``markers`` type is supplied to ``c_make_encoder``. From 233b9da07d15f19c11e483e7ef7e3c73422e03f9 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 29 Sep 2021 12:09:56 +0300 Subject: [PATCH 019/263] [docs] Use full names for time units (GH-28611) Use "second", "millisecond", "microsecond", "nanosecond" instead of "sec", "ms", "msec", "us", "ns", etc. --- Doc/library/asyncio-dev.rst | 2 +- Doc/library/asyncio-platforms.rst | 2 +- Doc/library/curses.rst | 2 +- Doc/library/multiprocessing.rst | 2 +- Doc/library/time.rst | 8 ++++---- Doc/library/timeit.rst | 2 +- Doc/whatsnew/3.11.rst | 10 +++++----- Doc/whatsnew/3.9.rst | 2 +- Misc/NEWS.d/3.10.0a4.rst | 2 +- Misc/NEWS.d/3.7.0a4.rst | 2 +- Misc/NEWS.d/3.9.0b1.rst | 2 +- .../Library/2021-09-20-22-46-40.bpo-21302.h56430.rst | 3 ++- .../Windows/2021-06-06-16-36-13.bpo-41299.Rg-vb_.rst | 2 +- 13 files changed, 21 insertions(+), 20 deletions(-) diff --git a/Doc/library/asyncio-dev.rst b/Doc/library/asyncio-dev.rst index 02a00033152aba..77f1128de50c95 100644 --- a/Doc/library/asyncio-dev.rst +++ b/Doc/library/asyncio-dev.rst @@ -57,7 +57,7 @@ When the debug mode is enabled: * The execution time of the I/O selector is logged if it takes too long to perform an I/O operation. -* Callbacks taking longer than 100ms are logged. The +* Callbacks taking longer than 100 milliseconds are logged. The :attr:`loop.slow_callback_duration` attribute can be used to set the minimum execution duration in seconds that is considered "slow". diff --git a/Doc/library/asyncio-platforms.rst b/Doc/library/asyncio-platforms.rst index 390ee1969d096f..50ad8a2ab70324 100644 --- a/Doc/library/asyncio-platforms.rst +++ b/Doc/library/asyncio-platforms.rst @@ -63,7 +63,7 @@ All event loops on Windows do not support the following methods: methods are not supported. The resolution of the monotonic clock on Windows is usually around 15.6 -msec. The best resolution is 0.5 msec. The resolution depends on the +milliseconds. The best resolution is 0.5 milliseconds. The resolution depends on the hardware (availability of `HPET `_) and on the Windows configuration. diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index efbece437af2dd..37e822c0e2b207 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -368,7 +368,7 @@ The module :mod:`curses` defines the following functions: Set the maximum time in milliseconds that can elapse between press and release events in order for them to be recognized as a click, and return the previous - interval value. The default value is 200 msec, or one fifth of a second. + interval value. The default value is 200 milliseconds, or one fifth of a second. .. function:: mousemask(mousemask) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index c5d07dc5954842..f3d725b822529e 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -412,7 +412,7 @@ For example:: multiple_results = [pool.apply_async(os.getpid, ()) for i in range(4)] print([res.get(timeout=1) for res in multiple_results]) - # make a single worker sleep for 10 secs + # make a single worker sleep for 10 seconds res = pool.apply_async(time.sleep, (10,)) try: print(res.get(timeout=1)) diff --git a/Doc/library/time.rst b/Doc/library/time.rst index 69e5274f1cee74..0f880910c6ee68 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -366,11 +366,11 @@ Functions Unix implementation: - * Use ``clock_nanosleep()`` if available (resolution: 1 ns); - * Or use ``nanosleep()`` if available (resolution: 1 ns); - * Or use ``select()`` (resolution: 1 us). + * Use ``clock_nanosleep()`` if available (resolution: 1 nanosecond); + * Or use ``nanosleep()`` if available (resolution: 1 nanosecond); + * Or use ``select()`` (resolution: 1 microsecond). - On Windows, a waitable timer is used (resolution: 100 ns). If *secs* is + On Windows, a waitable timer is used (resolution: 100 nanosecond). If *secs* is zero, ``Sleep(0)`` is used. .. versionchanged:: 3.11 diff --git a/Doc/library/timeit.rst b/Doc/library/timeit.rst index d4e8b749db4808..7f1c41d46399ed 100644 --- a/Doc/library/timeit.rst +++ b/Doc/library/timeit.rst @@ -233,7 +233,7 @@ Where the following options are understood: .. cmdoption:: -u, --unit=U - specify a time unit for timer output; can select nsec, usec, msec, or sec + specify a time unit for timer output; can select ``nsec``, ``usec``, ``msec``, or ``sec`` .. versionadded:: 3.5 diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 484aad7d657628..d01d2e263199ad 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -243,14 +243,14 @@ time ---- * On Unix, :func:`time.sleep` now uses the ``clock_nanosleep()`` or - ``nanosleep()`` function, if available, which has a resolution of 1 ns - (10\ :sup:`-9` sec), rather than using ``select()`` which has a resolution - of 1 us (10\ :sup:`-6` sec). + ``nanosleep()`` function, if available, which has a resolution of 1 nanosecond + (10\ :sup:`-9` seconds), rather than using ``select()`` which has a resolution + of 1 microsecond (10\ :sup:`-6` seconds). (Contributed by Livius and Victor Stinner in :issue:`21302`.) * On Windows, :func:`time.sleep` now uses a waitable timer which has a - resolution of 100 ns (10\ :sup:`-7` sec). Previously, it had a solution of 1 ms - (10\ :sup:`-3` sec). + resolution of 100 nanoseconds (10\ :sup:`-7` seconds). Previously, it had + a resolution of 1 millisecond (10\ :sup:`-3` seconds). (Contributed by Livius and Victor Stinner in :issue:`21302`.) unicodedata diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index f1725e7df02204..941fae5fb87813 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -671,7 +671,7 @@ time On AIX, :func:`~time.thread_time` is now implemented with ``thread_cputime()`` which has nanosecond resolution, rather than -``clock_gettime(CLOCK_THREAD_CPUTIME_ID)`` which has a resolution of 10 ms. +``clock_gettime(CLOCK_THREAD_CPUTIME_ID)`` which has a resolution of 10 milliseconds. (Contributed by Batuhan Taskaya in :issue:`40192`) sys diff --git a/Misc/NEWS.d/3.10.0a4.rst b/Misc/NEWS.d/3.10.0a4.rst index 57da9254587b44..ff16a7037277c7 100644 --- a/Misc/NEWS.d/3.10.0a4.rst +++ b/Misc/NEWS.d/3.10.0a4.rst @@ -786,7 +786,7 @@ Skip some asyncio tests on VxWorks. .. nonce: uzwlF_ .. section: Tests -Enhance ``test_select.test_select()``: it now takes 500 ms rather than 10 +Enhance ``test_select.test_select()``: it now takes 500 milliseconds rather than 10 seconds. Use Python rather than a shell to make the test more portable. .. diff --git a/Misc/NEWS.d/3.7.0a4.rst b/Misc/NEWS.d/3.7.0a4.rst index af9cf4d29f902f..f19d1a1823584b 100644 --- a/Misc/NEWS.d/3.7.0a4.rst +++ b/Misc/NEWS.d/3.7.0a4.rst @@ -473,7 +473,7 @@ match. .. nonce: uxVOpk .. section: Library -Abort asyncio SSLProtocol connection if handshake not complete within 10s +Abort asyncio SSLProtocol connection if handshake not complete within 10 seconds. .. diff --git a/Misc/NEWS.d/3.9.0b1.rst b/Misc/NEWS.d/3.9.0b1.rst index 51dc9ce0ec0377..529be0eba586ac 100644 --- a/Misc/NEWS.d/3.9.0b1.rst +++ b/Misc/NEWS.d/3.9.0b1.rst @@ -641,7 +641,7 @@ than alphabetical. On AIX, :func:`~time.thread_time` is now implemented with ``thread_cputime()`` which has nanosecond resolution, rather than -``clock_gettime(CLOCK_THREAD_CPUTIME_ID)`` which has a resolution of 10 ms. +``clock_gettime(CLOCK_THREAD_CPUTIME_ID)`` which has a resolution of 10 milliseconds. Patch by Batuhan Taskaya. .. diff --git a/Misc/NEWS.d/next/Library/2021-09-20-22-46-40.bpo-21302.h56430.rst b/Misc/NEWS.d/next/Library/2021-09-20-22-46-40.bpo-21302.h56430.rst index 1746d56f41b4c0..07f18d4a9074a0 100644 --- a/Misc/NEWS.d/next/Library/2021-09-20-22-46-40.bpo-21302.h56430.rst +++ b/Misc/NEWS.d/next/Library/2021-09-20-22-46-40.bpo-21302.h56430.rst @@ -1,3 +1,4 @@ On Windows, :func:`time.sleep` now uses a waitable timer which has a resolution -of 100 ns (10\ :sup:`-7` sec). Previously, it had a solution of 1 ms (10\ :sup:`-3` sec). +of 100 nanoseconds (10\ :sup:`-7` seconds). Previously, it had a resolution of +1 millisecond (10\ :sup:`-3` seconds). Patch by Livius and Victor Stinner. diff --git a/Misc/NEWS.d/next/Windows/2021-06-06-16-36-13.bpo-41299.Rg-vb_.rst b/Misc/NEWS.d/next/Windows/2021-06-06-16-36-13.bpo-41299.Rg-vb_.rst index 71f700ffa1553e..1104882b1ba302 100644 --- a/Misc/NEWS.d/next/Windows/2021-06-06-16-36-13.bpo-41299.Rg-vb_.rst +++ b/Misc/NEWS.d/next/Windows/2021-06-06-16-36-13.bpo-41299.Rg-vb_.rst @@ -1 +1 @@ -Fix 16ms jitter when using timeouts in :mod:`threading`, such as with :meth:`threading.Lock.acquire` or :meth:`threading.Condition.wait`. +Fix 16 milliseconds jitter when using timeouts in :mod:`threading`, such as with :meth:`threading.Lock.acquire` or :meth:`threading.Condition.wait`. From b6fe8572509b77d2002eaddf99d718e9b4835684 Mon Sep 17 00:00:00 2001 From: Jack DeVries <58614260+jdevries3133@users.noreply.github.com> Date: Wed, 29 Sep 2021 05:25:48 -0400 Subject: [PATCH 020/263] bpo-39039: tarfile raises descriptive exception from zlib.error (GH-27766) * during tarfile parsing, a zlib error indicates invalid data * tarfile.open now raises a descriptive exception from the zlib error * this makes it clear to the user that they may be trying to open a corrupted tar file --- Lib/tarfile.py | 9 +++++++++ Lib/test/test_tarfile.py | 14 ++++++++++++++ .../2021-08-18-10-36-14.bpo-39039.A63LYh.rst | 2 ++ 3 files changed, 25 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2021-08-18-10-36-14.bpo-39039.A63LYh.rst diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 18d415adf54418..c1ee1222e09b5a 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -2349,6 +2349,15 @@ def next(self): raise ReadError(str(e)) from None except SubsequentHeaderError as e: raise ReadError(str(e)) from None + except Exception as e: + try: + import zlib + if isinstance(e, zlib.error): + raise ReadError(f'zlib error: {e}') from None + else: + raise e + except ImportError: + raise e break if tarinfo is not None: diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index cfdda24a269f56..e4b5c52bf1eaf4 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -19,6 +19,10 @@ import gzip except ImportError: gzip = None +try: + import zlib +except ImportError: + zlib = None try: import bz2 except ImportError: @@ -687,6 +691,16 @@ def test_parallel_iteration(self): self.assertEqual(m1.offset, m2.offset) self.assertEqual(m1.get_info(), m2.get_info()) + @unittest.skipIf(zlib is None, "requires zlib") + def test_zlib_error_does_not_leak(self): + # bpo-39039: tarfile.open allowed zlib exceptions to bubble up when + # parsing certain types of invalid data + with unittest.mock.patch("tarfile.TarInfo.fromtarfile") as mock: + mock.side_effect = zlib.error + with self.assertRaises(tarfile.ReadError): + tarfile.open(self.tarname) + + class MiscReadTest(MiscReadTestBase, unittest.TestCase): test_fail_comp = None diff --git a/Misc/NEWS.d/next/Library/2021-08-18-10-36-14.bpo-39039.A63LYh.rst b/Misc/NEWS.d/next/Library/2021-08-18-10-36-14.bpo-39039.A63LYh.rst new file mode 100644 index 00000000000000..7250055c2a4a9e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-08-18-10-36-14.bpo-39039.A63LYh.rst @@ -0,0 +1,2 @@ +tarfile.open raises :exc:`~tarfile.ReadError` when a zlib error occurs +during file extraction. From eed32df5b6b989caf125d829301546db58b529dd Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 29 Sep 2021 13:07:58 +0300 Subject: [PATCH 021/263] bpo-24391: Better reprs for threading objects. (GH-20534) Add reprs for Semaphore, BoundedSemaphore, Event, and Barrier. --- Lib/test/lock_tests.py | 36 +++++++++++++++++++ Lib/threading.py | 22 ++++++++++++ .../2020-05-30-10-48-04.bpo-24391.ZCTnhX.rst | 3 ++ 3 files changed, 61 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-05-30-10-48-04.bpo-24391.ZCTnhX.rst diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py index dffb7d4418dfe6..d82629368dff8a 100644 --- a/Lib/test/lock_tests.py +++ b/Lib/test/lock_tests.py @@ -455,6 +455,12 @@ def test_at_fork_reinit(self): with evt._cond: self.assertFalse(evt._cond.acquire(False)) + def test_repr(self): + evt = self.eventtype() + self.assertRegex(repr(evt), r"<\w+\.Event at .*: unset>") + evt.set() + self.assertRegex(repr(evt), r"<\w+\.Event at .*: set>") + class ConditionTests(BaseTestCase): """ @@ -802,6 +808,15 @@ def test_release_unacquired(self): sem.acquire() sem.release() + def test_repr(self): + sem = self.semtype(3) + self.assertRegex(repr(sem), r"<\w+\.Semaphore at .*: value=3>") + sem.acquire() + self.assertRegex(repr(sem), r"<\w+\.Semaphore at .*: value=2>") + sem.release() + sem.release() + self.assertRegex(repr(sem), r"<\w+\.Semaphore at .*: value=4>") + class BoundedSemaphoreTests(BaseSemaphoreTests): """ @@ -816,6 +831,12 @@ def test_release_unacquired(self): sem.release() self.assertRaises(ValueError, sem.release) + def test_repr(self): + sem = self.semtype(3) + self.assertRegex(repr(sem), r"<\w+\.BoundedSemaphore at .*: value=3/3>") + sem.acquire() + self.assertRegex(repr(sem), r"<\w+\.BoundedSemaphore at .*: value=2/3>") + class BarrierTests(BaseTestCase): """ @@ -1008,3 +1029,18 @@ def test_single_thread(self): b = self.barriertype(1) b.wait() b.wait() + + def test_repr(self): + b = self.barriertype(3) + self.assertRegex(repr(b), r"<\w+\.Barrier at .*: waiters=0/3>") + def f(): + b.wait(3) + bunch = Bunch(f, 2) + bunch.wait_for_started() + time.sleep(0.2) + self.assertRegex(repr(b), r"<\w+\.Barrier at .*: waiters=2/3>") + b.wait(3) + bunch.wait_for_finished() + self.assertRegex(repr(b), r"<\w+\.Barrier at .*: waiters=0/3>") + b.abort() + self.assertRegex(repr(b), r"<\w+\.Barrier at .*: broken>") diff --git a/Lib/threading.py b/Lib/threading.py index 9b0419c296fcd8..e9962d1661df6f 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -418,6 +418,11 @@ def __init__(self, value=1): self._cond = Condition(Lock()) self._value = value + def __repr__(self): + cls = self.__class__ + return (f"<{cls.__module__}.{cls.__qualname__} at {id(self):#x}:" + f" value={self._value}>") + def acquire(self, blocking=True, timeout=None): """Acquire a semaphore, decrementing the internal counter by one. @@ -504,6 +509,11 @@ def __init__(self, value=1): Semaphore.__init__(self, value) self._initial_value = value + def __repr__(self): + cls = self.__class__ + return (f"<{cls.__module__}.{cls.__qualname__} at {id(self):#x}:" + f" value={self._value}/{self._initial_value}>") + def release(self, n=1): """Release a semaphore, incrementing the internal counter by one or more. @@ -539,6 +549,11 @@ def __init__(self): self._cond = Condition(Lock()) self._flag = False + def __repr__(self): + cls = self.__class__ + status = 'set' if self._flag else 'unset' + return f"<{cls.__module__}.{cls.__qualname__} at {id(self):#x}: {status}>" + def _at_fork_reinit(self): # Private method called by Thread._reset_internal_locks() self._cond._at_fork_reinit() @@ -637,6 +652,13 @@ def __init__(self, parties, action=None, timeout=None): self._state = 0 #0 filling, 1, draining, -1 resetting, -2 broken self._count = 0 + def __repr__(self): + cls = self.__class__ + if self.broken: + return f"<{cls.__module__}.{cls.__qualname__} at {id(self):#x}: broken>" + return (f"<{cls.__module__}.{cls.__qualname__} at {id(self):#x}:" + f" waiters={self.n_waiting}/{self.parties}>") + def wait(self, timeout=None): """Wait for the barrier. diff --git a/Misc/NEWS.d/next/Library/2020-05-30-10-48-04.bpo-24391.ZCTnhX.rst b/Misc/NEWS.d/next/Library/2020-05-30-10-48-04.bpo-24391.ZCTnhX.rst new file mode 100644 index 00000000000000..15add1531501aa --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-05-30-10-48-04.bpo-24391.ZCTnhX.rst @@ -0,0 +1,3 @@ +Improved reprs of :mod:`threading` synchronization objects: +:class:`~threading.Semaphore`, :class:`~threading.BoundedSemaphore`, +:class:`~threading.Event` and :class:`~threading.Barrier`. From bc4cde40339dd372960f27401d8fdaa4dab0f469 Mon Sep 17 00:00:00 2001 From: zhanpon Date: Wed, 29 Sep 2021 19:54:59 +0900 Subject: [PATCH 022/263] bpo-45291: Explicitly set --libdir=lib when configure OpenSSL (GH-28566) --- Doc/using/unix.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/Doc/using/unix.rst b/Doc/using/unix.rst index 1d1fa8bd85d7ed..0a1834453a0ee8 100644 --- a/Doc/using/unix.rst +++ b/Doc/using/unix.rst @@ -162,6 +162,7 @@ Custom OpenSSL $ pushd openssl-VERSION $ ./config \ --prefix=/usr/local/custom-openssl \ + --libdir=lib \ --openssldir=/etc/ssl $ make -j1 depend $ make -j8 From f76889a88720b56c8174f26a20a8e676a460c7a6 Mon Sep 17 00:00:00 2001 From: andrei kulakov Date: Wed, 29 Sep 2021 07:44:43 -0400 Subject: [PATCH 023/263] Fix doctest doc examples for syntax errors (GH-28486) * fix doctest doc examples for syntax errors * updated examples to use TypeErrors * fixed first sentence * unneeded comma --- Doc/library/doctest.rst | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index a77322f83acbde..0bbb640bea26b1 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -485,25 +485,24 @@ Some details you should read once, but won't need to remember: .. index:: single: ^ (caret); marker -* For some :exc:`SyntaxError`\ s, Python displays the character position of the - syntax error, using a ``^`` marker:: +* For some exceptions, Python displays the position of the error using ``^`` + markers and tildes:: - >>> 1 1 + >>> 1 + None File "", line 1 - 1 1 - ^ - SyntaxError: invalid syntax + 1 + None + ~~^~~~~~ + TypeError: unsupported operand type(s) for +: 'int' and 'NoneType' Since the lines showing the position of the error come before the exception type and detail, they are not checked by doctest. For example, the following test would pass, even though it puts the ``^`` marker in the wrong location:: - >>> 1 1 - Traceback (most recent call last): + >>> 1 + None File "", line 1 - 1 1 - ^ - SyntaxError: invalid syntax + 1 + None + ^~~~~~~~ + TypeError: unsupported operand type(s) for +: 'int' and 'NoneType' .. _option-flags-and-directives: From 6c1154b9de29e1c9cd3d05f5289543e5cff73895 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Wed, 29 Sep 2021 14:18:33 +0100 Subject: [PATCH 024/263] bpo-44394: Ensure libexpat is linked against libm (GH-28617) --- setup.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 9e411cb35e00bd..9e71a223c0aabd 100644 --- a/setup.py +++ b/setup.py @@ -1767,7 +1767,9 @@ def detect_expat_elementtree(self): ('XML_POOR_ENTROPY', '1'), ] extra_compile_args = [] - expat_lib = [] + # bpo-44394: libexpact uses isnan() of math.h and needs linkage + # against the libm + expat_lib = ['m'] expat_sources = ['expat/xmlparse.c', 'expat/xmlrole.c', 'expat/xmltok.c'] From f1ca5d7f61594bf3627f0897b596877a0774c8e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Wed, 29 Sep 2021 16:11:26 +0200 Subject: [PATCH 025/263] [typo] Fix threading.Barrier comment that used confusing punctuation (GH-28623) Removed extra comma in comment that indicates state of a `Barrier` as it was confusing and breaking the flow while reading. Co-authored-by: Priyank <5903604+cpriyank@users.noreply.github.com> --- Lib/threading.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/threading.py b/Lib/threading.py index e9962d1661df6f..2f473bf1b2c2b3 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -649,7 +649,7 @@ def __init__(self, parties, action=None, timeout=None): self._action = action self._timeout = timeout self._parties = parties - self._state = 0 #0 filling, 1, draining, -1 resetting, -2 broken + self._state = 0 # 0 filling, 1 draining, -1 resetting, -2 broken self._count = 0 def __repr__(self): From bf5d1684a770af4e4d176bc6780874a4be168cac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Wed, 29 Sep 2021 16:29:35 +0200 Subject: [PATCH 026/263] [typo] s/libexpact/libexpat/ in setup.py (GH-28624) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 9e71a223c0aabd..6122430cd04317 100644 --- a/setup.py +++ b/setup.py @@ -1767,7 +1767,7 @@ def detect_expat_elementtree(self): ('XML_POOR_ENTROPY', '1'), ] extra_compile_args = [] - # bpo-44394: libexpact uses isnan() of math.h and needs linkage + # bpo-44394: libexpat uses isnan() of math.h and needs linkage # against the libm expat_lib = ['m'] expat_sources = ['expat/xmlparse.c', From 45ca1c04139300ec0289a32f78c7ac922a4f7b07 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Wed, 29 Sep 2021 12:55:35 -0600 Subject: [PATCH 027/263] bpo-45020: Do not freeze /__init__.py twice. (gh-28635) Currently we're freezing the __init__.py twice, duplicating the built data unnecessarily With this change we do it once. There is no change in runtime behavior. https://bugs.python.org/issue45020 --- Tools/scripts/freeze_modules.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Tools/scripts/freeze_modules.py b/Tools/scripts/freeze_modules.py index cfc6f7921c974c..f7273915b911e2 100644 --- a/Tools/scripts/freeze_modules.py +++ b/Tools/scripts/freeze_modules.py @@ -221,6 +221,7 @@ def _parse_spec(spec, knownids=None, section=None): if ispkg: pkgid = frozenid pkgname = modname + pkgfiles = {pyfile: pkgid} def iter_subs(): for frozenid, pyfile, ispkg in resolved: assert not knownids or frozenid not in knownids, (frozenid, spec) @@ -228,6 +229,12 @@ def iter_subs(): modname = frozenid.replace(pkgid, pkgname, 1) else: modname = frozenid + if pyfile: + if pyfile in pkgfiles: + frozenid = pkgfiles[pyfile] + pyfile = None + elif ispkg: + pkgfiles[pyfile] = frozenid yield frozenid, pyfile, modname, ispkg, section submodules = iter_subs() From d441437ee71ae174c008c23308b749b91020ba77 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 29 Sep 2021 23:27:57 +0300 Subject: [PATCH 028/263] bpo-45229: Make datetime tests discoverable (GH-28615) --- Lib/test/test_datetime.py | 92 +++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 47 deletions(-) diff --git a/Lib/test/test_datetime.py b/Lib/test/test_datetime.py index bdb9f02e5756a2..7f9094fa7bd4e6 100644 --- a/Lib/test/test_datetime.py +++ b/Lib/test/test_datetime.py @@ -1,59 +1,57 @@ import unittest import sys -from test.support import run_unittest from test.support.import_helper import import_fresh_module TESTS = 'test.datetimetester' -try: - pure_tests = import_fresh_module(TESTS, fresh=['datetime', '_strptime'], - blocked=['_datetime']) - fast_tests = import_fresh_module(TESTS, fresh=['datetime', - '_datetime', '_strptime']) -finally: - # XXX: import_fresh_module() is supposed to leave sys.module cache untouched, - # XXX: but it does not, so we have to cleanup ourselves. - for modname in ['datetime', '_datetime', '_strptime']: - sys.modules.pop(modname, None) -test_modules = [pure_tests, fast_tests] -test_suffixes = ["_Pure", "_Fast"] -# XXX(gb) First run all the _Pure tests, then all the _Fast tests. You might -# not believe this, but in spite of all the sys.modules trickery running a _Pure -# test last will leave a mix of pure and native datetime stuff lying around. -all_test_classes = [] +def load_tests(loader, tests, pattern): + try: + pure_tests = import_fresh_module(TESTS, fresh=['datetime', '_strptime'], + blocked=['_datetime']) + fast_tests = import_fresh_module(TESTS, fresh=['datetime', + '_datetime', '_strptime']) + finally: + # XXX: import_fresh_module() is supposed to leave sys.module cache untouched, + # XXX: but it does not, so we have to cleanup ourselves. + for modname in ['datetime', '_datetime', '_strptime']: + sys.modules.pop(modname, None) -for module, suffix in zip(test_modules, test_suffixes): - test_classes = [] - for name, cls in module.__dict__.items(): - if not isinstance(cls, type): - continue - if issubclass(cls, unittest.TestCase): - test_classes.append(cls) - elif issubclass(cls, unittest.TestSuite): - suit = cls() - test_classes.extend(type(test) for test in suit) - test_classes = sorted(set(test_classes), key=lambda cls: cls.__qualname__) - for cls in test_classes: - cls.__name__ += suffix - cls.__qualname__ += suffix - @classmethod - def setUpClass(cls_, module=module): - cls_._save_sys_modules = sys.modules.copy() - sys.modules[TESTS] = module - sys.modules['datetime'] = module.datetime_module - sys.modules['_strptime'] = module._strptime - @classmethod - def tearDownClass(cls_): - sys.modules.clear() - sys.modules.update(cls_._save_sys_modules) - cls.setUpClass = setUpClass - cls.tearDownClass = tearDownClass - all_test_classes.extend(test_classes) + test_modules = [pure_tests, fast_tests] + test_suffixes = ["_Pure", "_Fast"] + # XXX(gb) First run all the _Pure tests, then all the _Fast tests. You might + # not believe this, but in spite of all the sys.modules trickery running a _Pure + # test last will leave a mix of pure and native datetime stuff lying around. + for module, suffix in zip(test_modules, test_suffixes): + test_classes = [] + for name, cls in module.__dict__.items(): + if not isinstance(cls, type): + continue + if issubclass(cls, unittest.TestCase): + test_classes.append(cls) + elif issubclass(cls, unittest.TestSuite): + suit = cls() + test_classes.extend(type(test) for test in suit) + test_classes = sorted(set(test_classes), key=lambda cls: cls.__qualname__) + for cls in test_classes: + cls.__name__ += suffix + cls.__qualname__ += suffix + @classmethod + def setUpClass(cls_, module=module): + cls_._save_sys_modules = sys.modules.copy() + sys.modules[TESTS] = module + sys.modules['datetime'] = module.datetime_module + sys.modules['_strptime'] = module._strptime + @classmethod + def tearDownClass(cls_): + sys.modules.clear() + sys.modules.update(cls_._save_sys_modules) + cls.setUpClass = setUpClass + cls.tearDownClass = tearDownClass + tests.addTests(loader.loadTestsFromTestCase(cls)) + return tests -def test_main(): - run_unittest(*all_test_classes) if __name__ == "__main__": - test_main() + unittest.main() From 8d3e7eff0936926554db6162c992af5829dc8160 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Sep 2021 01:28:10 +0200 Subject: [PATCH 029/263] bpo-43753: _operator.is_() uses Py_Is() (GH-28641) --- Modules/_operator.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Modules/_operator.c b/Modules/_operator.c index 12a5bf6371b459..b3a8bef2eaedd9 100644 --- a/Modules/_operator.c +++ b/Modules/_operator.c @@ -704,10 +704,8 @@ static PyObject * _operator_is__impl(PyObject *module, PyObject *a, PyObject *b) /*[clinic end generated code: output=bcd47a402e482e1d input=5fa9b97df03c427f]*/ { - PyObject *result; - result = (a == b) ? Py_True : Py_False; - Py_INCREF(result); - return result; + PyObject *result = Py_Is(a, b) ? Py_True : Py_False; + return Py_NewRef(result); } /*[clinic input] From 09796f2f142fdb1214f34a3ca917959ecb32a88b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Sep 2021 02:11:41 +0200 Subject: [PATCH 030/263] bpo-41710: Add _PyTime_AsTimespec_clamp() (GH-28629) Add the _PyTime_AsTimespec_clamp() function: similar to _PyTime_AsTimespec(), but clamp to _PyTime_t min/max and don't raise an exception. PyThread_acquire_lock_timed() now uses _PyTime_AsTimespec_clamp() to remove the Py_UNREACHABLE() code path. * Add _PyTime_AsTime_t() function. * Add PY_TIME_T_MIN and PY_TIME_T_MAX constants. * Replace _PyTime_AsTimeval_noraise() with _PyTime_AsTimeval_clamp(). * Add pytime_divide_round_up() function. * Fix integer overflow in pytime_divide(). * Add pytime_divmod() function. --- Include/cpython/pytime.h | 16 ++- Lib/test/test_time.py | 49 +++++++- Modules/_ssl.c | 2 +- Modules/_testcapimodule.c | 45 ++++++- Modules/selectmodule.c | 2 +- Modules/socketmodule.c | 2 +- Python/pytime.c | 238 ++++++++++++++++++++++++++------------ Python/thread_pthread.h | 6 +- 8 files changed, 269 insertions(+), 91 deletions(-) diff --git a/Include/cpython/pytime.h b/Include/cpython/pytime.h index 8c2958501f7967..04c43ac5d4d6c1 100644 --- a/Include/cpython/pytime.h +++ b/Include/cpython/pytime.h @@ -16,6 +16,7 @@ extern "C" { typedef int64_t _PyTime_t; #define _PyTime_MIN INT64_MIN #define _PyTime_MAX INT64_MAX +#define _SIZEOF_PYTIME_T 8 typedef enum { /* Round towards minus infinity (-inf). @@ -136,8 +137,9 @@ PyAPI_FUNC(int) _PyTime_AsTimeval(_PyTime_t t, struct timeval *tv, _PyTime_round_t round); -/* Similar to _PyTime_AsTimeval(), but don't raise an exception on error. */ -PyAPI_FUNC(int) _PyTime_AsTimeval_noraise(_PyTime_t t, +/* Similar to _PyTime_AsTimeval() but don't raise an exception on overflow. + On overflow, clamp tv_sec to _PyTime_t min/max. */ +PyAPI_FUNC(void) _PyTime_AsTimeval_clamp(_PyTime_t t, struct timeval *tv, _PyTime_round_t round); @@ -162,6 +164,10 @@ PyAPI_FUNC(int) _PyTime_FromTimespec(_PyTime_t *tp, struct timespec *ts); tv_nsec is always positive. Raise an exception and return -1 on error, return 0 on success. */ PyAPI_FUNC(int) _PyTime_AsTimespec(_PyTime_t t, struct timespec *ts); + +/* Similar to _PyTime_AsTimespec() but don't raise an exception on overflow. + On overflow, clamp tv_sec to _PyTime_t min/max. */ +PyAPI_FUNC(void) _PyTime_AsTimespec_clamp(_PyTime_t t, struct timespec *ts); #endif /* Compute ticks * mul / div. @@ -181,7 +187,7 @@ typedef struct { /* Get the current time from the system clock. If the internal clock fails, silently ignore the error and return 0. - On integer overflow, silently ignore the overflow and truncated the clock to + On integer overflow, silently ignore the overflow and clamp the clock to _PyTime_MIN or _PyTime_MAX. Use _PyTime_GetSystemClockWithInfo() to check for failure. */ @@ -201,7 +207,7 @@ PyAPI_FUNC(int) _PyTime_GetSystemClockWithInfo( results of consecutive calls is valid. If the internal clock fails, silently ignore the error and return 0. - On integer overflow, silently ignore the overflow and truncated the clock to + On integer overflow, silently ignore the overflow and clamp the clock to _PyTime_MIN or _PyTime_MAX. Use _PyTime_GetMonotonicClockWithInfo() to check for failure. */ @@ -232,7 +238,7 @@ PyAPI_FUNC(int) _PyTime_gmtime(time_t t, struct tm *tm); measure a short duration. If the internal clock fails, silently ignore the error and return 0. - On integer overflow, silently ignore the overflow and truncated the clock to + On integer overflow, silently ignore the overflow and clamp the clock to _PyTime_MIN or _PyTime_MAX. Use _PyTime_GetPerfCounterWithInfo() to check for failure. */ diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index 325829864851c3..f7fd6510d8aa7a 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -38,6 +38,10 @@ class _PyTime(enum.IntEnum): # Round away from zero ROUND_UP = 3 +# _PyTime_t is int64_t +_PyTime_MIN = -2 ** 63 +_PyTime_MAX = 2 ** 63 - 1 + # Rounding modes supported by PyTime ROUNDING_MODES = ( # (PyTime rounding method, decimal rounding method) @@ -960,6 +964,49 @@ def timespec_converter(ns): NS_TO_SEC, value_filter=self.time_t_filter) + @unittest.skipUnless(hasattr(_testcapi, 'PyTime_AsTimeval_clamp'), + 'need _testcapi.PyTime_AsTimeval_clamp') + def test_AsTimeval_clamp(self): + from _testcapi import PyTime_AsTimeval_clamp + + if sys.platform == 'win32': + from _testcapi import LONG_MIN, LONG_MAX + tv_sec_max = LONG_MAX + tv_sec_min = LONG_MIN + else: + tv_sec_max = self.time_t_max + tv_sec_min = self.time_t_min + + for t in (_PyTime_MIN, _PyTime_MAX): + ts = PyTime_AsTimeval_clamp(t, _PyTime.ROUND_CEILING) + with decimal.localcontext() as context: + context.rounding = decimal.ROUND_CEILING + us = self.decimal_round(decimal.Decimal(t) / US_TO_NS) + tv_sec, tv_usec = divmod(us, SEC_TO_US) + if tv_sec_max < tv_sec: + tv_sec = tv_sec_max + tv_usec = 0 + elif tv_sec < tv_sec_min: + tv_sec = tv_sec_min + tv_usec = 0 + self.assertEqual(ts, (tv_sec, tv_usec)) + + @unittest.skipUnless(hasattr(_testcapi, 'PyTime_AsTimespec_clamp'), + 'need _testcapi.PyTime_AsTimespec_clamp') + def test_AsTimespec_clamp(self): + from _testcapi import PyTime_AsTimespec_clamp + + for t in (_PyTime_MIN, _PyTime_MAX): + ts = PyTime_AsTimespec_clamp(t) + tv_sec, tv_nsec = divmod(t, NS_TO_SEC) + if self.time_t_max < tv_sec: + tv_sec = self.time_t_max + tv_nsec = 0 + elif tv_sec < self.time_t_min: + tv_sec = self.time_t_min + tv_nsec = 0 + self.assertEqual(ts, (tv_sec, tv_nsec)) + def test_AsMilliseconds(self): from _testcapi import PyTime_AsMilliseconds @@ -1062,7 +1109,7 @@ def test_clock_functions(self): clock_names = [ "CLOCK_MONOTONIC", "clock_gettime", "clock_gettime_ns", "clock_settime", "clock_settime_ns", "clock_getres"] - + if mac_ver >= (10, 12): for name in clock_names: self.assertTrue(hasattr(time, name), f"time.{name} is not available") diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 6c63301b2a7d8d..411314f6d0f01b 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -2264,7 +2264,7 @@ PySSL_select(PySocketSockObject *s, int writing, _PyTime_t timeout) if (!_PyIsSelectable_fd(s->sock_fd)) return SOCKET_TOO_LARGE_FOR_SELECT; - _PyTime_AsTimeval_noraise(timeout, &tv, _PyTime_ROUND_CEILING); + _PyTime_AsTimeval_clamp(timeout, &tv, _PyTime_ROUND_CEILING); FD_ZERO(&fds); FD_SET(s->sock_fd, &fds); diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 51323f03e23689..e3eec0c47f73a8 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -4687,7 +4687,32 @@ test_PyTime_AsTimeval(PyObject *self, PyObject *args) if (seconds == NULL) { return NULL; } - return Py_BuildValue("Nl", seconds, tv.tv_usec); + return Py_BuildValue("Nl", seconds, (long)tv.tv_usec); +} + +static PyObject * +test_PyTime_AsTimeval_clamp(PyObject *self, PyObject *args) +{ + PyObject *obj; + int round; + if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) { + return NULL; + } + if (check_time_rounding(round) < 0) { + return NULL; + } + _PyTime_t t; + if (_PyTime_FromNanosecondsObject(&t, obj) < 0) { + return NULL; + } + struct timeval tv; + _PyTime_AsTimeval_clamp(t, &tv, round); + + PyObject *seconds = PyLong_FromLongLong(tv.tv_sec); + if (seconds == NULL) { + return NULL; + } + return Py_BuildValue("Nl", seconds, (long)tv.tv_usec); } #ifdef HAVE_CLOCK_GETTIME @@ -4708,6 +4733,22 @@ test_PyTime_AsTimespec(PyObject *self, PyObject *args) } return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec); } + +static PyObject * +test_PyTime_AsTimespec_clamp(PyObject *self, PyObject *args) +{ + PyObject *obj; + if (!PyArg_ParseTuple(args, "O", &obj)) { + return NULL; + } + _PyTime_t t; + if (_PyTime_FromNanosecondsObject(&t, obj) < 0) { + return NULL; + } + struct timespec ts; + _PyTime_AsTimespec_clamp(t, &ts); + return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec); +} #endif static PyObject * @@ -5872,8 +5913,10 @@ static PyMethodDef TestMethods[] = { {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS}, {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS}, {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS}, + {"PyTime_AsTimeval_clamp", test_PyTime_AsTimeval_clamp, METH_VARARGS}, #ifdef HAVE_CLOCK_GETTIME {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS}, + {"PyTime_AsTimespec_clamp", test_PyTime_AsTimespec_clamp, METH_VARARGS}, #endif {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS}, {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS}, diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 3ecd0c32b30389..b71b2c4f6c037d 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -344,7 +344,7 @@ select_select_impl(PyObject *module, PyObject *rlist, PyObject *wlist, n = 0; break; } - _PyTime_AsTimeval_noraise(timeout, &tv, _PyTime_ROUND_CEILING); + _PyTime_AsTimeval_clamp(timeout, &tv, _PyTime_ROUND_CEILING); /* retry select() with the recomputed timeout */ } } while (1); diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 83f05b72ecbd9e..f474869c94dc22 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -758,7 +758,7 @@ internal_select(PySocketSockObject *s, int writing, _PyTime_t interval, Py_END_ALLOW_THREADS; #else if (interval >= 0) { - _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING); + _PyTime_AsTimeval_clamp(interval, &tv, _PyTime_ROUND_CEILING); tvp = &tv; } else diff --git a/Python/pytime.c b/Python/pytime.c index b47a573488b6dc..f6ec191b637f0d 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -35,6 +35,16 @@ #define NS_TO_US (1000) #define NS_TO_100NS (100) +#if SIZEOF_TIME_T == SIZEOF_LONG_LONG +# define PY_TIME_T_MAX LLONG_MAX +# define PY_TIME_T_MIN LLONG_MIN +#elif SIZEOF_TIME_T == SIZEOF_LONG +# define PY_TIME_T_MAX LONG_MAX +# define PY_TIME_T_MIN LONG_MIN +#else +# error "unsupported time_t size" +#endif + static void pytime_time_t_overflow(void) @@ -63,7 +73,7 @@ pytime_from_nanoseconds(_PyTime_t t) static inline _PyTime_t pytime_as_nanoseconds(_PyTime_t t) { - // _PyTime_t is a number of nanoseconds + // _PyTime_t is a number of nanoseconds: see pytime_from_nanoseconds() return t; } @@ -119,6 +129,48 @@ _PyLong_FromTime_t(time_t t) } +// Convert _PyTime_t to time_t. +// Return 0 on success. Return -1 and clamp the value on overflow. +static int +_PyTime_AsTime_t(_PyTime_t t, time_t *t2) +{ +#if SIZEOF_TIME_T < _SIZEOF_PYTIME_T + if ((_PyTime_t)PY_TIME_T_MAX < t) { + *t2 = PY_TIME_T_MAX; + return -1; + } + if (t < (_PyTime_t)PY_TIME_T_MIN) { + *t2 = PY_TIME_T_MIN; + return -1; + } +#endif + *t2 = (time_t)t; + return 0; +} + + +#ifdef MS_WINDOWS +// Convert _PyTime_t to long. +// Return 0 on success. Return -1 and clamp the value on overflow. +static int +_PyTime_AsLong(_PyTime_t t, long *t2) +{ +#if SIZEOF_LONG < _SIZEOF_PYTIME_T + if ((_PyTime_t)LONG_MAX < t) { + *t2 = LONG_MAX; + return -1; + } + if (t < (_PyTime_t)LONG_MIN) { + *t2 = LONG_MIN; + return -1; + } +#endif + *t2 = (long)t; + return 0; +} +#endif + + /* Round to nearest with ties going to nearest even integer (_PyTime_ROUND_HALF_EVEN) */ static double @@ -514,16 +566,40 @@ _PyTime_AsNanosecondsObject(_PyTime_t t) } +static _PyTime_t +pytime_divide_round_up(const _PyTime_t t, const _PyTime_t k) +{ + assert(k > 1); + if (t >= 0) { + // Don't use (t + k - 1) / k to avoid integer overflow + // if t=_PyTime_MAX + _PyTime_t q = t / k; + if (t % k) { + q += 1; + } + return q; + } + else { + // Don't use (t - (k - 1)) / k to avoid integer overflow + // if t=_PyTime_MIN + _PyTime_t q = t / k; + if (t % k) { + q -= 1; + } + return q; + } +} + + static _PyTime_t pytime_divide(const _PyTime_t t, const _PyTime_t k, const _PyTime_round_t round) { assert(k > 1); if (round == _PyTime_ROUND_HALF_EVEN) { - _PyTime_t x, r, abs_r; - x = t / k; - r = t % k; - abs_r = Py_ABS(r); + _PyTime_t x = t / k; + _PyTime_t r = t % k; + _PyTime_t abs_r = Py_ABS(r); if (abs_r > k / 2 || (abs_r == k / 2 && (Py_ABS(x) & 1))) { if (t >= 0) { x++; @@ -536,7 +612,7 @@ pytime_divide(const _PyTime_t t, const _PyTime_t k, } else if (round == _PyTime_ROUND_CEILING) { if (t >= 0) { - return (t + k - 1) / k; + return pytime_divide_round_up(t, k); } else { return t / k; @@ -547,18 +623,41 @@ pytime_divide(const _PyTime_t t, const _PyTime_t k, return t / k; } else { - return (t - (k - 1)) / k; + return pytime_divide_round_up(t, k); } } else { assert(round == _PyTime_ROUND_UP); - if (t >= 0) { - return (t + k - 1) / k; - } - else { - return (t - (k - 1)) / k; + return pytime_divide_round_up(t, k); + } +} + + +// Compute (t / k, t % k) in (pq, pr). +// Make sure that 0 <= pr < k. +// Return 0 on success. +// Return -1 on underflow and store (_PyTime_MIN, 0) in (pq, pr). +static int +pytime_divmod(const _PyTime_t t, const _PyTime_t k, + _PyTime_t *pq, _PyTime_t *pr) +{ + assert(k > 1); + _PyTime_t q = t / k; + _PyTime_t r = t % k; + if (r < 0) { + if (q == _PyTime_MIN) { + *pq = _PyTime_MIN; + *pr = 0; + return -1; } + r += k; + q -= 1; } + assert(0 <= r && r < k); + + *pq = q; + *pr = r; + return 0; } @@ -596,64 +695,41 @@ _PyTime_AsMilliseconds(_PyTime_t t, _PyTime_round_t round) static int -pytime_as_timeval(_PyTime_t t, _PyTime_t *p_secs, int *p_us, +pytime_as_timeval(_PyTime_t t, _PyTime_t *ptv_sec, int *ptv_usec, _PyTime_round_t round) { - _PyTime_t ns, tv_sec; - ns = pytime_as_nanoseconds(t); - tv_sec = ns / SEC_TO_NS; - ns = ns % SEC_TO_NS; - - int tv_usec = (int)pytime_divide(ns, US_TO_NS, round); - int res = 0; - if (tv_usec < 0) { - tv_usec += SEC_TO_US; - if (tv_sec != _PyTime_MIN) { - tv_sec -= 1; - } - else { - res = -1; - } - } - else if (tv_usec >= SEC_TO_US) { - tv_usec -= SEC_TO_US; - if (tv_sec != _PyTime_MAX) { - tv_sec += 1; - } - else { - res = -1; - } - } - assert(0 <= tv_usec && tv_usec < SEC_TO_US); - - *p_secs = tv_sec; - *p_us = tv_usec; + _PyTime_t ns = pytime_as_nanoseconds(t); + _PyTime_t us = pytime_divide(ns, US_TO_NS, round); + _PyTime_t tv_sec, tv_usec; + int res = pytime_divmod(us, SEC_TO_US, &tv_sec, &tv_usec); + *ptv_sec = tv_sec; + *ptv_usec = (int)tv_usec; return res; } static int pytime_as_timeval_struct(_PyTime_t t, struct timeval *tv, - _PyTime_round_t round, int raise) + _PyTime_round_t round, int raise_exc) { - _PyTime_t secs, secs2; - int us; - int res; - - res = pytime_as_timeval(t, &secs, &us, round); + _PyTime_t tv_sec; + int tv_usec; + int res = pytime_as_timeval(t, &tv_sec, &tv_usec, round); + int res2; #ifdef MS_WINDOWS - tv->tv_sec = (long)secs; + // On Windows, timeval.tv_sec type is long + res2 = _PyTime_AsLong(tv_sec, &tv->tv_sec); #else - tv->tv_sec = secs; + res2 = _PyTime_AsTime_t(tv_sec, &tv->tv_sec); #endif - tv->tv_usec = us; + if (res2 < 0) { + tv_usec = 0; + } + tv->tv_usec = tv_usec; - secs2 = (_PyTime_t)tv->tv_sec; - if (res < 0 || secs2 != secs) { - if (raise) { - pytime_time_t_overflow(); - } + if (raise_exc && (res < 0 || res2 < 0)) { + pytime_time_t_overflow(); return -1; } return 0; @@ -667,10 +743,10 @@ _PyTime_AsTimeval(_PyTime_t t, struct timeval *tv, _PyTime_round_t round) } -int -_PyTime_AsTimeval_noraise(_PyTime_t t, struct timeval *tv, _PyTime_round_t round) +void +_PyTime_AsTimeval_clamp(_PyTime_t t, struct timeval *tv, _PyTime_round_t round) { - return pytime_as_timeval_struct(t, tv, round, 0); + (void)pytime_as_timeval_struct(t, tv, round, 0); } @@ -679,11 +755,12 @@ _PyTime_AsTimevalTime_t(_PyTime_t t, time_t *p_secs, int *us, _PyTime_round_t round) { _PyTime_t secs; - int res = pytime_as_timeval(t, &secs, us, round); - - *p_secs = (time_t)secs; + if (pytime_as_timeval(t, &secs, us, round) < 0) { + pytime_time_t_overflow(); + return -1; + } - if (res < 0 || (_PyTime_t)*p_secs != secs) { + if (_PyTime_AsTime_t(secs, p_secs) < 0) { pytime_time_t_overflow(); return -1; } @@ -692,28 +769,37 @@ _PyTime_AsTimevalTime_t(_PyTime_t t, time_t *p_secs, int *us, #if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE) -int -_PyTime_AsTimespec(_PyTime_t t, struct timespec *ts) +static int +pytime_as_timespec(_PyTime_t t, struct timespec *ts, int raise_exc) { + _PyTime_t ns = pytime_as_nanoseconds(t); _PyTime_t tv_sec, tv_nsec; + int res = pytime_divmod(ns, SEC_TO_NS, &tv_sec, &tv_nsec); - _PyTime_t ns = pytime_as_nanoseconds(t); - tv_sec = ns / SEC_TO_NS; - tv_nsec = ns % SEC_TO_NS; - if (tv_nsec < 0) { - tv_nsec += SEC_TO_NS; - tv_sec -= 1; - } - ts->tv_sec = (time_t)tv_sec; - assert(0 <= tv_nsec && tv_nsec < SEC_TO_NS); + int res2 = _PyTime_AsTime_t(tv_sec, &ts->tv_sec); + if (res2 < 0) { + tv_nsec = 0; + } ts->tv_nsec = tv_nsec; - if ((_PyTime_t)ts->tv_sec != tv_sec) { + if (raise_exc && (res < 0 || res2 < 0)) { pytime_time_t_overflow(); return -1; } return 0; } + +void +_PyTime_AsTimespec_clamp(_PyTime_t t, struct timespec *ts) +{ + (void)pytime_as_timespec(t, ts, 0); +} + +int +_PyTime_AsTimespec(_PyTime_t t, struct timespec *ts) +{ + return pytime_as_timespec(t, ts, 1); +} #endif @@ -918,7 +1004,7 @@ py_get_monotonic_clock(_PyTime_t *tp, _Py_clock_info_t *info, int raise) pytime_overflow(); return -1; } - // Truncate to _PyTime_MAX silently. + // Clamp to _PyTime_MAX silently. *tp = _PyTime_MAX; } else { diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index a45d842ffe73d2..7f04151ca91fdc 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -481,11 +481,7 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, } else if (dt > 0) { _PyTime_t realtime_deadline = _PyTime_GetSystemClock() + dt; - if (_PyTime_AsTimespec(realtime_deadline, &ts) < 0) { - /* Cannot occur thanks to (microseconds > PY_TIMEOUT_MAX) - check done above */ - Py_UNREACHABLE(); - } + _PyTime_AsTimespec_clamp(realtime_deadline, &ts); /* no need to update microseconds value, the code only care if (microseconds > 0 or (microseconds == 0). */ } From d62d925823b005c33b432e527562b573a3a89635 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Sep 2021 03:07:11 +0200 Subject: [PATCH 031/263] bpo-41710: Add pytime_add() and pytime_mul() (GH-28642) Add pytime_add() and pytime_mul() functions to pytime.c to compute t+t2 and t*k with clamping to [_PyTime_MIN; _PyTime_MAX]. Fix pytime.h: _PyTime_FromTimeval() is not implemented on Windows. --- Include/cpython/pytime.h | 8 +- Python/pytime.c | 195 +++++++++++++++++++-------------------- 2 files changed, 101 insertions(+), 102 deletions(-) diff --git a/Include/cpython/pytime.h b/Include/cpython/pytime.h index 04c43ac5d4d6c1..b5a351349f85b3 100644 --- a/Include/cpython/pytime.h +++ b/Include/cpython/pytime.h @@ -125,9 +125,11 @@ PyAPI_FUNC(_PyTime_t) _PyTime_As100Nanoseconds(_PyTime_t t, object. */ PyAPI_FUNC(PyObject *) _PyTime_AsNanosecondsObject(_PyTime_t t); +#ifndef MS_WINDOWS /* Create a timestamp from a timeval structure. Raise an exception and return -1 on overflow, return 0 on success. */ PyAPI_FUNC(int) _PyTime_FromTimeval(_PyTime_t *tp, struct timeval *tv); +#endif /* Convert a timestamp to a timeval structure (microsecond resolution). tv_usec is always positive. @@ -188,7 +190,7 @@ typedef struct { If the internal clock fails, silently ignore the error and return 0. On integer overflow, silently ignore the overflow and clamp the clock to - _PyTime_MIN or _PyTime_MAX. + [_PyTime_MIN; _PyTime_MAX]. Use _PyTime_GetSystemClockWithInfo() to check for failure. */ PyAPI_FUNC(_PyTime_t) _PyTime_GetSystemClock(void); @@ -208,7 +210,7 @@ PyAPI_FUNC(int) _PyTime_GetSystemClockWithInfo( If the internal clock fails, silently ignore the error and return 0. On integer overflow, silently ignore the overflow and clamp the clock to - _PyTime_MIN or _PyTime_MAX. + [_PyTime_MIN; _PyTime_MAX]. Use _PyTime_GetMonotonicClockWithInfo() to check for failure. */ PyAPI_FUNC(_PyTime_t) _PyTime_GetMonotonicClock(void); @@ -239,7 +241,7 @@ PyAPI_FUNC(int) _PyTime_gmtime(time_t t, struct tm *tm); If the internal clock fails, silently ignore the error and return 0. On integer overflow, silently ignore the overflow and clamp the clock to - _PyTime_MIN or _PyTime_MAX. + [_PyTime_MIN; _PyTime_MAX]. Use _PyTime_GetPerfCounterWithInfo() to check for failure. */ PyAPI_FUNC(_PyTime_t) _PyTime_GetPerfCounter(void); diff --git a/Python/pytime.c b/Python/pytime.c index f6ec191b637f0d..1959615f1114bb 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -13,11 +13,6 @@ #endif #endif -#define _PyTime_check_mul_overflow(a, b) \ - (assert(b > 0), \ - (_PyTime_t)(a) < _PyTime_MIN / (_PyTime_t)(b) \ - || _PyTime_MAX / (_PyTime_t)(b) < (_PyTime_t)(a)) - /* To millisecond (10^-3) */ #define SEC_TO_MS 1000 @@ -78,6 +73,49 @@ pytime_as_nanoseconds(_PyTime_t t) } +// Compute t + t2. Clamp to [_PyTime_MIN; _PyTime_MAX] on overflow. +static inline _PyTime_t +pytime_add(_PyTime_t *t, _PyTime_t t2) +{ + if (t2 > 0 && *t > _PyTime_MAX - t2) { + *t = _PyTime_MAX; + return -1; + } + else if (t2 < 0 && *t < _PyTime_MIN - t2) { + *t = _PyTime_MIN; + return -1; + } + else { + *t += t2; + return 0; + } +} + + +static inline int +_PyTime_check_mul_overflow(_PyTime_t a, _PyTime_t b) +{ + assert(b > 0); + return ((a < _PyTime_MIN / b) || (_PyTime_MAX / b < a)); +} + + +// Compute t * k. Clamp to [_PyTime_MIN; _PyTime_MAX] on overflow. +static inline _PyTime_t +pytime_mul(_PyTime_t *t, _PyTime_t k) +{ + assert(k > 0); + if (_PyTime_check_mul_overflow(*t, k)) { + *t = (*t >= 0) ? _PyTime_MAX : _PyTime_MIN; + return -1; + } + else { + *t *= k; + return 0; + } +} + + _PyTime_t _PyTime_MulDiv(_PyTime_t ticks, _PyTime_t mul, _PyTime_t div) { @@ -371,41 +409,25 @@ _PyTime_FromNanosecondsObject(_PyTime_t *tp, PyObject *obj) #ifdef HAVE_CLOCK_GETTIME static int -pytime_fromtimespec(_PyTime_t *tp, struct timespec *ts, int raise) +pytime_fromtimespec(_PyTime_t *tp, struct timespec *ts, int raise_exc) { _PyTime_t t, tv_nsec; - int res = 0; Py_BUILD_ASSERT(sizeof(ts->tv_sec) <= sizeof(_PyTime_t)); t = (_PyTime_t)ts->tv_sec; - if (_PyTime_check_mul_overflow(t, SEC_TO_NS)) { - if (raise) { - pytime_overflow(); - res = -1; - } - t = (t > 0) ? _PyTime_MAX : _PyTime_MIN; - } - else { - t = t * SEC_TO_NS; - } + int res1 = pytime_mul(&t, SEC_TO_NS); tv_nsec = ts->tv_nsec; - /* The following test is written for positive only tv_nsec */ - assert(tv_nsec >= 0); - if (t > _PyTime_MAX - tv_nsec) { - if (raise) { - pytime_overflow(); - res = -1; - } - t = _PyTime_MAX; - } - else { - t += tv_nsec; - } + int res2 = pytime_add(&t, tv_nsec); *tp = pytime_from_nanoseconds(t); - return res; + + if (raise_exc && (res1 < 0 || res2 < 0)) { + pytime_overflow(); + return -1; + } + return 0; } int @@ -416,43 +438,25 @@ _PyTime_FromTimespec(_PyTime_t *tp, struct timespec *ts) #endif -#if !defined(MS_WINDOWS) +#ifndef MS_WINDOWS static int -pytime_fromtimeval(_PyTime_t *tp, struct timeval *tv, int raise) +pytime_fromtimeval(_PyTime_t *tp, struct timeval *tv, int raise_exc) { - _PyTime_t t, usec; - int res = 0; - Py_BUILD_ASSERT(sizeof(tv->tv_sec) <= sizeof(_PyTime_t)); - t = (_PyTime_t)tv->tv_sec; + _PyTime_t t = (_PyTime_t)tv->tv_sec; - if (_PyTime_check_mul_overflow(t, SEC_TO_NS)) { - if (raise) { - pytime_overflow(); - res = -1; - } - t = (t > 0) ? _PyTime_MAX : _PyTime_MIN; - } - else { - t = t * SEC_TO_NS; - } + int res1 = pytime_mul(&t, SEC_TO_NS); - usec = (_PyTime_t)tv->tv_usec * US_TO_NS; - /* The following test is written for positive only usec */ - assert(usec >= 0); - if (t > _PyTime_MAX - usec) { - if (raise) { - pytime_overflow(); - res = -1; - } - t = _PyTime_MAX; - } - else { - t += usec; - } + _PyTime_t usec = (_PyTime_t)tv->tv_usec * US_TO_NS; + int res2 = pytime_add(&t, usec); *tp = pytime_from_nanoseconds(t); - return res; + + if (raise_exc && (res1 < 0 || res2 < 0)) { + pytime_overflow(); + return -1; + } + return 0; } @@ -572,7 +576,7 @@ pytime_divide_round_up(const _PyTime_t t, const _PyTime_t k) assert(k > 1); if (t >= 0) { // Don't use (t + k - 1) / k to avoid integer overflow - // if t=_PyTime_MAX + // if t is equal to _PyTime_MAX _PyTime_t q = t / k; if (t % k) { q += 1; @@ -581,7 +585,7 @@ pytime_divide_round_up(const _PyTime_t t, const _PyTime_t k) } else { // Don't use (t - (k - 1)) / k to avoid integer overflow - // if t=_PyTime_MIN + // if t is equals to _PyTime_MIN. _PyTime_t q = t / k; if (t % k) { q -= 1; @@ -804,14 +808,14 @@ _PyTime_AsTimespec(_PyTime_t t, struct timespec *ts) static int -py_get_system_clock(_PyTime_t *tp, _Py_clock_info_t *info, int raise) +py_get_system_clock(_PyTime_t *tp, _Py_clock_info_t *info, int raise_exc) { + assert(info == NULL || raise_exc); + #ifdef MS_WINDOWS FILETIME system_time; ULARGE_INTEGER large; - assert(info == NULL || raise); - GetSystemTimeAsFileTime(&system_time); large.u.LowPart = system_time.dwLowDateTime; large.u.HighPart = system_time.dwHighDateTime; @@ -846,8 +850,6 @@ py_get_system_clock(_PyTime_t *tp, _Py_clock_info_t *info, int raise) struct timeval tv; #endif - assert(info == NULL || raise); - #ifdef HAVE_CLOCK_GETTIME #ifdef HAVE_CLOCK_GETTIME_RUNTIME @@ -856,12 +858,12 @@ py_get_system_clock(_PyTime_t *tp, _Py_clock_info_t *info, int raise) err = clock_gettime(CLOCK_REALTIME, &ts); if (err) { - if (raise) { + if (raise_exc) { PyErr_SetFromErrno(PyExc_OSError); } return -1; } - if (pytime_fromtimespec(tp, &ts, raise) < 0) { + if (pytime_fromtimespec(tp, &ts, raise_exc) < 0) { return -1; } @@ -890,12 +892,12 @@ py_get_system_clock(_PyTime_t *tp, _Py_clock_info_t *info, int raise) /* test gettimeofday() */ err = gettimeofday(&tv, (struct timezone *)NULL); if (err) { - if (raise) { + if (raise_exc) { PyErr_SetFromErrno(PyExc_OSError); } return -1; } - if (pytime_fromtimeval(tp, &tv, raise) < 0) { + if (pytime_fromtimeval(tp, &tv, raise_exc) < 0) { return -1; } @@ -987,28 +989,21 @@ py_mach_timebase_info(_PyTime_t *pnumer, _PyTime_t *pdenom, int raise) static int -py_get_monotonic_clock(_PyTime_t *tp, _Py_clock_info_t *info, int raise) +py_get_monotonic_clock(_PyTime_t *tp, _Py_clock_info_t *info, int raise_exc) { -#if defined(MS_WINDOWS) - ULONGLONG ticks; - _PyTime_t t; - - assert(info == NULL || raise); + assert(info == NULL || raise_exc); - ticks = GetTickCount64(); +#if defined(MS_WINDOWS) + ULONGLONG ticks = GetTickCount64(); Py_BUILD_ASSERT(sizeof(ticks) <= sizeof(_PyTime_t)); - t = (_PyTime_t)ticks; + _PyTime_t t = (_PyTime_t)ticks; - if (_PyTime_check_mul_overflow(t, MS_TO_NS)) { - if (raise) { - pytime_overflow(); - return -1; - } - // Clamp to _PyTime_MAX silently. - *tp = _PyTime_MAX; - } - else { - *tp = t * MS_TO_NS; + int res = pytime_mul(&t, MS_TO_NS); + *tp = t; + + if (raise_exc && res < 0) { + pytime_overflow(); + return -1; } if (info) { @@ -1030,7 +1025,7 @@ py_get_monotonic_clock(_PyTime_t *tp, _Py_clock_info_t *info, int raise) static _PyTime_t timebase_numer = 0; static _PyTime_t timebase_denom = 0; if (timebase_denom == 0) { - if (py_mach_timebase_info(&timebase_numer, &timebase_denom, raise) < 0) { + if (py_mach_timebase_info(&timebase_numer, &timebase_denom, raise_exc) < 0) { return -1; } } @@ -1055,7 +1050,7 @@ py_get_monotonic_clock(_PyTime_t *tp, _Py_clock_info_t *info, int raise) time = gethrtime(); if (time == -1) { - if (raise) { + if (raise_exc) { PyErr_SetFromErrno(PyExc_OSError); } return -1; @@ -1071,7 +1066,7 @@ py_get_monotonic_clock(_PyTime_t *tp, _Py_clock_info_t *info, int raise) } #else - struct timespec ts; + #ifdef CLOCK_HIGHRES const clockid_t clk_id = CLOCK_HIGHRES; const char *implementation = "clock_gettime(CLOCK_HIGHRES)"; @@ -1080,30 +1075,30 @@ py_get_monotonic_clock(_PyTime_t *tp, _Py_clock_info_t *info, int raise) const char *implementation = "clock_gettime(CLOCK_MONOTONIC)"; #endif - assert(info == NULL || raise); - + struct timespec ts; if (clock_gettime(clk_id, &ts) != 0) { - if (raise) { + if (raise_exc) { PyErr_SetFromErrno(PyExc_OSError); return -1; } return -1; } + if (pytime_fromtimespec(tp, &ts, raise_exc) < 0) { + return -1; + } + if (info) { - struct timespec res; info->monotonic = 1; info->implementation = implementation; info->adjustable = 0; + struct timespec res; if (clock_getres(clk_id, &res) != 0) { PyErr_SetFromErrno(PyExc_OSError); return -1; } info->resolution = res.tv_sec + res.tv_nsec * 1e-9; } - if (pytime_fromtimespec(tp, &ts, raise) < 0) { - return -1; - } #endif return 0; } @@ -1169,6 +1164,8 @@ py_win_perf_counter_frequency(LONGLONG *pfrequency, int raise) static int py_get_win_perf_counter(_PyTime_t *tp, _Py_clock_info_t *info, int raise) { + assert(info == NULL || raise_exc); + static LONGLONG frequency = 0; if (frequency == 0) { if (py_win_perf_counter_frequency(&frequency, raise) < 0) { From 0231b6da45b610d33ee4e99bf190e31488d6ab26 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Sep 2021 03:50:29 +0200 Subject: [PATCH 032/263] bpo-41710: Fix building pytime.c on Windows (GH-28644) --- Python/pytime.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Python/pytime.c b/Python/pytime.c index 1959615f1114bb..7fd03ea576d271 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -74,7 +74,7 @@ pytime_as_nanoseconds(_PyTime_t t) // Compute t + t2. Clamp to [_PyTime_MIN; _PyTime_MAX] on overflow. -static inline _PyTime_t +static inline int pytime_add(_PyTime_t *t, _PyTime_t t2) { if (t2 > 0 && *t > _PyTime_MAX - t2) { @@ -101,7 +101,7 @@ _PyTime_check_mul_overflow(_PyTime_t a, _PyTime_t b) // Compute t * k. Clamp to [_PyTime_MIN; _PyTime_MAX] on overflow. -static inline _PyTime_t +static inline int pytime_mul(_PyTime_t *t, _PyTime_t k) { assert(k > 0); @@ -1162,13 +1162,13 @@ py_win_perf_counter_frequency(LONGLONG *pfrequency, int raise) static int -py_get_win_perf_counter(_PyTime_t *tp, _Py_clock_info_t *info, int raise) +py_get_win_perf_counter(_PyTime_t *tp, _Py_clock_info_t *info, int raise_exc) { assert(info == NULL || raise_exc); static LONGLONG frequency = 0; if (frequency == 0) { - if (py_win_perf_counter_frequency(&frequency, raise) < 0) { + if (py_win_perf_counter_frequency(&frequency, raise_exc) < 0) { return -1; } } @@ -1194,7 +1194,7 @@ py_get_win_perf_counter(_PyTime_t *tp, _Py_clock_info_t *info, int raise) *tp = pytime_from_nanoseconds(ns); return 0; } -#endif +#endif // MS_WINDOWS int From a1437170039dc2c07e6040d3a8ba8d91434b730d Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Thu, 30 Sep 2021 12:36:16 +0900 Subject: [PATCH 033/263] Fix EncodingWarning in freeze_modules. (GH-28591) --- Tools/scripts/freeze_modules.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Tools/scripts/freeze_modules.py b/Tools/scripts/freeze_modules.py index f7273915b911e2..ea96253df3e493 100644 --- a/Tools/scripts/freeze_modules.py +++ b/Tools/scripts/freeze_modules.py @@ -329,10 +329,10 @@ def _iter_sources(modules): # generic helpers def _get_checksum(filename): - with open(filename) as infile: - text = infile.read() + with open(filename, "rb") as infile: + contents = infile.read() m = hashlib.sha256() - m.update(text.encode('utf8')) + m.update(contents) return m.hexdigest() @@ -489,7 +489,7 @@ def regen_manifest(modules): modlines.append(' '.join(row).rstrip()) print(f'# Updating {os.path.relpath(MANIFEST)}') - with open(MANIFEST, 'w') as outfile: + with open(MANIFEST, 'w', encoding="utf-8") as outfile: lines = (l + '\n' for l in modlines) outfile.writelines(lines) From 37b8294d6295ca12553fd7c98778be71d24f4b24 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Sep 2021 10:16:51 +0200 Subject: [PATCH 034/263] bpo-41710: PyThread_acquire_lock_timed() clamps the timout (GH-28643) PyThread_acquire_lock_timed() now clamps the timeout into the [_PyTime_MIN; _PyTime_MAX] range (_PyTime_t type) if it is too large, rather than calling Py_FatalError() which aborts the process. PyThread_acquire_lock_timed() no longer uses MICROSECONDS_TO_TIMESPEC() to compute sem_timedwait() argument, but _PyTime_GetSystemClock() and _PyTime_AsTimespec_truncate(). Fix _thread.TIMEOUT_MAX value on Windows: the maximum timeout is 0x7FFFFFFF milliseconds (around 24.9 days), not 0xFFFFFFFF milliseconds (around 49.7 days). Set PY_TIMEOUT_MAX to 0x7FFFFFFF milliseconds, rather than 0xFFFFFFFF milliseconds. Fix PY_TIMEOUT_MAX overflow test: replace (us >= PY_TIMEOUT_MAX) with (us > PY_TIMEOUT_MAX). --- Include/cpython/pytime.h | 2 + Include/pythread.h | 8 ++- .../2021-09-30-03-14-35.bpo-41710.DDWJKx.rst | 2 + .../2021-09-30-08-57-50.bpo-41710.JMsPAW.rst | 3 + Modules/_queuemodule.c | 2 +- Modules/_threadmodule.c | 2 +- Modules/faulthandler.c | 2 +- Python/thread_nt.h | 22 +++++-- Python/thread_pthread.h | 63 ++++++++++--------- 9 files changed, 67 insertions(+), 39 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2021-09-30-03-14-35.bpo-41710.DDWJKx.rst create mode 100644 Misc/NEWS.d/next/Library/2021-09-30-08-57-50.bpo-41710.JMsPAW.rst diff --git a/Include/cpython/pytime.h b/Include/cpython/pytime.h index b5a351349f85b3..db3adfab6a9aba 100644 --- a/Include/cpython/pytime.h +++ b/Include/cpython/pytime.h @@ -14,7 +14,9 @@ extern "C" { store a duration, and so indirectly a date (related to another date, like UNIX epoch). */ typedef int64_t _PyTime_t; +// _PyTime_MIN nanoseconds is around -292.3 years #define _PyTime_MIN INT64_MIN +// _PyTime_MAX nanoseconds is around +292.3 years #define _PyTime_MAX INT64_MAX #define _SIZEOF_PYTIME_T 8 diff --git a/Include/pythread.h b/Include/pythread.h index bb9d86412218ad..cf4cc9a7473f1a 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -61,9 +61,11 @@ PyAPI_FUNC(int) _PyThread_at_fork_reinit(PyThread_type_lock *lock); convert microseconds to nanoseconds. */ # define PY_TIMEOUT_MAX (LLONG_MAX / 1000) #elif defined (NT_THREADS) - /* In the NT API, the timeout is a DWORD and is expressed in milliseconds */ -# if 0xFFFFFFFFLL * 1000 < LLONG_MAX -# define PY_TIMEOUT_MAX (0xFFFFFFFFLL * 1000) + /* In the NT API, the timeout is a DWORD and is expressed in milliseconds, + * a positive number between 0 and 0x7FFFFFFF (see WaitForSingleObject() + * documentation). */ +# if 0x7FFFFFFFLL * 1000 < LLONG_MAX +# define PY_TIMEOUT_MAX (0x7FFFFFFFLL * 1000) # else # define PY_TIMEOUT_MAX LLONG_MAX # endif diff --git a/Misc/NEWS.d/next/C API/2021-09-30-03-14-35.bpo-41710.DDWJKx.rst b/Misc/NEWS.d/next/C API/2021-09-30-03-14-35.bpo-41710.DDWJKx.rst new file mode 100644 index 00000000000000..902c7cc8f2b99f --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-09-30-03-14-35.bpo-41710.DDWJKx.rst @@ -0,0 +1,2 @@ +The PyThread_acquire_lock_timed() function now clamps the timeout if it is +too large, rather than aborting the process. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-09-30-08-57-50.bpo-41710.JMsPAW.rst b/Misc/NEWS.d/next/Library/2021-09-30-08-57-50.bpo-41710.JMsPAW.rst new file mode 100644 index 00000000000000..516214a619e8eb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-09-30-08-57-50.bpo-41710.JMsPAW.rst @@ -0,0 +1,3 @@ +Fix :data:`_thread.TIMEOUT_MAX` value on Windows: the maximum timeout is +0x7FFFFFFF milliseconds (around 24.9 days), not 0xFFFFFFFF milliseconds (around +49.7 days). diff --git a/Modules/_queuemodule.c b/Modules/_queuemodule.c index 58772d7f0f5234..b6769e6b7764ef 100644 --- a/Modules/_queuemodule.c +++ b/Modules/_queuemodule.c @@ -223,7 +223,7 @@ _queue_SimpleQueue_get_impl(simplequeueobject *self, PyTypeObject *cls, } microseconds = _PyTime_AsMicroseconds(timeout_val, _PyTime_ROUND_CEILING); - if (microseconds >= PY_TIMEOUT_MAX) { + if (microseconds > PY_TIMEOUT_MAX) { PyErr_SetString(PyExc_OverflowError, "timeout value is too large"); return NULL; diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 5b5d2c5b03ec3f..fa7e6d0e09d182 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -164,7 +164,7 @@ lock_acquire_parse_args(PyObject *args, PyObject *kwds, _PyTime_t microseconds; microseconds = _PyTime_AsMicroseconds(*timeout, _PyTime_ROUND_TIMEOUT); - if (microseconds >= PY_TIMEOUT_MAX) { + if (microseconds > PY_TIMEOUT_MAX) { PyErr_SetString(PyExc_OverflowError, "timeout value is too large"); return -1; diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 350f4cf6b8edff..868b4f4f42de68 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -710,7 +710,7 @@ faulthandler_dump_traceback_later(PyObject *self, return NULL; } /* Limit to LONG_MAX seconds for format_timeout() */ - if (timeout_us >= PY_TIMEOUT_MAX || timeout_us / SEC_TO_US >= LONG_MAX) { + if (timeout_us > PY_TIMEOUT_MAX || timeout_us / SEC_TO_US > LONG_MAX) { PyErr_SetString(PyExc_OverflowError, "timeout value is too large"); return NULL; diff --git a/Python/thread_nt.h b/Python/thread_nt.h index f8c098ca5238a8..0beb3d3af2fd35 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -292,6 +292,10 @@ PyThread_free_lock(PyThread_type_lock aLock) FreeNonRecursiveMutex(aLock) ; } +// WaitForSingleObject() documentation: "The time-out value needs to be a +// positive number between 0 and 0x7FFFFFFF." INFINITE is equal to 0xFFFFFFFF. +const DWORD TIMEOUT_MS_MAX = 0x7FFFFFFF; + /* * Return 1 on success if the lock was acquired * @@ -309,10 +313,20 @@ PyThread_acquire_lock_timed(PyThread_type_lock aLock, if (microseconds >= 0) { milliseconds = microseconds / 1000; - if (microseconds % 1000 > 0) - ++milliseconds; - if (milliseconds > PY_DWORD_MAX) { - Py_FatalError("Timeout larger than PY_TIMEOUT_MAX"); + // Round milliseconds away from zero + if (microseconds % 1000 > 0) { + milliseconds++; + } + if (milliseconds > (PY_TIMEOUT_T)TIMEOUT_MS_MAX) { + // bpo-41710: PyThread_acquire_lock_timed() cannot report timeout + // overflow to the caller, so clamp the timeout to + // [0, TIMEOUT_MS_MAX] milliseconds. + // + // TIMEOUT_MS_MAX milliseconds is around 24.9 days. + // + // _thread.Lock.acquire() and _thread.RLock.acquire() raise an + // OverflowError if microseconds is greater than PY_TIMEOUT_MAX. + milliseconds = TIMEOUT_MS_MAX; } } else { diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 7f04151ca91fdc..3815ffae20c017 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -433,33 +433,47 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, PyLockStatus success; sem_t *thelock = (sem_t *)lock; int status, error = 0; - struct timespec ts; - _PyTime_t deadline = 0; (void) error; /* silence unused-but-set-variable warning */ dprintf(("PyThread_acquire_lock_timed(%p, %lld, %d) called\n", lock, microseconds, intr_flag)); - if (microseconds > PY_TIMEOUT_MAX) { - Py_FatalError("Timeout larger than PY_TIMEOUT_MAX"); + _PyTime_t timeout; + if (microseconds >= 0) { + _PyTime_t ns; + if (microseconds <= _PyTime_MAX / 1000) { + ns = microseconds * 1000; + } + else { + // bpo-41710: PyThread_acquire_lock_timed() cannot report timeout + // overflow to the caller, so clamp the timeout to + // [_PyTime_MIN, _PyTime_MAX]. + // + // _PyTime_MAX nanoseconds is around 292.3 years. + // + // _thread.Lock.acquire() and _thread.RLock.acquire() raise an + // OverflowError if microseconds is greater than PY_TIMEOUT_MAX. + ns = _PyTime_MAX; + } + timeout = _PyTime_FromNanoseconds(ns); + } + else { + timeout = _PyTime_FromNanoseconds(-1); } - if (microseconds > 0) { - MICROSECONDS_TO_TIMESPEC(microseconds, ts); - - if (!intr_flag) { - /* cannot overflow thanks to (microseconds > PY_TIMEOUT_MAX) - check done above */ - _PyTime_t timeout = _PyTime_FromNanoseconds(microseconds * 1000); - deadline = _PyTime_GetMonotonicClock() + timeout; - } + _PyTime_t deadline = 0; + if (timeout > 0 && !intr_flag) { + deadline = _PyTime_GetMonotonicClock() + timeout; } while (1) { - if (microseconds > 0) { + if (timeout > 0) { + _PyTime_t t = _PyTime_GetSystemClock() + timeout; + struct timespec ts; + _PyTime_AsTimespec_clamp(t, &ts); status = fix_status(sem_timedwait(thelock, &ts)); } - else if (microseconds == 0) { + else if (timeout == 0) { status = fix_status(sem_trywait(thelock)); } else { @@ -472,32 +486,23 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, break; } - if (microseconds > 0) { + if (timeout > 0) { /* wait interrupted by a signal (EINTR): recompute the timeout */ - _PyTime_t dt = deadline - _PyTime_GetMonotonicClock(); - if (dt < 0) { + _PyTime_t timeout = deadline - _PyTime_GetMonotonicClock(); + if (timeout < 0) { status = ETIMEDOUT; break; } - else if (dt > 0) { - _PyTime_t realtime_deadline = _PyTime_GetSystemClock() + dt; - _PyTime_AsTimespec_clamp(realtime_deadline, &ts); - /* no need to update microseconds value, the code only care - if (microseconds > 0 or (microseconds == 0). */ - } - else { - microseconds = 0; - } } } /* Don't check the status if we're stopping because of an interrupt. */ if (!(intr_flag && status == EINTR)) { - if (microseconds > 0) { + if (timeout > 0) { if (status != ETIMEDOUT) CHECK_STATUS("sem_timedwait"); } - else if (microseconds == 0) { + else if (timeout == 0) { if (status != EAGAIN) CHECK_STATUS("sem_trywait"); } From b34dd58fee707b8044beaf878962a6fa12b304dc Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Sep 2021 11:23:03 +0200 Subject: [PATCH 035/263] bpo-41710: Document _PyTime_t API in pytime.h (GH-28647) --- Include/cpython/pytime.h | 41 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/Include/cpython/pytime.h b/Include/cpython/pytime.h index db3adfab6a9aba..5440720f1ba714 100644 --- a/Include/cpython/pytime.h +++ b/Include/cpython/pytime.h @@ -1,3 +1,44 @@ +// The _PyTime_t API is written to use timestamp and timeout values stored in +// various formats and to read clocks. +// +// The _PyTime_t type is an integer to support directly common arithmetic +// operations like t1 + t2. +// +// The _PyTime_t API supports a resolution of 1 nanosecond. The _PyTime_t type +// is signed to support negative timestamps. The supported range is around +// [-292.3 years; +292.3 years]. Using the Unix epoch (January 1st, 1970), the +// supported date range is around [1677-09-21; 2262-04-11]. +// +// Formats: +// +// * seconds +// * seconds as a floating pointer number (C double) +// * milliseconds (10^-3 seconds) +// * microseconds (10^-6 seconds) +// * 100 nanoseconds (10^-7 seconds) +// * nanoseconds (10^-9 seconds) +// * timeval structure, 1 microsecond resolution (10^-6 seconds) +// * timespec structure, 1 nanosecond resolution (10^-9 seconds) +// +// Integer overflows are detected and raise OverflowError. Conversion to a +// resolution worse than 1 nanosecond is rounded correctly with the requested +// rounding mode. There are 4 rounding modes: floor (towards -inf), ceiling +// (towards +inf), half even and up (away from zero). +// +// Some functions clamp the result in the range [_PyTime_MIN; _PyTime_MAX], so +// the caller doesn't have to handle errors and doesn't need to hold the GIL. +// +// Clocks: +// +// * System clock +// * Monotonic clock +// * Performance counter +// +// Operations like (t * k / q) with integers are implemented in a way to reduce +// the risk of integer overflow. Such operation is used to convert a clock +// value expressed in ticks with a frequency to _PyTime_t, like +// QueryPerformanceCounter() with QueryPerformanceFrequency(). + #ifndef Py_LIMITED_API #ifndef Py_PYTIME_H #define Py_PYTIME_H From b07fddd527efe67174ce6b0fdbe8dac390b16e4e Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Thu, 30 Sep 2021 14:46:26 +0100 Subject: [PATCH 036/263] Revert "bpo-45229: Make datetime tests discoverable (GH-28615)" (GH-28650) This reverts commit d441437ee71ae174c008c23308b749b91020ba77. --- Lib/test/test_datetime.py | 92 ++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/Lib/test/test_datetime.py b/Lib/test/test_datetime.py index 7f9094fa7bd4e6..bdb9f02e5756a2 100644 --- a/Lib/test/test_datetime.py +++ b/Lib/test/test_datetime.py @@ -1,57 +1,59 @@ import unittest import sys +from test.support import run_unittest from test.support.import_helper import import_fresh_module TESTS = 'test.datetimetester' -def load_tests(loader, tests, pattern): - try: - pure_tests = import_fresh_module(TESTS, fresh=['datetime', '_strptime'], - blocked=['_datetime']) - fast_tests = import_fresh_module(TESTS, fresh=['datetime', - '_datetime', '_strptime']) - finally: - # XXX: import_fresh_module() is supposed to leave sys.module cache untouched, - # XXX: but it does not, so we have to cleanup ourselves. - for modname in ['datetime', '_datetime', '_strptime']: - sys.modules.pop(modname, None) +try: + pure_tests = import_fresh_module(TESTS, fresh=['datetime', '_strptime'], + blocked=['_datetime']) + fast_tests = import_fresh_module(TESTS, fresh=['datetime', + '_datetime', '_strptime']) +finally: + # XXX: import_fresh_module() is supposed to leave sys.module cache untouched, + # XXX: but it does not, so we have to cleanup ourselves. + for modname in ['datetime', '_datetime', '_strptime']: + sys.modules.pop(modname, None) +test_modules = [pure_tests, fast_tests] +test_suffixes = ["_Pure", "_Fast"] +# XXX(gb) First run all the _Pure tests, then all the _Fast tests. You might +# not believe this, but in spite of all the sys.modules trickery running a _Pure +# test last will leave a mix of pure and native datetime stuff lying around. +all_test_classes = [] - test_modules = [pure_tests, fast_tests] - test_suffixes = ["_Pure", "_Fast"] - # XXX(gb) First run all the _Pure tests, then all the _Fast tests. You might - # not believe this, but in spite of all the sys.modules trickery running a _Pure - # test last will leave a mix of pure and native datetime stuff lying around. - for module, suffix in zip(test_modules, test_suffixes): - test_classes = [] - for name, cls in module.__dict__.items(): - if not isinstance(cls, type): - continue - if issubclass(cls, unittest.TestCase): - test_classes.append(cls) - elif issubclass(cls, unittest.TestSuite): - suit = cls() - test_classes.extend(type(test) for test in suit) - test_classes = sorted(set(test_classes), key=lambda cls: cls.__qualname__) - for cls in test_classes: - cls.__name__ += suffix - cls.__qualname__ += suffix - @classmethod - def setUpClass(cls_, module=module): - cls_._save_sys_modules = sys.modules.copy() - sys.modules[TESTS] = module - sys.modules['datetime'] = module.datetime_module - sys.modules['_strptime'] = module._strptime - @classmethod - def tearDownClass(cls_): - sys.modules.clear() - sys.modules.update(cls_._save_sys_modules) - cls.setUpClass = setUpClass - cls.tearDownClass = tearDownClass - tests.addTests(loader.loadTestsFromTestCase(cls)) - return tests +for module, suffix in zip(test_modules, test_suffixes): + test_classes = [] + for name, cls in module.__dict__.items(): + if not isinstance(cls, type): + continue + if issubclass(cls, unittest.TestCase): + test_classes.append(cls) + elif issubclass(cls, unittest.TestSuite): + suit = cls() + test_classes.extend(type(test) for test in suit) + test_classes = sorted(set(test_classes), key=lambda cls: cls.__qualname__) + for cls in test_classes: + cls.__name__ += suffix + cls.__qualname__ += suffix + @classmethod + def setUpClass(cls_, module=module): + cls_._save_sys_modules = sys.modules.copy() + sys.modules[TESTS] = module + sys.modules['datetime'] = module.datetime_module + sys.modules['_strptime'] = module._strptime + @classmethod + def tearDownClass(cls_): + sys.modules.clear() + sys.modules.update(cls_._save_sys_modules) + cls.setUpClass = setUpClass + cls.tearDownClass = tearDownClass + all_test_classes.extend(test_classes) +def test_main(): + run_unittest(*all_test_classes) if __name__ == "__main__": - unittest.main() + test_main() From ec4d917a6a68824f1895f75d113add9410283da7 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 30 Sep 2021 19:20:39 +0300 Subject: [PATCH 037/263] bpo-40173: Fix test.support.import_helper.import_fresh_module() (GH-28654) * Work correctly if an additional fresh module imports other additional fresh module which imports a blocked module. * Raises ImportError if the specified module cannot be imported while all additional fresh modules are successfully imported. * Support blocking packages. * Always restore the import state of fresh and blocked modules and their submodules. * Fix test_decimal and test_xml_etree which depended on an undesired side effect of import_fresh_module(). --- Lib/test/support/import_helper.py | 67 +++++++------------ Lib/test/test_decimal.py | 2 +- Lib/test/test_xml_etree.py | 13 ++-- .../2021-09-30-16-54-39.bpo-40173.J_slCw.rst | 2 + 4 files changed, 32 insertions(+), 52 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2021-09-30-16-54-39.bpo-40173.J_slCw.rst diff --git a/Lib/test/support/import_helper.py b/Lib/test/support/import_helper.py index 10f745aa6b1448..9bce29895249ae 100644 --- a/Lib/test/support/import_helper.py +++ b/Lib/test/support/import_helper.py @@ -81,33 +81,13 @@ def import_module(name, deprecated=False, *, required_on=()): raise unittest.SkipTest(str(msg)) -def _save_and_remove_module(name, orig_modules): - """Helper function to save and remove a module from sys.modules - - Raise ImportError if the module can't be imported. - """ - # try to import the module and raise an error if it can't be imported - if name not in sys.modules: - __import__(name) - del sys.modules[name] +def _save_and_remove_modules(names): + orig_modules = {} + prefixes = tuple(name + '.' for name in names) for modname in list(sys.modules): - if modname == name or modname.startswith(name + '.'): - orig_modules[modname] = sys.modules[modname] - del sys.modules[modname] - - -def _save_and_block_module(name, orig_modules): - """Helper function to save and block a module in sys.modules - - Return True if the module was in sys.modules, False otherwise. - """ - saved = True - try: - orig_modules[name] = sys.modules[name] - except KeyError: - saved = False - sys.modules[name] = None - return saved + if modname in names or modname.startswith(prefixes): + orig_modules[modname] = sys.modules.pop(modname) + return orig_modules @contextlib.contextmanager @@ -136,7 +116,8 @@ def import_fresh_module(name, fresh=(), blocked=(), *, this operation. *fresh* is an iterable of additional module names that are also removed - from the sys.modules cache before doing the import. + from the sys.modules cache before doing the import. If one of these + modules can't be imported, None is returned. *blocked* is an iterable of module names that are replaced with None in the module cache during the import to ensure that attempts to import @@ -160,25 +141,25 @@ def import_fresh_module(name, fresh=(), blocked=(), *, with _ignore_deprecated_imports(deprecated): # Keep track of modules saved for later restoration as well # as those which just need a blocking entry removed - orig_modules = {} - names_to_remove = [] - _save_and_remove_module(name, orig_modules) + fresh = list(fresh) + blocked = list(blocked) + names = {name, *fresh, *blocked} + orig_modules = _save_and_remove_modules(names) + for modname in blocked: + sys.modules[modname] = None + try: - for fresh_name in fresh: - _save_and_remove_module(fresh_name, orig_modules) - for blocked_name in blocked: - if not _save_and_block_module(blocked_name, orig_modules): - names_to_remove.append(blocked_name) with frozen_modules(usefrozen): - fresh_module = importlib.import_module(name) - except ImportError: - fresh_module = None + # Return None when one of the "fresh" modules can not be imported. + try: + for modname in fresh: + __import__(modname) + except ImportError: + return None + return importlib.import_module(name) finally: - for orig_name, module in orig_modules.items(): - sys.modules[orig_name] = module - for name_to_remove in names_to_remove: - del sys.modules[name_to_remove] - return fresh_module + _save_and_remove_modules(names) + sys.modules.update(orig_modules) class CleanImport(object): diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py index 99263bb13b0d14..b6173a5ffec96c 100644 --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -62,7 +62,7 @@ C = import_fresh_module('decimal', fresh=['_decimal']) P = import_fresh_module('decimal', blocked=['_decimal']) -orig_sys_decimal = sys.modules['decimal'] +import decimal as orig_sys_decimal # fractions module must import the correct decimal module. cfractions = import_fresh_module('fractions', fresh=['fractions']) diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index c79b5462b931df..5a8824a78ffa4b 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -26,7 +26,7 @@ from test import support from test.support import os_helper from test.support import warnings_helper -from test.support import findfile, gc_collect, swap_attr +from test.support import findfile, gc_collect, swap_attr, swap_item from test.support.import_helper import import_fresh_module from test.support.os_helper import TESTFN @@ -167,12 +167,11 @@ def setUpClass(cls): cls.modules = {pyET, ET} def pickleRoundTrip(self, obj, name, dumper, loader, proto): - save_m = sys.modules[name] try: - sys.modules[name] = dumper - temp = pickle.dumps(obj, proto) - sys.modules[name] = loader - result = pickle.loads(temp) + with swap_item(sys.modules, name, dumper): + temp = pickle.dumps(obj, proto) + with swap_item(sys.modules, name, loader): + result = pickle.loads(temp) except pickle.PicklingError as pe: # pyET must be second, because pyET may be (equal to) ET. human = dict([(ET, "cET"), (pyET, "pyET")]) @@ -180,8 +179,6 @@ def pickleRoundTrip(self, obj, name, dumper, loader, proto): % (obj, human.get(dumper, dumper), human.get(loader, loader))) from pe - finally: - sys.modules[name] = save_m return result def assertEqualElements(self, alice, bob): diff --git a/Misc/NEWS.d/next/Tests/2021-09-30-16-54-39.bpo-40173.J_slCw.rst b/Misc/NEWS.d/next/Tests/2021-09-30-16-54-39.bpo-40173.J_slCw.rst new file mode 100644 index 00000000000000..21671473c16ccd --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2021-09-30-16-54-39.bpo-40173.J_slCw.rst @@ -0,0 +1,2 @@ +Fix :func:`test.support.import_helper.import_fresh_module`. + From 7e5c107541726b90d3f2e6e69ef37180cf58335d Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Thu, 30 Sep 2021 18:38:52 -0600 Subject: [PATCH 038/263] bpo-45020: Add more test cases for frozen modules. (gh-28664) I've added a number of test-only modules. Some of those cases are covered by the recently frozen stdlib modules (and some will be once we add encodings back in). However, I figured we'd play it safe by having a set of modules guaranteed to be there during tests. https://bugs.python.org/issue45020 --- Lib/__phello__.foo.py | 1 - Lib/__phello__/__init__.py | 7 ++ Lib/__phello__/ham/__init__.py | 0 Lib/__phello__/ham/eggs.py | 0 Lib/__phello__/spam.py | 7 ++ Lib/test/test_frozen.py | 28 +++++++ Lib/test/test_importlib/frozen/test_finder.py | 79 ++++++++++++++++--- Makefile.pre.in | 29 ++++++- PCbuild/_freeze_module.vcxproj | 25 ++++++ PCbuild/_freeze_module.vcxproj.filters | 15 ++++ Python/frozen.c | 20 ++++- Tools/scripts/freeze_modules.py | 15 ++-- Tools/scripts/generate_stdlib_module_names.py | 3 + 13 files changed, 205 insertions(+), 24 deletions(-) delete mode 100644 Lib/__phello__.foo.py create mode 100644 Lib/__phello__/__init__.py create mode 100644 Lib/__phello__/ham/__init__.py create mode 100644 Lib/__phello__/ham/eggs.py create mode 100644 Lib/__phello__/spam.py diff --git a/Lib/__phello__.foo.py b/Lib/__phello__.foo.py deleted file mode 100644 index 8e8623ee1daacb..00000000000000 --- a/Lib/__phello__.foo.py +++ /dev/null @@ -1 +0,0 @@ -# This file exists as a helper for the test.test_frozen module. diff --git a/Lib/__phello__/__init__.py b/Lib/__phello__/__init__.py new file mode 100644 index 00000000000000..d37bd2766ac1c6 --- /dev/null +++ b/Lib/__phello__/__init__.py @@ -0,0 +1,7 @@ +initialized = True + +def main(): + print("Hello world!") + +if __name__ == '__main__': + main() diff --git a/Lib/__phello__/ham/__init__.py b/Lib/__phello__/ham/__init__.py new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/Lib/__phello__/ham/eggs.py b/Lib/__phello__/ham/eggs.py new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/Lib/__phello__/spam.py b/Lib/__phello__/spam.py new file mode 100644 index 00000000000000..d37bd2766ac1c6 --- /dev/null +++ b/Lib/__phello__/spam.py @@ -0,0 +1,7 @@ +initialized = True + +def main(): + print("Hello world!") + +if __name__ == '__main__': + main() diff --git a/Lib/test/test_frozen.py b/Lib/test/test_frozen.py index 3d212b9202f90a..029fd068793c30 100644 --- a/Lib/test/test_frozen.py +++ b/Lib/test/test_frozen.py @@ -10,6 +10,7 @@ # Invalid marshalled data in frozen.c could case the interpreter to # crash when __hello__ is imported. +import importlib.machinery import sys import unittest from test.support import captured_stdout, import_helper @@ -26,6 +27,33 @@ def test_frozen(self): __hello__.main() self.assertEqual(out.getvalue(), 'Hello world!\n') + def test_frozen_submodule_in_unfrozen_package(self): + with import_helper.CleanImport('__phello__', '__phello__.spam'): + with import_helper.frozen_modules(enabled=False): + import __phello__ + with import_helper.frozen_modules(enabled=True): + import __phello__.spam as spam + self.assertIs(spam, __phello__.spam) + self.assertIsNot(__phello__.__spec__.loader, + importlib.machinery.FrozenImporter) + self.assertIs(spam.__spec__.loader, + importlib.machinery.FrozenImporter) + + # This is not possible until frozen packages have __path__ set properly. + # See https://bugs.python.org/issue21736. + @unittest.expectedFailure + def test_unfrozen_submodule_in_frozen_package(self): + with import_helper.CleanImport('__phello__', '__phello__.spam'): + with import_helper.frozen_modules(enabled=True): + import __phello__ + with import_helper.frozen_modules(enabled=False): + import __phello__.spam as spam + self.assertIs(spam, __phello__.spam) + self.assertIs(__phello__.__spec__.loader, + importlib.machinery.FrozenImporter) + self.assertIsNot(spam.__spec__.loader, + importlib.machinery.FrozenImporter) + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_importlib/frozen/test_finder.py b/Lib/test/test_importlib/frozen/test_finder.py index fbc3fc0d547ff7..7d43fb0ff3e11e 100644 --- a/Lib/test/test_importlib/frozen/test_finder.py +++ b/Lib/test/test_importlib/frozen/test_finder.py @@ -1,4 +1,5 @@ from .. import abc +import os.path from .. import util machinery = util.import_importlib('importlib.machinery') @@ -13,34 +14,86 @@ class FindSpecTests(abc.FinderTests): """Test finding frozen modules.""" - def find(self, name, path=None): + def find(self, name, **kwargs): finder = self.machinery.FrozenImporter with import_helper.frozen_modules(): - return finder.find_spec(name, path) + return finder.find_spec(name, **kwargs) - def test_module(self): - name = '__hello__' - spec = self.find(name) + def check(self, spec, name): + self.assertEqual(spec.name, name) + self.assertIs(spec.loader, self.machinery.FrozenImporter) self.assertEqual(spec.origin, 'frozen') + self.assertFalse(spec.has_location) - def test_package(self): - spec = self.find('__phello__') - self.assertIsNotNone(spec) - - def test_module_in_package(self): - spec = self.find('__phello__.spam', ['__phello__']) - self.assertIsNotNone(spec) + def test_module(self): + names = [ + '__hello__', + '__hello_alias__', + '__hello_only__', + '__phello__.__init__', + '__phello__.spam', + '__phello__.ham.__init__', + '__phello__.ham.eggs', + ] + for name in names: + with self.subTest(name): + spec = self.find(name) + self.check(spec, name) + self.assertEqual(spec.submodule_search_locations, None) - # No frozen package within another package to test with. + def test_package(self): + names = [ + '__phello__', + '__phello__.ham', + '__phello_alias__', + ] + for name in names: + with self.subTest(name): + spec = self.find(name) + self.check(spec, name) + self.assertEqual(spec.submodule_search_locations, []) + + # These are covered by test_module() and test_package(). + test_module_in_package = None test_package_in_package = None # No easy way to test. test_package_over_module = None + def test_path_ignored(self): + for name in ('__hello__', '__phello__', '__phello__.spam'): + actual = self.find(name) + for path in (None, object(), '', 'eggs', [], [''], ['eggs']): + with self.subTest((name, path)): + spec = self.find(name, path=path) + self.assertEqual(spec, actual) + + def test_target_ignored(self): + imported = ('__hello__', '__phello__') + with import_helper.CleanImport(*imported, usefrozen=True): + import __hello__ as match + import __phello__ as nonmatch + name = '__hello__' + actual = self.find(name) + for target in (None, match, nonmatch, object(), 'not-a-module-object'): + with self.subTest(target): + spec = self.find(name, target=target) + self.assertEqual(spec, actual) + def test_failure(self): spec = self.find('') self.assertIsNone(spec) + def test_not_using_frozen(self): + finder = self.machinery.FrozenImporter + with import_helper.frozen_modules(enabled=False): + # both frozen and not frozen + spec1 = finder.find_spec('__hello__') + # only frozen + spec2 = finder.find_spec('__hello_only__') + self.assertIsNone(spec1) + self.assertIsNone(spec2) + (Frozen_FindSpecTests, Source_FindSpecTests diff --git a/Makefile.pre.in b/Makefile.pre.in index 5564c1bae1ce2a..7ad634ac01162f 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -752,7 +752,12 @@ FROZEN_FILES_IN = \ Lib/os.py \ Lib/site.py \ Lib/stat.py \ - Lib/__hello__.py + Lib/__hello__.py \ + Lib/__phello__/__init__.py \ + Lib/__phello__/ham/__init__.py \ + Lib/__phello__/ham/eggs.py \ + Lib/__phello__/spam.py \ + Tools/freeze/flag.py # End FROZEN_FILES_IN FROZEN_FILES_OUT = \ Python/frozen_modules/importlib._bootstrap.h \ @@ -769,7 +774,12 @@ FROZEN_FILES_OUT = \ Python/frozen_modules/os.h \ Python/frozen_modules/site.h \ Python/frozen_modules/stat.h \ - Python/frozen_modules/__hello__.h + Python/frozen_modules/__hello__.h \ + Python/frozen_modules/__phello__.h \ + Python/frozen_modules/__phello__.ham.h \ + Python/frozen_modules/__phello__.ham.eggs.h \ + Python/frozen_modules/__phello__.spam.h \ + Python/frozen_modules/frozen_only.h # End FROZEN_FILES_OUT Programs/_freeze_module.o: Programs/_freeze_module.c Makefile @@ -824,6 +834,21 @@ Python/frozen_modules/stat.h: Programs/_freeze_module Lib/stat.py Python/frozen_modules/__hello__.h: Programs/_freeze_module Lib/__hello__.py Programs/_freeze_module __hello__ $(srcdir)/Lib/__hello__.py $(srcdir)/Python/frozen_modules/__hello__.h +Python/frozen_modules/__phello__.h: Programs/_freeze_module Lib/__phello__/__init__.py + Programs/_freeze_module __phello__ $(srcdir)/Lib/__phello__/__init__.py $(srcdir)/Python/frozen_modules/__phello__.h + +Python/frozen_modules/__phello__.ham.h: Programs/_freeze_module Lib/__phello__/ham/__init__.py + Programs/_freeze_module __phello__.ham $(srcdir)/Lib/__phello__/ham/__init__.py $(srcdir)/Python/frozen_modules/__phello__.ham.h + +Python/frozen_modules/__phello__.ham.eggs.h: Programs/_freeze_module Lib/__phello__/ham/eggs.py + Programs/_freeze_module __phello__.ham.eggs $(srcdir)/Lib/__phello__/ham/eggs.py $(srcdir)/Python/frozen_modules/__phello__.ham.eggs.h + +Python/frozen_modules/__phello__.spam.h: Programs/_freeze_module Lib/__phello__/spam.py + Programs/_freeze_module __phello__.spam $(srcdir)/Lib/__phello__/spam.py $(srcdir)/Python/frozen_modules/__phello__.spam.h + +Python/frozen_modules/frozen_only.h: Programs/_freeze_module Tools/freeze/flag.py + Programs/_freeze_module frozen_only $(srcdir)/Tools/freeze/flag.py $(srcdir)/Python/frozen_modules/frozen_only.h + # END: freezing modules Tools/scripts/freeze_modules.py: Programs/_freeze_module diff --git a/PCbuild/_freeze_module.vcxproj b/PCbuild/_freeze_module.vcxproj index ea6532d10d8ccc..12bdde2af84d9a 100644 --- a/PCbuild/_freeze_module.vcxproj +++ b/PCbuild/_freeze_module.vcxproj @@ -305,6 +305,31 @@ $(IntDir)__hello__.g.h $(PySourcePath)Python\frozen_modules\__hello__.h + + __phello__ + $(IntDir)__phello__.g.h + $(PySourcePath)Python\frozen_modules\__phello__.h + + + __phello__.ham + $(IntDir)__phello__.ham.g.h + $(PySourcePath)Python\frozen_modules\__phello__.ham.h + + + __phello__.ham.eggs + $(IntDir)__phello__.ham.eggs.g.h + $(PySourcePath)Python\frozen_modules\__phello__.ham.eggs.h + + + __phello__.spam + $(IntDir)__phello__.spam.g.h + $(PySourcePath)Python\frozen_modules\__phello__.spam.h + + + frozen_only + $(IntDir)frozen_only.g.h + $(PySourcePath)Python\frozen_modules\frozen_only.h + diff --git a/PCbuild/_freeze_module.vcxproj.filters b/PCbuild/_freeze_module.vcxproj.filters index 4a1c90f668e64b..5894909e0fbe1e 100644 --- a/PCbuild/_freeze_module.vcxproj.filters +++ b/PCbuild/_freeze_module.vcxproj.filters @@ -61,6 +61,21 @@ Python Files + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + diff --git a/Python/frozen.c b/Python/frozen.c index f9ad07c0b49e14..b4f7121fda35f3 100644 --- a/Python/frozen.c +++ b/Python/frozen.c @@ -53,6 +53,11 @@ #include "frozen_modules/site.h" #include "frozen_modules/stat.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 */ /* Note that a negative size indicates a package. */ @@ -84,8 +89,19 @@ static const struct _frozen _PyImport_FrozenModules[] = { /* Test module */ {"__hello__", _Py_M____hello__, (int)sizeof(_Py_M____hello__)}, - {"__phello__", _Py_M____hello__, -(int)sizeof(_Py_M____hello__)}, - {"__phello__.spam", _Py_M____hello__, (int)sizeof(_Py_M____hello__)}, + {"__hello_alias__", _Py_M____hello__, (int)sizeof(_Py_M____hello__)}, + {"__phello_alias__", _Py_M____hello__, -(int)sizeof(_Py_M____hello__)}, + {"__phello_alias__.spam", _Py_M____hello__, (int)sizeof(_Py_M____hello__)}, + {"__phello__", _Py_M____phello__, -(int)sizeof(_Py_M____phello__)}, + {"__phello__.__init__", _Py_M____phello__, (int)sizeof(_Py_M____phello__)}, + {"__phello__.ham", _Py_M____phello___ham, -(int)sizeof(_Py_M____phello___ham)}, + {"__phello__.ham.__init__", _Py_M____phello___ham, + (int)sizeof(_Py_M____phello___ham)}, + {"__phello__.ham.eggs", _Py_M____phello___ham_eggs, + (int)sizeof(_Py_M____phello___ham_eggs)}, + {"__phello__.spam", _Py_M____phello___spam, + (int)sizeof(_Py_M____phello___spam)}, + {"__hello_only__", _Py_M__frozen_only, (int)sizeof(_Py_M__frozen_only)}, {0, 0, 0} /* sentinel */ }; diff --git a/Tools/scripts/freeze_modules.py b/Tools/scripts/freeze_modules.py index ea96253df3e493..6091d831a8d31a 100644 --- a/Tools/scripts/freeze_modules.py +++ b/Tools/scripts/freeze_modules.py @@ -19,6 +19,7 @@ ROOT_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ROOT_DIR = os.path.abspath(ROOT_DIR) +FROZEN_ONLY = os.path.join(ROOT_DIR, 'Tools', 'freeze', 'flag.py') STDLIB_DIR = os.path.join(ROOT_DIR, 'Lib') # If MODULES_DIR is changed then the .gitattributes and .gitignore files @@ -53,7 +54,6 @@ def find_tool(): MAKEFILE = os.path.join(ROOT_DIR, 'Makefile.pre.in') PCBUILD_PROJECT = os.path.join(ROOT_DIR, 'PCbuild', '_freeze_module.vcxproj') PCBUILD_FILTERS = os.path.join(ROOT_DIR, 'PCbuild', '_freeze_module.vcxproj.filters') -TEST_CTYPES = os.path.join(STDLIB_DIR, 'ctypes', 'test', 'test_values.py') OS_PATH = 'ntpath' if os.name == 'nt' else 'posixpath' @@ -95,8 +95,11 @@ def find_tool(): ]), ('Test module', [ '__hello__', - '__hello__ : <__phello__>', - '__hello__ : __phello__.spam', + '__hello__ : __hello_alias__', + '__hello__ : <__phello_alias__>', + '__hello__ : __phello_alias__.spam', + '<__phello__.**.*>', + f'frozen_only : __hello_only__ = {FROZEN_ONLY}', ]), ] ESSENTIAL = { @@ -135,14 +138,15 @@ def parse_frozen_specs(sectionalspecs=FROZEN, destdir=None): seen = {} for section, specs in sectionalspecs: parsed = _parse_specs(specs, section, seen) - for frozenid, pyfile, modname, ispkg, section in parsed: + for item in parsed: + frozenid, pyfile, modname, ispkg, section = item try: source = seen[frozenid] except KeyError: source = FrozenSource.from_id(frozenid, pyfile, destdir) seen[frozenid] = source else: - assert not pyfile + assert not pyfile or pyfile == source.pyfile, item yield FrozenModule(modname, ispkg, section, source) @@ -224,7 +228,6 @@ def _parse_spec(spec, knownids=None, section=None): pkgfiles = {pyfile: pkgid} def iter_subs(): for frozenid, pyfile, ispkg in resolved: - assert not knownids or frozenid not in knownids, (frozenid, spec) if pkgname: modname = frozenid.replace(pkgid, pkgname, 1) else: diff --git a/Tools/scripts/generate_stdlib_module_names.py b/Tools/scripts/generate_stdlib_module_names.py index 325ae202b1d8c1..50042f14fb62e5 100644 --- a/Tools/scripts/generate_stdlib_module_names.py +++ b/Tools/scripts/generate_stdlib_module_names.py @@ -21,6 +21,9 @@ # Test modules and packages '__hello__', '__phello__', + '__hello_alias__', + '__phello_alias__', + '__hello_only__', '_ctypes_test', '_testbuffer', '_testcapi', From 3e1c5d989a884cfbeb427b6fc86012b03cb95f62 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Thu, 30 Sep 2021 20:23:32 -0600 Subject: [PATCH 039/263] Install the __phello__ package too. (#28665) I broke some buildbots by not adding __phello__ to the list of installed packages. https://bugs.python.org/issue45020 --- Makefile.pre.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 7ad634ac01162f..670887437360cc 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1544,7 +1544,8 @@ LIBSUBDIRS= asyncio \ wsgiref \ $(XMLLIBSUBDIRS) \ xmlrpc \ - zoneinfo + zoneinfo \ + __phello__ TESTSUBDIRS= ctypes/test \ distutils/tests \ idlelib/idle_test \ From 1ee0f94d16f150356a4b9b0a39d44ba1d2d5b9fc Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 1 Oct 2021 09:55:28 +0200 Subject: [PATCH 040/263] bpo-41710: PyThread_acquire_lock_timed() uses sem_clockwait() (GH-28662) On Unix, if the sem_clockwait() function is available in the C library (glibc 2.30 and newer), the threading.Lock.acquire() method now uses the monotonic clock (time.CLOCK_MONOTONIC) for the timeout, rather than using the system clock (time.CLOCK_REALTIME), to not be affected by system clock changes. configure now checks if the sem_clockwait() function is available. --- Doc/whatsnew/3.11.rst | 10 ++ .../2021-09-30-23-00-18.bpo-41710.svuloZ.rst | 5 + Python/thread_pthread.h | 39 +++- configure | 167 +++++++++++------- configure.ac | 2 +- pyconfig.h.in | 9 +- 6 files changed, 160 insertions(+), 72 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-09-30-23-00-18.bpo-41710.svuloZ.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index d01d2e263199ad..ff376d231bafa8 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -239,6 +239,16 @@ sqlite3 (Contributed by Aviv Palivoda, Daniel Shahaf, and Erlend E. Aasland in :issue:`16379`.) +threading +--------- + +* On Unix, if the ``sem_clockwait()`` function is available in the C library + (glibc 2.30 and newer), the :meth:`threading.Lock.acquire` method now uses + the monotonic clock (:data:`time.CLOCK_MONOTONIC`) for the timeout, rather + than using the system clock (:data:`time.CLOCK_REALTIME`), to not be affected + by system clock changes. + (Contributed by Livius and Victor Stinner in :issue:`41710`.) + time ---- diff --git a/Misc/NEWS.d/next/Library/2021-09-30-23-00-18.bpo-41710.svuloZ.rst b/Misc/NEWS.d/next/Library/2021-09-30-23-00-18.bpo-41710.svuloZ.rst new file mode 100644 index 00000000000000..d8a4f9507c1898 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-09-30-23-00-18.bpo-41710.svuloZ.rst @@ -0,0 +1,5 @@ +On Unix, if the ``sem_clockwait()`` function is available in the C library +(glibc 2.30 and newer), the :meth:`threading.Lock.acquire` method now uses the +monotonic clock (:data:`time.CLOCK_MONOTONIC`) for the timeout, rather than +using the system clock (:data:`time.CLOCK_REALTIME`), to not be affected by +system clock changes. Patch by Victor Stinner. diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 3815ffae20c017..9b5e273f1a8bac 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -92,7 +92,7 @@ * mutexes and condition variables: */ #if (defined(_POSIX_SEMAPHORES) && !defined(HAVE_BROKEN_POSIX_SEMAPHORES) && \ - defined(HAVE_SEM_TIMEDWAIT)) + (defined(HAVE_SEM_TIMEDWAIT) || defined(HAVE_SEM_CLOCKWAIT))) # define USE_SEMAPHORES #else # undef USE_SEMAPHORES @@ -461,17 +461,34 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, timeout = _PyTime_FromNanoseconds(-1); } +#ifdef HAVE_SEM_CLOCKWAIT + struct timespec abs_timeout; + // Local scope for deadline + { + _PyTime_t deadline = _PyTime_GetMonotonicClock() + timeout; + _PyTime_AsTimespec_clamp(deadline, &abs_timeout); + } +#else _PyTime_t deadline = 0; - if (timeout > 0 && !intr_flag) { + if (timeout > 0 + && !intr_flag + ) + { deadline = _PyTime_GetMonotonicClock() + timeout; } +#endif while (1) { if (timeout > 0) { - _PyTime_t t = _PyTime_GetSystemClock() + timeout; +#ifdef HAVE_SEM_CLOCKWAIT + status = fix_status(sem_clockwait(thelock, CLOCK_MONOTONIC, + &abs_timeout)); +#else + _PyTime_t abs_timeout = _PyTime_GetSystemClock() + timeout; struct timespec ts; - _PyTime_AsTimespec_clamp(t, &ts); + _PyTime_AsTimespec_clamp(abs_timeout, &ts); status = fix_status(sem_timedwait(thelock, &ts)); +#endif } else if (timeout == 0) { status = fix_status(sem_trywait(thelock)); @@ -486,6 +503,9 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, break; } + // sem_clockwait() uses an absolute timeout, there is no need + // to recompute the relative timeout. +#ifndef HAVE_SEM_CLOCKWAIT if (timeout > 0) { /* wait interrupted by a signal (EINTR): recompute the timeout */ _PyTime_t timeout = deadline - _PyTime_GetMonotonicClock(); @@ -494,17 +514,24 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, break; } } +#endif } /* Don't check the status if we're stopping because of an interrupt. */ if (!(intr_flag && status == EINTR)) { if (timeout > 0) { - if (status != ETIMEDOUT) + if (status != ETIMEDOUT) { +#ifdef HAVE_SEM_CLOCKWAIT + CHECK_STATUS("sem_clockwait"); +#else CHECK_STATUS("sem_timedwait"); +#endif + } } else if (timeout == 0) { - if (status != EAGAIN) + if (status != EAGAIN) { CHECK_STATUS("sem_trywait"); + } } else { CHECK_STATUS("sem_wait"); diff --git a/configure b/configure index 4acf91f22107f4..75e2e296f10b1a 100755 --- a/configure +++ b/configure @@ -9764,7 +9764,7 @@ then BLDSHARED="$LDSHARED" fi ;; - Linux*|GNU*|QNX*|VxWorks*) + Linux*|GNU*|QNX*|VxWorks*|Haiku*) LDSHARED='$(CC) -shared' LDCXXSHARED='$(CXX) -shared';; FreeBSD*) @@ -9835,6 +9835,7 @@ then Linux-android*) ;; Linux*|GNU*) CCSHARED="-fPIC";; FreeBSD*|NetBSD*|OpenBSD*|DragonFly*) CCSHARED="-fPIC";; + Haiku*) CCSHARED="-fPIC";; OpenUNIX*|UnixWare*) if test "$GCC" = "yes" then CCSHARED="-fPIC" @@ -10562,6 +10563,48 @@ if test "x$ac_cv_lib_socket_socket" = xyes; then : fi # SVR4 sockets +# Haiku system library +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lnetwork" >&5 +$as_echo_n "checking for socket in -lnetwork... " >&6; } +if ${ac_cv_lib_network_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnetwork $LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_network_socket=yes +else + ac_cv_lib_network_socket=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_socket" >&5 +$as_echo "$ac_cv_lib_network_socket" >&6; } +if test "x$ac_cv_lib_network_socket" = xyes; then : + LIBS="-lnetwork $LIBS" +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-libs" >&5 $as_echo_n "checking for --with-libs... " >&6; } @@ -11774,7 +11817,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ pthread_condattr_setclock pthread_init pthread_kill pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ - sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ + sem_open sem_timedwait sem_clockwait sem_getvalue sem_unlink sendfile setegid seteuid \ setgid sethostname \ setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \ sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \ @@ -13252,19 +13295,19 @@ fi done -for ac_func in clock_nanosleep +for ac_func in clock_getres do : - ac_fn_c_check_func "$LINENO" "clock_nanosleep" "ac_cv_func_clock_nanosleep" -if test "x$ac_cv_func_clock_nanosleep" = xyes; then : + ac_fn_c_check_func "$LINENO" "clock_getres" "ac_cv_func_clock_getres" +if test "x$ac_cv_func_clock_getres" = xyes; then : cat >>confdefs.h <<_ACEOF -#define HAVE_CLOCK_NANOSLEEP 1 +#define HAVE_CLOCK_GETRES 1 _ACEOF else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_nanosleep in -lrt" >&5 -$as_echo_n "checking for clock_nanosleep in -lrt... " >&6; } -if ${ac_cv_lib_rt_clock_nanosleep+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_getres in -lrt" >&5 +$as_echo_n "checking for clock_getres in -lrt... " >&6; } +if ${ac_cv_lib_rt_clock_getres+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -13278,29 +13321,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char clock_nanosleep (); +char clock_getres (); int main () { -return clock_nanosleep (); +return clock_getres (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_rt_clock_nanosleep=yes + ac_cv_lib_rt_clock_getres=yes else - ac_cv_lib_rt_clock_nanosleep=no + ac_cv_lib_rt_clock_getres=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_nanosleep" >&5 -$as_echo "$ac_cv_lib_rt_clock_nanosleep" >&6; } -if test "x$ac_cv_lib_rt_clock_nanosleep" = xyes; then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_getres" >&5 +$as_echo "$ac_cv_lib_rt_clock_getres" >&6; } +if test "x$ac_cv_lib_rt_clock_getres" = xyes; then : - $as_echo "#define HAVE_CLOCK_NANOSLEEP 1" >>confdefs.h + $as_echo "#define HAVE_CLOCK_GETRES 1" >>confdefs.h fi @@ -13310,19 +13353,19 @@ fi done -for ac_func in nanosleep +for ac_func in clock_settime do : - ac_fn_c_check_func "$LINENO" "nanosleep" "ac_cv_func_nanosleep" -if test "x$ac_cv_func_nanosleep" = xyes; then : + ac_fn_c_check_func "$LINENO" "clock_settime" "ac_cv_func_clock_settime" +if test "x$ac_cv_func_clock_settime" = xyes; then : cat >>confdefs.h <<_ACEOF -#define HAVE_NANOSLEEP 1 +#define HAVE_CLOCK_SETTIME 1 _ACEOF else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanosleep in -lrt" >&5 -$as_echo_n "checking for nanosleep in -lrt... " >&6; } -if ${ac_cv_lib_rt_nanosleep+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_settime in -lrt" >&5 +$as_echo_n "checking for clock_settime in -lrt... " >&6; } +if ${ac_cv_lib_rt_clock_settime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -13336,29 +13379,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char nanosleep (); +char clock_settime (); int main () { -return nanosleep (); +return clock_settime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_rt_nanosleep=yes + ac_cv_lib_rt_clock_settime=yes else - ac_cv_lib_rt_nanosleep=no + ac_cv_lib_rt_clock_settime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_nanosleep" >&5 -$as_echo "$ac_cv_lib_rt_nanosleep" >&6; } -if test "x$ac_cv_lib_rt_nanosleep" = xyes; then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_settime" >&5 +$as_echo "$ac_cv_lib_rt_clock_settime" >&6; } +if test "x$ac_cv_lib_rt_clock_settime" = xyes; then : - $as_echo "#define HAVE_NANOSLEEP 1" >>confdefs.h + $as_echo "#define HAVE_CLOCK_SETTIME 1" >>confdefs.h fi @@ -13368,19 +13411,19 @@ fi done -for ac_func in clock_getres +for ac_func in clock_nanosleep do : - ac_fn_c_check_func "$LINENO" "clock_getres" "ac_cv_func_clock_getres" -if test "x$ac_cv_func_clock_getres" = xyes; then : + ac_fn_c_check_func "$LINENO" "clock_nanosleep" "ac_cv_func_clock_nanosleep" +if test "x$ac_cv_func_clock_nanosleep" = xyes; then : cat >>confdefs.h <<_ACEOF -#define HAVE_CLOCK_GETRES 1 +#define HAVE_CLOCK_NANOSLEEP 1 _ACEOF else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_getres in -lrt" >&5 -$as_echo_n "checking for clock_getres in -lrt... " >&6; } -if ${ac_cv_lib_rt_clock_getres+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_nanosleep in -lrt" >&5 +$as_echo_n "checking for clock_nanosleep in -lrt... " >&6; } +if ${ac_cv_lib_rt_clock_nanosleep+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -13394,29 +13437,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char clock_getres (); +char clock_nanosleep (); int main () { -return clock_getres (); +return clock_nanosleep (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_rt_clock_getres=yes + ac_cv_lib_rt_clock_nanosleep=yes else - ac_cv_lib_rt_clock_getres=no + ac_cv_lib_rt_clock_nanosleep=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_getres" >&5 -$as_echo "$ac_cv_lib_rt_clock_getres" >&6; } -if test "x$ac_cv_lib_rt_clock_getres" = xyes; then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_nanosleep" >&5 +$as_echo "$ac_cv_lib_rt_clock_nanosleep" >&6; } +if test "x$ac_cv_lib_rt_clock_nanosleep" = xyes; then : - $as_echo "#define HAVE_CLOCK_GETRES 1" >>confdefs.h + $as_echo "#define HAVE_CLOCK_NANOSLEEP 1" >>confdefs.h fi @@ -13426,19 +13469,19 @@ fi done -for ac_func in clock_settime +for ac_func in nanosleep do : - ac_fn_c_check_func "$LINENO" "clock_settime" "ac_cv_func_clock_settime" -if test "x$ac_cv_func_clock_settime" = xyes; then : + ac_fn_c_check_func "$LINENO" "nanosleep" "ac_cv_func_nanosleep" +if test "x$ac_cv_func_nanosleep" = xyes; then : cat >>confdefs.h <<_ACEOF -#define HAVE_CLOCK_SETTIME 1 +#define HAVE_NANOSLEEP 1 _ACEOF else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_settime in -lrt" >&5 -$as_echo_n "checking for clock_settime in -lrt... " >&6; } -if ${ac_cv_lib_rt_clock_settime+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanosleep in -lrt" >&5 +$as_echo_n "checking for nanosleep in -lrt... " >&6; } +if ${ac_cv_lib_rt_nanosleep+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -13452,29 +13495,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char clock_settime (); +char nanosleep (); int main () { -return clock_settime (); +return nanosleep (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_rt_clock_settime=yes + ac_cv_lib_rt_nanosleep=yes else - ac_cv_lib_rt_clock_settime=no + ac_cv_lib_rt_nanosleep=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_settime" >&5 -$as_echo "$ac_cv_lib_rt_clock_settime" >&6; } -if test "x$ac_cv_lib_rt_clock_settime" = xyes; then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_nanosleep" >&5 +$as_echo "$ac_cv_lib_rt_nanosleep" >&6; } +if test "x$ac_cv_lib_rt_nanosleep" = xyes; then : - $as_echo "#define HAVE_CLOCK_SETTIME 1" >>confdefs.h + $as_echo "#define HAVE_NANOSLEEP 1" >>confdefs.h fi diff --git a/configure.ac b/configure.ac index 48d86ef79199e1..908dd28e7aacad 100644 --- a/configure.ac +++ b/configure.ac @@ -3744,7 +3744,7 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ pthread_condattr_setclock pthread_init pthread_kill pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ - sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ + sem_open sem_timedwait sem_clockwait sem_getvalue sem_unlink sendfile setegid seteuid \ setgid sethostname \ setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \ sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \ diff --git a/pyconfig.h.in b/pyconfig.h.in index 23d7111b9f77e7..862c083604ee4e 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -136,15 +136,15 @@ /* Define to 1 if you have the `clock' function. */ #undef HAVE_CLOCK -/* Define to 1 if you have the `clock_nanosleep' function. */ -#undef HAVE_CLOCK_NANOSLEEP - /* Define to 1 if you have the `clock_getres' function. */ #undef HAVE_CLOCK_GETRES /* Define to 1 if you have the `clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME +/* Define to 1 if you have the `clock_nanosleep' function. */ +#undef HAVE_CLOCK_NANOSLEEP + /* Define to 1 if you have the `clock_settime' function. */ #undef HAVE_CLOCK_SETTIME @@ -908,6 +908,9 @@ /* Define to 1 if you have the `sched_setscheduler' function. */ #undef HAVE_SCHED_SETSCHEDULER +/* Define to 1 if you have the `sem_clockwait' function. */ +#undef HAVE_SEM_CLOCKWAIT + /* Define to 1 if you have the `sem_getvalue' function. */ #undef HAVE_SEM_GETVALUE From eb4495e8e275c83d691add116c4f2b74e73e3cc8 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 1 Oct 2021 10:56:32 +0300 Subject: [PATCH 041/263] bpo-45310: Fix parrallel shared memory tests (GH-28661) Add a PID to names of POSIX shared memory objects to allow running multiprocessing tests (test_multiprocessing_fork, test_multiprocessing_spawn, etc) in parallel. --- Lib/test/_test_multiprocessing.py | 40 ++++++++++++++++++------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 125e8906d8abce..9e0d18da50f6ef 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -3773,12 +3773,19 @@ def _attach_existing_shmem_then_write(shmem_name_or_obj, binary_data): local_sms.buf[:len(binary_data)] = binary_data local_sms.close() + def _new_shm_name(self, prefix): + # Add a PID to the name of a POSIX shared memory object to allow + # running multiprocessing tests (test_multiprocessing_fork, + # test_multiprocessing_spawn, etc) in parallel. + return prefix + str(os.getpid()) + def test_shared_memory_basics(self): - sms = shared_memory.SharedMemory('test01_tsmb', create=True, size=512) + name_tsmb = self._new_shm_name('test01_tsmb') + sms = shared_memory.SharedMemory(name_tsmb, create=True, size=512) self.addCleanup(sms.unlink) # Verify attributes are readable. - self.assertEqual(sms.name, 'test01_tsmb') + self.assertEqual(sms.name, name_tsmb) self.assertGreaterEqual(sms.size, 512) self.assertGreaterEqual(len(sms.buf), sms.size) @@ -3798,12 +3805,12 @@ def test_shared_memory_basics(self): self.assertEqual(sms.buf[0], 42) # Attach to existing shared memory segment. - also_sms = shared_memory.SharedMemory('test01_tsmb') + also_sms = shared_memory.SharedMemory(name_tsmb) self.assertEqual(also_sms.buf[0], 42) also_sms.close() # Attach to existing shared memory segment but specify a new size. - same_sms = shared_memory.SharedMemory('test01_tsmb', size=20*sms.size) + same_sms = shared_memory.SharedMemory(name_tsmb, size=20*sms.size) self.assertLess(same_sms.size, 20*sms.size) # Size was ignored. same_sms.close() @@ -3821,7 +3828,7 @@ def test_shared_memory_basics(self): 'multiprocessing.shared_memory._make_filename') as mock_make_filename: NAME_PREFIX = shared_memory._SHM_NAME_PREFIX - names = ['test01_fn', 'test02_fn'] + names = [self._new_shm_name('test01_fn'), self._new_shm_name('test02_fn')] # Prepend NAME_PREFIX which can be '/psm_' or 'wnsm_', necessary # because some POSIX compliant systems require name to start with / names = [NAME_PREFIX + name for name in names] @@ -3843,17 +3850,17 @@ def test_shared_memory_basics(self): # manages unlinking on its own and unlink() does nothing). # True release of shared memory segment does not necessarily # happen until process exits, depending on the OS platform. + name_dblunlink = self._new_shm_name('test01_dblunlink') + sms_uno = shared_memory.SharedMemory( + name_dblunlink, + create=True, + size=5000 + ) with self.assertRaises(FileNotFoundError): - sms_uno = shared_memory.SharedMemory( - 'test01_dblunlink', - create=True, - size=5000 - ) - try: self.assertGreaterEqual(sms_uno.size, 5000) - sms_duo = shared_memory.SharedMemory('test01_dblunlink') + sms_duo = shared_memory.SharedMemory(name_dblunlink) sms_duo.unlink() # First shm_unlink() call. sms_duo.close() sms_uno.close() @@ -3865,7 +3872,7 @@ def test_shared_memory_basics(self): # Attempting to create a new shared memory segment with a # name that is already in use triggers an exception. there_can_only_be_one_sms = shared_memory.SharedMemory( - 'test01_tsmb', + name_tsmb, create=True, size=512 ) @@ -3879,7 +3886,7 @@ def test_shared_memory_basics(self): # case of MacOS/darwin, requesting a smaller size is disallowed. class OptionalAttachSharedMemory(shared_memory.SharedMemory): _flags = os.O_CREAT | os.O_RDWR - ok_if_exists_sms = OptionalAttachSharedMemory('test01_tsmb') + ok_if_exists_sms = OptionalAttachSharedMemory(name_tsmb) self.assertEqual(ok_if_exists_sms.size, sms.size) ok_if_exists_sms.close() @@ -4084,10 +4091,11 @@ def test_shared_memory_ShareableList_basics(self): self.assertEqual(sl.count(b'adios'), 0) # Exercise creating a duplicate. - sl_copy = shared_memory.ShareableList(sl, name='test03_duplicate') + name_duplicate = self._new_shm_name('test03_duplicate') + sl_copy = shared_memory.ShareableList(sl, name=name_duplicate) try: self.assertNotEqual(sl.shm.name, sl_copy.shm.name) - self.assertEqual('test03_duplicate', sl_copy.shm.name) + self.assertEqual(name_duplicate, sl_copy.shm.name) self.assertEqual(list(sl), list(sl_copy)) self.assertEqual(sl.format, sl_copy.format) sl_copy[-1] = 77 From 2f205920127bd93eebed044cb1b61834764478ba Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 1 Oct 2021 10:57:58 +0300 Subject: [PATCH 042/263] Revert "Revert "bpo-45229: Make datetime tests discoverable (GH-28615)" (GH-28650)" (GH-28667) This reverts commit b07fddd527efe67174ce6b0fdbe8dac390b16e4e. --- Lib/test/test_datetime.py | 92 +++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 47 deletions(-) diff --git a/Lib/test/test_datetime.py b/Lib/test/test_datetime.py index bdb9f02e5756a2..7f9094fa7bd4e6 100644 --- a/Lib/test/test_datetime.py +++ b/Lib/test/test_datetime.py @@ -1,59 +1,57 @@ import unittest import sys -from test.support import run_unittest from test.support.import_helper import import_fresh_module TESTS = 'test.datetimetester' -try: - pure_tests = import_fresh_module(TESTS, fresh=['datetime', '_strptime'], - blocked=['_datetime']) - fast_tests = import_fresh_module(TESTS, fresh=['datetime', - '_datetime', '_strptime']) -finally: - # XXX: import_fresh_module() is supposed to leave sys.module cache untouched, - # XXX: but it does not, so we have to cleanup ourselves. - for modname in ['datetime', '_datetime', '_strptime']: - sys.modules.pop(modname, None) -test_modules = [pure_tests, fast_tests] -test_suffixes = ["_Pure", "_Fast"] -# XXX(gb) First run all the _Pure tests, then all the _Fast tests. You might -# not believe this, but in spite of all the sys.modules trickery running a _Pure -# test last will leave a mix of pure and native datetime stuff lying around. -all_test_classes = [] +def load_tests(loader, tests, pattern): + try: + pure_tests = import_fresh_module(TESTS, fresh=['datetime', '_strptime'], + blocked=['_datetime']) + fast_tests = import_fresh_module(TESTS, fresh=['datetime', + '_datetime', '_strptime']) + finally: + # XXX: import_fresh_module() is supposed to leave sys.module cache untouched, + # XXX: but it does not, so we have to cleanup ourselves. + for modname in ['datetime', '_datetime', '_strptime']: + sys.modules.pop(modname, None) -for module, suffix in zip(test_modules, test_suffixes): - test_classes = [] - for name, cls in module.__dict__.items(): - if not isinstance(cls, type): - continue - if issubclass(cls, unittest.TestCase): - test_classes.append(cls) - elif issubclass(cls, unittest.TestSuite): - suit = cls() - test_classes.extend(type(test) for test in suit) - test_classes = sorted(set(test_classes), key=lambda cls: cls.__qualname__) - for cls in test_classes: - cls.__name__ += suffix - cls.__qualname__ += suffix - @classmethod - def setUpClass(cls_, module=module): - cls_._save_sys_modules = sys.modules.copy() - sys.modules[TESTS] = module - sys.modules['datetime'] = module.datetime_module - sys.modules['_strptime'] = module._strptime - @classmethod - def tearDownClass(cls_): - sys.modules.clear() - sys.modules.update(cls_._save_sys_modules) - cls.setUpClass = setUpClass - cls.tearDownClass = tearDownClass - all_test_classes.extend(test_classes) + test_modules = [pure_tests, fast_tests] + test_suffixes = ["_Pure", "_Fast"] + # XXX(gb) First run all the _Pure tests, then all the _Fast tests. You might + # not believe this, but in spite of all the sys.modules trickery running a _Pure + # test last will leave a mix of pure and native datetime stuff lying around. + for module, suffix in zip(test_modules, test_suffixes): + test_classes = [] + for name, cls in module.__dict__.items(): + if not isinstance(cls, type): + continue + if issubclass(cls, unittest.TestCase): + test_classes.append(cls) + elif issubclass(cls, unittest.TestSuite): + suit = cls() + test_classes.extend(type(test) for test in suit) + test_classes = sorted(set(test_classes), key=lambda cls: cls.__qualname__) + for cls in test_classes: + cls.__name__ += suffix + cls.__qualname__ += suffix + @classmethod + def setUpClass(cls_, module=module): + cls_._save_sys_modules = sys.modules.copy() + sys.modules[TESTS] = module + sys.modules['datetime'] = module.datetime_module + sys.modules['_strptime'] = module._strptime + @classmethod + def tearDownClass(cls_): + sys.modules.clear() + sys.modules.update(cls_._save_sys_modules) + cls.setUpClass = setUpClass + cls.tearDownClass = tearDownClass + tests.addTests(loader.loadTestsFromTestCase(cls)) + return tests -def test_main(): - run_unittest(*all_test_classes) if __name__ == "__main__": - test_main() + unittest.main() From 746d648d47d12d16c2afedaeff626fc6aaaf6a46 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Fri, 1 Oct 2021 13:45:59 +0300 Subject: [PATCH 043/263] bpo-45125: Improves pickling docs and tests for `shared_memory` (GH-28294) --- Doc/library/multiprocessing.shared_memory.rst | 27 ++++ Lib/test/_test_multiprocessing.py | 135 ++++++++++++++---- .../2021-09-11-22-08-18.bpo-45125.FVSzs2.rst | 2 + 3 files changed, 133 insertions(+), 31 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2021-09-11-22-08-18.bpo-45125.FVSzs2.rst diff --git a/Doc/library/multiprocessing.shared_memory.rst b/Doc/library/multiprocessing.shared_memory.rst index cba576a29e2e2b..2ba42b7e579a77 100644 --- a/Doc/library/multiprocessing.shared_memory.rst +++ b/Doc/library/multiprocessing.shared_memory.rst @@ -342,3 +342,30 @@ behind it: >>> c.shm.close() >>> c.shm.unlink() +The following examples demonstrates that ``ShareableList`` +(and underlying ``SharedMemory``) objects +can be pickled and unpickled if needed. +Note, that it will still be the same shared object. +This happens, because the deserialized object has +the same unique name and is just attached to an existing +object with the same name (if the object is still alive): + + >>> import pickle + >>> from multiprocessing import shared_memory + >>> sl = shared_memory.ShareableList(range(10)) + >>> list(sl) + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + + >>> deserialized_sl = pickle.loads(pickle.dumps(sl)) + >>> list(deserialized_sl) + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + + >>> sl[0] = -1 + >>> deserialized_sl[1] = -2 + >>> list(sl) + [-1, -2, 2, 3, 4, 5, 6, 7, 8, 9] + >>> list(deserialized_sl) + [-1, -2, 2, 3, 4, 5, 6, 7, 8, 9] + + >>> sl.shm.close() + >>> sl.shm.unlink() diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 9e0d18da50f6ef..3bc5b8f3d79b02 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -3793,13 +3793,6 @@ def test_shared_memory_basics(self): self.assertIn(sms.name, str(sms)) self.assertIn(str(sms.size), str(sms)) - # Test pickling - sms.buf[0:6] = b'pickle' - pickled_sms = pickle.dumps(sms) - sms2 = pickle.loads(pickled_sms) - self.assertEqual(sms.name, sms2.name) - self.assertEqual(bytes(sms.buf[0:6]), bytes(sms2.buf[0:6]), b'pickle') - # Modify contents of shared memory segment through memoryview. sms.buf[0] = 42 self.assertEqual(sms.buf[0], 42) @@ -3898,6 +3891,29 @@ class OptionalAttachSharedMemory(shared_memory.SharedMemory): sms.close() + def test_shared_memory_recreate(self): + # Test if shared memory segment is created properly, + # when _make_filename returns an existing shared memory segment name + with unittest.mock.patch( + 'multiprocessing.shared_memory._make_filename') as mock_make_filename: + + NAME_PREFIX = shared_memory._SHM_NAME_PREFIX + names = ['test01_fn', 'test02_fn'] + # Prepend NAME_PREFIX which can be '/psm_' or 'wnsm_', necessary + # because some POSIX compliant systems require name to start with / + names = [NAME_PREFIX + name for name in names] + + mock_make_filename.side_effect = names + shm1 = shared_memory.SharedMemory(create=True, size=1) + self.addCleanup(shm1.unlink) + self.assertEqual(shm1._name, names[0]) + + mock_make_filename.side_effect = names + shm2 = shared_memory.SharedMemory(create=True, size=1) + self.addCleanup(shm2.unlink) + self.assertEqual(shm2._name, names[1]) + + def test_invalid_shared_memory_cration(self): # Test creating a shared memory segment with negative size with self.assertRaises(ValueError): sms_invalid = shared_memory.SharedMemory(create=True, size=-1) @@ -3910,6 +3926,47 @@ class OptionalAttachSharedMemory(shared_memory.SharedMemory): with self.assertRaises(ValueError): sms_invalid = shared_memory.SharedMemory(create=True) + def test_shared_memory_pickle_unpickle(self): + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + sms = shared_memory.SharedMemory(create=True, size=512) + self.addCleanup(sms.unlink) + sms.buf[0:6] = b'pickle' + + # Test pickling + pickled_sms = pickle.dumps(sms, protocol=proto) + + # Test unpickling + sms2 = pickle.loads(pickled_sms) + self.assertIsInstance(sms2, shared_memory.SharedMemory) + self.assertEqual(sms.name, sms2.name) + self.assertEqual(bytes(sms.buf[0:6]), b'pickle') + self.assertEqual(bytes(sms2.buf[0:6]), b'pickle') + + # Test that unpickled version is still the same SharedMemory + sms.buf[0:6] = b'newval' + self.assertEqual(bytes(sms.buf[0:6]), b'newval') + self.assertEqual(bytes(sms2.buf[0:6]), b'newval') + + sms2.buf[0:6] = b'oldval' + self.assertEqual(bytes(sms.buf[0:6]), b'oldval') + self.assertEqual(bytes(sms2.buf[0:6]), b'oldval') + + def test_shared_memory_pickle_unpickle_dead_object(self): + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + sms = shared_memory.SharedMemory(create=True, size=512) + sms.buf[0:6] = b'pickle' + pickled_sms = pickle.dumps(sms, protocol=proto) + + # Now, we are going to kill the original object. + # So, unpickled one won't be able to attach to it. + sms.close() + sms.unlink() + + with self.assertRaises(FileNotFoundError): + pickle.loads(pickled_sms) + def test_shared_memory_across_processes(self): # bpo-40135: don't define shared memory block's name in case of # the failure when we run multiprocessing tests in parallel. @@ -4127,29 +4184,45 @@ def test_shared_memory_ShareableList_basics(self): empty_sl.shm.unlink() def test_shared_memory_ShareableList_pickling(self): - sl = shared_memory.ShareableList(range(10)) - self.addCleanup(sl.shm.unlink) - - serialized_sl = pickle.dumps(sl) - deserialized_sl = pickle.loads(serialized_sl) - self.assertTrue( - isinstance(deserialized_sl, shared_memory.ShareableList) - ) - self.assertTrue(deserialized_sl[-1], 9) - self.assertFalse(sl is deserialized_sl) - deserialized_sl[4] = "changed" - self.assertEqual(sl[4], "changed") - - # Verify data is not being put into the pickled representation. - name = 'a' * len(sl.shm.name) - larger_sl = shared_memory.ShareableList(range(400)) - self.addCleanup(larger_sl.shm.unlink) - serialized_larger_sl = pickle.dumps(larger_sl) - self.assertTrue(len(serialized_sl) == len(serialized_larger_sl)) - larger_sl.shm.close() - - deserialized_sl.shm.close() - sl.shm.close() + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + sl = shared_memory.ShareableList(range(10)) + self.addCleanup(sl.shm.unlink) + + serialized_sl = pickle.dumps(sl, protocol=proto) + deserialized_sl = pickle.loads(serialized_sl) + self.assertIsInstance( + deserialized_sl, shared_memory.ShareableList) + self.assertEqual(deserialized_sl[-1], 9) + self.assertIsNot(sl, deserialized_sl) + + deserialized_sl[4] = "changed" + self.assertEqual(sl[4], "changed") + sl[3] = "newvalue" + self.assertEqual(deserialized_sl[3], "newvalue") + + larger_sl = shared_memory.ShareableList(range(400)) + self.addCleanup(larger_sl.shm.unlink) + serialized_larger_sl = pickle.dumps(larger_sl, protocol=proto) + self.assertEqual(len(serialized_sl), len(serialized_larger_sl)) + larger_sl.shm.close() + + deserialized_sl.shm.close() + sl.shm.close() + + def test_shared_memory_ShareableList_pickling_dead_object(self): + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + sl = shared_memory.ShareableList(range(10)) + serialized_sl = pickle.dumps(sl, protocol=proto) + + # Now, we are going to kill the original object. + # So, unpickled one won't be able to attach to it. + sl.shm.close() + sl.shm.unlink() + + with self.assertRaises(FileNotFoundError): + pickle.loads(serialized_sl) def test_shared_memory_cleaned_after_process_termination(self): cmd = '''if 1: @@ -4202,7 +4275,7 @@ def test_shared_memory_cleaned_after_process_termination(self): "shared_memory objects to clean up at shutdown", err) # -# +# Test to verify that `Finalize` works. # class _TestFinalize(BaseTestCase): diff --git a/Misc/NEWS.d/next/Tests/2021-09-11-22-08-18.bpo-45125.FVSzs2.rst b/Misc/NEWS.d/next/Tests/2021-09-11-22-08-18.bpo-45125.FVSzs2.rst new file mode 100644 index 00000000000000..5dfbe0e5db4631 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2021-09-11-22-08-18.bpo-45125.FVSzs2.rst @@ -0,0 +1,2 @@ +Improves pickling tests and docs of ``SharedMemory`` and ``SharableList`` +objects. From 98d282700221234157159df4af76423d89490ad9 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 1 Oct 2021 13:03:03 +0200 Subject: [PATCH 044/263] bpo-41710: Fix PY_TIMEOUT_MAX on Windows (GH-28673) WaitForSingleObject() accepts timeout in milliseconds in the range [0; 0xFFFFFFFE] (DWORD type). INFINITE value (0xFFFFFFFF) means no timeout. 0xFFFFFFFE milliseconds is around 49.7 days. PY_TIMEOUT_MAX is (0xFFFFFFFE * 1000) milliseconds on Windows, around 49.7 days. Partially revert commit 37b8294d6295ca12553fd7c98778be71d24f4b24. --- Include/pythread.h | 10 +++++----- .../Library/2021-09-30-08-57-50.bpo-41710.JMsPAW.rst | 3 --- Python/thread_nt.h | 10 +++++----- 3 files changed, 10 insertions(+), 13 deletions(-) delete mode 100644 Misc/NEWS.d/next/Library/2021-09-30-08-57-50.bpo-41710.JMsPAW.rst diff --git a/Include/pythread.h b/Include/pythread.h index cf4cc9a7473f1a..1a6092c4ad0be2 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -61,11 +61,11 @@ PyAPI_FUNC(int) _PyThread_at_fork_reinit(PyThread_type_lock *lock); convert microseconds to nanoseconds. */ # define PY_TIMEOUT_MAX (LLONG_MAX / 1000) #elif defined (NT_THREADS) - /* In the NT API, the timeout is a DWORD and is expressed in milliseconds, - * a positive number between 0 and 0x7FFFFFFF (see WaitForSingleObject() - * documentation). */ -# if 0x7FFFFFFFLL * 1000 < LLONG_MAX -# define PY_TIMEOUT_MAX (0x7FFFFFFFLL * 1000) + // WaitForSingleObject() accepts timeout in milliseconds in the range + // [0; 0xFFFFFFFE] (DWORD type). INFINITE value (0xFFFFFFFF) means no + // timeout. 0xFFFFFFFE milliseconds is around 49.7 days. +# if 0xFFFFFFFELL * 1000 < LLONG_MAX +# define PY_TIMEOUT_MAX (0xFFFFFFFELL * 1000) # else # define PY_TIMEOUT_MAX LLONG_MAX # endif diff --git a/Misc/NEWS.d/next/Library/2021-09-30-08-57-50.bpo-41710.JMsPAW.rst b/Misc/NEWS.d/next/Library/2021-09-30-08-57-50.bpo-41710.JMsPAW.rst deleted file mode 100644 index 516214a619e8eb..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-30-08-57-50.bpo-41710.JMsPAW.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix :data:`_thread.TIMEOUT_MAX` value on Windows: the maximum timeout is -0x7FFFFFFF milliseconds (around 24.9 days), not 0xFFFFFFFF milliseconds (around -49.7 days). diff --git a/Python/thread_nt.h b/Python/thread_nt.h index 0beb3d3af2fd35..26f054ff0ce49b 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -292,9 +292,10 @@ PyThread_free_lock(PyThread_type_lock aLock) FreeNonRecursiveMutex(aLock) ; } -// WaitForSingleObject() documentation: "The time-out value needs to be a -// positive number between 0 and 0x7FFFFFFF." INFINITE is equal to 0xFFFFFFFF. -const DWORD TIMEOUT_MS_MAX = 0x7FFFFFFF; +// WaitForSingleObject() accepts timeout in milliseconds in the range +// [0; 0xFFFFFFFE] (DWORD type). INFINITE value (0xFFFFFFFF) means no +// timeout. 0xFFFFFFFE milliseconds is around 49.7 days. +const DWORD TIMEOUT_MS_MAX = 0xFFFFFFFE; /* * Return 1 on success if the lock was acquired @@ -322,12 +323,11 @@ PyThread_acquire_lock_timed(PyThread_type_lock aLock, // overflow to the caller, so clamp the timeout to // [0, TIMEOUT_MS_MAX] milliseconds. // - // TIMEOUT_MS_MAX milliseconds is around 24.9 days. - // // _thread.Lock.acquire() and _thread.RLock.acquire() raise an // OverflowError if microseconds is greater than PY_TIMEOUT_MAX. milliseconds = TIMEOUT_MS_MAX; } + assert(milliseconds != INFINITE); } else { milliseconds = INFINITE; From 54957f16a63ecb6b15f77b01fa7c55ada892604a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 1 Oct 2021 13:29:00 +0200 Subject: [PATCH 045/263] bpo-41710: gc_collect_main() uses _PyTime_GetPerfCounter() (GH-28676) If the DEBUG_STATS debug flag is set, gc_collect_main() now uses _PyTime_GetPerfCounter() instead of _PyTime_GetMonotonicClock() to measure the elapsed time. On Windows, _PyTime_GetMonotonicClock() only has a resolution of 15.6 ms, whereas _PyTime_GetPerfCounter() is closer to a resolution of 100 ns. --- Modules/gcmodule.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 2592c397cf2f73..7d1a45bcaeabf8 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1211,7 +1211,7 @@ gc_collect_main(PyThreadState *tstate, int generation, if (gcstate->debug & DEBUG_STATS) { PySys_WriteStderr("gc: collecting generation %d...\n", generation); show_stats_each_generations(gcstate); - t1 = _PyTime_GetMonotonicClock(); + t1 = _PyTime_GetPerfCounter(); } if (PyDTrace_GC_START_ENABLED()) @@ -1307,7 +1307,7 @@ gc_collect_main(PyThreadState *tstate, int generation, debug_cycle("uncollectable", FROM_GC(gc)); } if (gcstate->debug & DEBUG_STATS) { - double d = _PyTime_AsSecondsDouble(_PyTime_GetMonotonicClock() - t1); + double d = _PyTime_AsSecondsDouble(_PyTime_GetPerfCounter() - t1); PySys_WriteStderr( "gc: done, %zd unreachable, %zd uncollectable, %.4fs elapsed\n", n+m, n, d); From 833fdf126c8fe77fd17e8a8ffbc5c571b3bf64bd Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 1 Oct 2021 13:29:25 +0200 Subject: [PATCH 046/263] bpo-41710: Add private _PyDeadline_Get() function (GH-28674) Add a private C API for deadlines: add _PyDeadline_Init() and _PyDeadline_Get() functions. * Add _PyTime_Add() and _PyTime_Mul() functions which compute t1+t2 and t1*t2 and clamp the result on overflow. * _PyTime_MulDiv() now uses _PyTime_Add() and _PyTime_Mul(). --- Include/cpython/pytime.h | 16 +++++++ Modules/_queuemodule.c | 31 +++++++----- Modules/_ssl.c | 34 +++++++------ Modules/_threadmodule.c | 7 ++- Modules/clinic/_queuemodule.c.h | 10 ++-- Modules/selectmodule.c | 29 ++++++----- Modules/signalmodule.c | 20 ++++---- Modules/socketmodule.c | 20 ++++---- Python/pytime.c | 85 ++++++++++++++++++++++++--------- Python/thread_nt.h | 14 +++--- Python/thread_pthread.h | 18 ++++--- 11 files changed, 176 insertions(+), 108 deletions(-) diff --git a/Include/cpython/pytime.h b/Include/cpython/pytime.h index 5440720f1ba714..f32148aa8448d8 100644 --- a/Include/cpython/pytime.h +++ b/Include/cpython/pytime.h @@ -27,6 +27,8 @@ // // Some functions clamp the result in the range [_PyTime_MIN; _PyTime_MAX], so // the caller doesn't have to handle errors and doesn't need to hold the GIL. +// For example, _PyTime_Add(t1, t2) computes t1+t2 and clamp the result on +// overflow. // // Clocks: // @@ -215,7 +217,12 @@ PyAPI_FUNC(int) _PyTime_AsTimespec(_PyTime_t t, struct timespec *ts); PyAPI_FUNC(void) _PyTime_AsTimespec_clamp(_PyTime_t t, struct timespec *ts); #endif + +// Compute t1 + t2. Clamp to [_PyTime_MIN; _PyTime_MAX] on overflow. +PyAPI_FUNC(_PyTime_t) _PyTime_Add(_PyTime_t t1, _PyTime_t t2); + /* Compute ticks * mul / div. + Clamp to [_PyTime_MIN; _PyTime_MAX] on overflow. The caller must ensure that ((div - 1) * mul) cannot overflow. */ PyAPI_FUNC(_PyTime_t) _PyTime_MulDiv(_PyTime_t ticks, _PyTime_t mul, @@ -299,6 +306,15 @@ PyAPI_FUNC(int) _PyTime_GetPerfCounterWithInfo( _PyTime_t *t, _Py_clock_info_t *info); + +// Create a deadline. +// Pseudo code: _PyTime_GetMonotonicClock() + timeout. +PyAPI_FUNC(_PyTime_t) _PyDeadline_Init(_PyTime_t timeout); + +// Get remaining time from a deadline. +// Pseudo code: deadline - _PyTime_GetMonotonicClock(). +PyAPI_FUNC(_PyTime_t) _PyDeadline_Get(_PyTime_t deadline); + #ifdef __cplusplus } #endif diff --git a/Modules/_queuemodule.c b/Modules/_queuemodule.c index b6769e6b7764ef..eb61349b76581d 100644 --- a/Modules/_queuemodule.c +++ b/Modules/_queuemodule.c @@ -182,7 +182,7 @@ _queue.SimpleQueue.get cls: defining_class / block: bool = True - timeout: object = None + timeout as timeout_obj: object = None Remove and return an item from the queue. @@ -198,11 +198,11 @@ in that case). static PyObject * _queue_SimpleQueue_get_impl(simplequeueobject *self, PyTypeObject *cls, - int block, PyObject *timeout) -/*[clinic end generated code: output=1969aefa7db63666 input=5fc4d56b9a54757e]*/ + int block, PyObject *timeout_obj) +/*[clinic end generated code: output=5c2cca914cd1e55b input=5b4047bfbc645ec1]*/ { _PyTime_t endtime = 0; - _PyTime_t timeout_val; + _PyTime_t timeout; PyObject *item; PyLockStatus r; PY_TIMEOUT_T microseconds; @@ -211,24 +211,25 @@ _queue_SimpleQueue_get_impl(simplequeueobject *self, PyTypeObject *cls, /* Non-blocking */ microseconds = 0; } - else if (timeout != Py_None) { + else if (timeout_obj != Py_None) { /* With timeout */ - if (_PyTime_FromSecondsObject(&timeout_val, - timeout, _PyTime_ROUND_CEILING) < 0) + if (_PyTime_FromSecondsObject(&timeout, + timeout_obj, _PyTime_ROUND_CEILING) < 0) { return NULL; - if (timeout_val < 0) { + } + if (timeout < 0) { PyErr_SetString(PyExc_ValueError, "'timeout' must be a non-negative number"); return NULL; } - microseconds = _PyTime_AsMicroseconds(timeout_val, + microseconds = _PyTime_AsMicroseconds(timeout, _PyTime_ROUND_CEILING); if (microseconds > PY_TIMEOUT_MAX) { PyErr_SetString(PyExc_OverflowError, "timeout value is too large"); return NULL; } - endtime = _PyTime_GetMonotonicClock() + timeout_val; + endtime = _PyDeadline_Init(timeout); } else { /* Infinitely blocking */ @@ -247,6 +248,7 @@ _queue_SimpleQueue_get_impl(simplequeueobject *self, PyTypeObject *cls, r = PyThread_acquire_lock_timed(self->lock, microseconds, 1); Py_END_ALLOW_THREADS } + if (r == PY_LOCK_INTR && Py_MakePendingCalls() < 0) { return NULL; } @@ -258,12 +260,15 @@ _queue_SimpleQueue_get_impl(simplequeueobject *self, PyTypeObject *cls, return NULL; } self->locked = 1; + /* Adjust timeout for next iteration (if any) */ - if (endtime > 0) { - timeout_val = endtime - _PyTime_GetMonotonicClock(); - microseconds = _PyTime_AsMicroseconds(timeout_val, _PyTime_ROUND_CEILING); + if (microseconds > 0) { + timeout = _PyDeadline_Get(endtime); + microseconds = _PyTime_AsMicroseconds(timeout, + _PyTime_ROUND_CEILING); } } + /* BEGIN GIL-protected critical section */ assert(self->lst_pos < PyList_GET_SIZE(self->lst)); item = simplequeue_pop_item(self); diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 411314f6d0f01b..fedb35b5778b31 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -949,8 +949,9 @@ _ssl__SSLSocket_do_handshake_impl(PySSLSocket *self) timeout = GET_SOCKET_TIMEOUT(sock); has_timeout = (timeout > 0); - if (has_timeout) - deadline = _PyTime_GetMonotonicClock() + timeout; + if (has_timeout) { + deadline = _PyDeadline_Init(timeout); + } /* Actually negotiate SSL connection */ /* XXX If SSL_do_handshake() returns 0, it's also a failure. */ @@ -965,7 +966,7 @@ _ssl__SSLSocket_do_handshake_impl(PySSLSocket *self) goto error; if (has_timeout) - timeout = deadline - _PyTime_GetMonotonicClock(); + timeout = _PyDeadline_Get(deadline); if (err.ssl == SSL_ERROR_WANT_READ) { sockstate = PySSL_select(sock, 0, timeout); @@ -2326,8 +2327,9 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b) timeout = GET_SOCKET_TIMEOUT(sock); has_timeout = (timeout > 0); - if (has_timeout) - deadline = _PyTime_GetMonotonicClock() + timeout; + if (has_timeout) { + deadline = _PyDeadline_Init(timeout); + } sockstate = PySSL_select(sock, 1, timeout); if (sockstate == SOCKET_HAS_TIMED_OUT) { @@ -2354,8 +2356,9 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b) if (PyErr_CheckSignals()) goto error; - if (has_timeout) - timeout = deadline - _PyTime_GetMonotonicClock(); + if (has_timeout) { + timeout = _PyDeadline_Get(deadline); + } if (err.ssl == SSL_ERROR_WANT_READ) { sockstate = PySSL_select(sock, 0, timeout); @@ -2494,7 +2497,7 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, Py_ssize_t len, timeout = GET_SOCKET_TIMEOUT(sock); has_timeout = (timeout > 0); if (has_timeout) - deadline = _PyTime_GetMonotonicClock() + timeout; + deadline = _PyDeadline_Init(timeout); do { PySSL_BEGIN_ALLOW_THREADS @@ -2506,8 +2509,9 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, Py_ssize_t len, if (PyErr_CheckSignals()) goto error; - if (has_timeout) - timeout = deadline - _PyTime_GetMonotonicClock(); + if (has_timeout) { + timeout = _PyDeadline_Get(deadline); + } if (err.ssl == SSL_ERROR_WANT_READ) { sockstate = PySSL_select(sock, 0, timeout); @@ -2592,8 +2596,9 @@ _ssl__SSLSocket_shutdown_impl(PySSLSocket *self) timeout = GET_SOCKET_TIMEOUT(sock); has_timeout = (timeout > 0); - if (has_timeout) - deadline = _PyTime_GetMonotonicClock() + timeout; + if (has_timeout) { + deadline = _PyDeadline_Init(timeout); + } while (1) { PySSL_BEGIN_ALLOW_THREADS @@ -2626,8 +2631,9 @@ _ssl__SSLSocket_shutdown_impl(PySSLSocket *self) continue; } - if (has_timeout) - timeout = deadline - _PyTime_GetMonotonicClock(); + if (has_timeout) { + timeout = _PyDeadline_Get(deadline); + } /* Possibly retry shutdown until timeout or failure */ if (err.ssl == SSL_ERROR_WANT_READ) diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index fa7e6d0e09d182..543d82d0b93824 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -84,13 +84,12 @@ lock_dealloc(lockobject *self) static PyLockStatus acquire_timed(PyThread_type_lock lock, _PyTime_t timeout) { - PyLockStatus r; _PyTime_t endtime = 0; - if (timeout > 0) { - endtime = _PyTime_GetMonotonicClock() + timeout; + endtime = _PyDeadline_Init(timeout); } + PyLockStatus r; do { _PyTime_t microseconds; microseconds = _PyTime_AsMicroseconds(timeout, _PyTime_ROUND_CEILING); @@ -114,7 +113,7 @@ acquire_timed(PyThread_type_lock lock, _PyTime_t timeout) /* If we're using a timeout, recompute the timeout after processing * signals, since those can take time. */ if (timeout > 0) { - timeout = endtime - _PyTime_GetMonotonicClock(); + timeout = _PyDeadline_Get(endtime); /* Check for negative values, since those mean block forever. */ diff --git a/Modules/clinic/_queuemodule.c.h b/Modules/clinic/_queuemodule.c.h index d9522562359e64..22d2e992b6398d 100644 --- a/Modules/clinic/_queuemodule.c.h +++ b/Modules/clinic/_queuemodule.c.h @@ -139,7 +139,7 @@ PyDoc_STRVAR(_queue_SimpleQueue_get__doc__, static PyObject * _queue_SimpleQueue_get_impl(simplequeueobject *self, PyTypeObject *cls, - int block, PyObject *timeout); + int block, PyObject *timeout_obj); static PyObject * _queue_SimpleQueue_get(simplequeueobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) @@ -148,13 +148,13 @@ _queue_SimpleQueue_get(simplequeueobject *self, PyTypeObject *cls, PyObject *con static const char * const _keywords[] = {"block", "timeout", NULL}; static _PyArg_Parser _parser = {"|pO:get", _keywords, 0}; int block = 1; - PyObject *timeout = Py_None; + PyObject *timeout_obj = Py_None; if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &block, &timeout)) { + &block, &timeout_obj)) { goto exit; } - return_value = _queue_SimpleQueue_get_impl(self, cls, block, timeout); + return_value = _queue_SimpleQueue_get_impl(self, cls, block, timeout_obj); exit: return return_value; @@ -248,4 +248,4 @@ _queue_SimpleQueue_qsize(simplequeueobject *self, PyObject *Py_UNUSED(ignored)) exit: return return_value; } -/*[clinic end generated code: output=96cc57168d72aab1 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=acfaf0191d8935db input=a9049054013a1b77]*/ diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index b71b2c4f6c037d..ff1c028d0d6720 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -318,8 +318,9 @@ select_select_impl(PyObject *module, PyObject *rlist, PyObject *wlist, if (omax > max) max = omax; if (emax > max) max = emax; - if (tvp) - deadline = _PyTime_GetMonotonicClock() + timeout; + if (tvp) { + deadline = _PyDeadline_Init(timeout); + } do { Py_BEGIN_ALLOW_THREADS @@ -335,7 +336,7 @@ select_select_impl(PyObject *module, PyObject *rlist, PyObject *wlist, goto finally; if (tvp) { - timeout = deadline - _PyTime_GetMonotonicClock(); + timeout = _PyDeadline_Get(deadline); if (timeout < 0) { /* bpo-35310: lists were unmodified -- clear them explicitly */ FD_ZERO(&ifdset); @@ -599,7 +600,7 @@ select_poll_poll_impl(pollObject *self, PyObject *timeout_obj) } if (timeout >= 0) { - deadline = _PyTime_GetMonotonicClock() + timeout; + deadline = _PyDeadline_Init(timeout); } } @@ -646,7 +647,7 @@ select_poll_poll_impl(pollObject *self, PyObject *timeout_obj) } if (timeout >= 0) { - timeout = deadline - _PyTime_GetMonotonicClock(); + timeout = _PyDeadline_Get(deadline); if (timeout < 0) { poll_result = 0; break; @@ -938,8 +939,9 @@ select_devpoll_poll_impl(devpollObject *self, PyObject *timeout_obj) dvp.dp_nfds = self->max_n_fds; dvp.dp_timeout = (int)ms; - if (timeout >= 0) - deadline = _PyTime_GetMonotonicClock() + timeout; + if (timeout >= 0) { + deadline = _PyDeadline_Init(timeout); + } do { /* call devpoll() */ @@ -956,7 +958,7 @@ select_devpoll_poll_impl(devpollObject *self, PyObject *timeout_obj) return NULL; if (timeout >= 0) { - timeout = deadline - _PyTime_GetMonotonicClock(); + timeout = _PyDeadline_Get(deadline); if (timeout < 0) { poll_result = 0; break; @@ -1550,7 +1552,7 @@ select_epoll_poll_impl(pyEpoll_Object *self, PyObject *timeout_obj, } if (timeout >= 0) { - deadline = _PyTime_GetMonotonicClock() + timeout; + deadline = _PyDeadline_Init(timeout); } } @@ -1584,7 +1586,7 @@ select_epoll_poll_impl(pyEpoll_Object *self, PyObject *timeout_obj, goto error; if (timeout >= 0) { - timeout = deadline - _PyTime_GetMonotonicClock(); + timeout = _PyDeadline_Get(deadline); if (timeout < 0) { nfds = 0; break; @@ -2172,8 +2174,9 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist, } } - if (ptimeoutspec) - deadline = _PyTime_GetMonotonicClock() + timeout; + if (ptimeoutspec) { + deadline = _PyDeadline_Init(timeout); + } do { Py_BEGIN_ALLOW_THREADS @@ -2190,7 +2193,7 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist, goto error; if (ptimeoutspec) { - timeout = deadline - _PyTime_GetMonotonicClock(); + timeout = _PyDeadline_Get(deadline); if (timeout < 0) { gotevents = 0; break; diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index fc58cfd2084c73..8b7ef2cc688fea 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1221,11 +1221,7 @@ signal_sigtimedwait_impl(PyObject *module, sigset_t sigset, PyObject *timeout_obj) /*[clinic end generated code: output=59c8971e8ae18a64 input=87fd39237cf0b7ba]*/ { - struct timespec ts; - siginfo_t si; - int res; - _PyTime_t timeout, deadline, monotonic; - + _PyTime_t timeout; if (_PyTime_FromSecondsObject(&timeout, timeout_obj, _PyTime_ROUND_CEILING) < 0) return NULL; @@ -1235,12 +1231,16 @@ signal_sigtimedwait_impl(PyObject *module, sigset_t sigset, return NULL; } - deadline = _PyTime_GetMonotonicClock() + timeout; + _PyTime_t deadline = _PyDeadline_Init(timeout); + siginfo_t si; do { - if (_PyTime_AsTimespec(timeout, &ts) < 0) + struct timespec ts; + if (_PyTime_AsTimespec(timeout, &ts) < 0) { return NULL; + } + int res; Py_BEGIN_ALLOW_THREADS res = sigtimedwait(&sigset, &si, &ts); Py_END_ALLOW_THREADS @@ -1259,10 +1259,10 @@ signal_sigtimedwait_impl(PyObject *module, sigset_t sigset, if (PyErr_CheckSignals()) return NULL; - monotonic = _PyTime_GetMonotonicClock(); - timeout = deadline - monotonic; - if (timeout < 0) + timeout = _PyDeadline_Get(deadline); + if (timeout < 0) { break; + } } while (1); return fill_siginfo(&si); diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index f474869c94dc22..98212274b46a9e 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -840,18 +840,20 @@ sock_call_ex(PySocketSockObject *s, if (deadline_initialized) { /* recompute the timeout */ - interval = deadline - _PyTime_GetMonotonicClock(); + interval = _PyDeadline_Get(deadline); } else { deadline_initialized = 1; - deadline = _PyTime_GetMonotonicClock() + timeout; + deadline = _PyDeadline_Init(timeout); interval = timeout; } - if (interval >= 0) + if (interval >= 0) { res = internal_select(s, writing, interval, connect); - else + } + else { res = 1; + } } else { res = internal_select(s, writing, timeout, connect); @@ -4176,7 +4178,7 @@ sock_sendall(PySocketSockObject *s, PyObject *args) Py_buffer pbuf; struct sock_send ctx; int has_timeout = (s->sock_timeout > 0); - _PyTime_t interval = s->sock_timeout; + _PyTime_t timeout = s->sock_timeout; _PyTime_t deadline = 0; int deadline_initialized = 0; PyObject *res = NULL; @@ -4195,14 +4197,14 @@ sock_sendall(PySocketSockObject *s, PyObject *args) if (has_timeout) { if (deadline_initialized) { /* recompute the timeout */ - interval = deadline - _PyTime_GetMonotonicClock(); + timeout = _PyDeadline_Get(deadline); } else { deadline_initialized = 1; - deadline = _PyTime_GetMonotonicClock() + s->sock_timeout; + deadline = _PyDeadline_Init(timeout); } - if (interval <= 0) { + if (timeout <= 0) { PyErr_SetString(PyExc_TimeoutError, "timed out"); goto done; } @@ -4211,7 +4213,7 @@ sock_sendall(PySocketSockObject *s, PyObject *args) ctx.buf = buf; ctx.len = len; ctx.flags = flags; - if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0) + if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, timeout) < 0) goto done; n = ctx.result; assert(n >= 0); diff --git a/Python/pytime.c b/Python/pytime.c index 7fd03ea576d271..8865638e91c234 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -73,30 +73,43 @@ pytime_as_nanoseconds(_PyTime_t t) } -// Compute t + t2. Clamp to [_PyTime_MIN; _PyTime_MAX] on overflow. +// Compute t1 + t2. Clamp to [_PyTime_MIN; _PyTime_MAX] on overflow. static inline int -pytime_add(_PyTime_t *t, _PyTime_t t2) +pytime_add(_PyTime_t *t1, _PyTime_t t2) { - if (t2 > 0 && *t > _PyTime_MAX - t2) { - *t = _PyTime_MAX; + if (t2 > 0 && *t1 > _PyTime_MAX - t2) { + *t1 = _PyTime_MAX; return -1; } - else if (t2 < 0 && *t < _PyTime_MIN - t2) { - *t = _PyTime_MIN; + else if (t2 < 0 && *t1 < _PyTime_MIN - t2) { + *t1 = _PyTime_MIN; return -1; } else { - *t += t2; + *t1 += t2; return 0; } } +_PyTime_t +_PyTime_Add(_PyTime_t t1, _PyTime_t t2) +{ + (void)pytime_add(&t1, t2); + return t1; +} + + static inline int -_PyTime_check_mul_overflow(_PyTime_t a, _PyTime_t b) +pytime_mul_check_overflow(_PyTime_t a, _PyTime_t b) { - assert(b > 0); - return ((a < _PyTime_MIN / b) || (_PyTime_MAX / b < a)); + if (b != 0) { + assert(b > 0); + return ((a < _PyTime_MIN / b) || (_PyTime_MAX / b < a)); + } + else { + return 0; + } } @@ -104,8 +117,8 @@ _PyTime_check_mul_overflow(_PyTime_t a, _PyTime_t b) static inline int pytime_mul(_PyTime_t *t, _PyTime_t k) { - assert(k > 0); - if (_PyTime_check_mul_overflow(*t, k)) { + assert(k >= 0); + if (pytime_mul_check_overflow(*t, k)) { *t = (*t >= 0) ? _PyTime_MAX : _PyTime_MIN; return -1; } @@ -116,21 +129,31 @@ pytime_mul(_PyTime_t *t, _PyTime_t k) } +// Compute t * k. Clamp to [_PyTime_MIN; _PyTime_MAX] on overflow. +static inline _PyTime_t +_PyTime_Mul(_PyTime_t t, _PyTime_t k) +{ + (void)pytime_mul(&t, k); + return t; +} + + + + _PyTime_t _PyTime_MulDiv(_PyTime_t ticks, _PyTime_t mul, _PyTime_t div) { - _PyTime_t intpart, remaining; - /* Compute (ticks * mul / div) in two parts to prevent integer overflow: - compute integer part, and then the remaining part. + /* Compute (ticks * mul / div) in two parts to reduce the risk of integer + overflow: compute the integer part, and then the remaining part. (ticks * mul) / div == (ticks / div) * mul + (ticks % div) * mul / div - - The caller must ensure that "(div - 1) * mul" cannot overflow. */ + */ + _PyTime_t intpart, remaining; intpart = ticks / div; ticks %= div; - remaining = ticks * mul; - remaining /= div; - return intpart * mul + remaining; + remaining = _PyTime_Mul(ticks, mul) / div; + // intpart * mul + remaining + return _PyTime_Add(_PyTime_Mul(intpart, mul), remaining); } @@ -505,7 +528,6 @@ pytime_from_object(_PyTime_t *tp, PyObject *obj, _PyTime_round_t round, return pytime_from_double(tp, d, round, unit_to_ns); } else { - Py_BUILD_ASSERT(sizeof(long long) <= sizeof(_PyTime_t)); long long sec = PyLong_AsLongLong(obj); if (sec == -1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) { @@ -514,11 +536,12 @@ pytime_from_object(_PyTime_t *tp, PyObject *obj, _PyTime_round_t round, return -1; } - if (_PyTime_check_mul_overflow(sec, unit_to_ns)) { + Py_BUILD_ASSERT(sizeof(long long) <= sizeof(_PyTime_t)); + _PyTime_t ns = (_PyTime_t)sec; + if (pytime_mul(&ns, unit_to_ns) < 0) { pytime_overflow(); return -1; } - _PyTime_t ns = sec * unit_to_ns; *tp = pytime_from_nanoseconds(ns); return 0; @@ -1292,3 +1315,19 @@ _PyTime_gmtime(time_t t, struct tm *tm) return 0; #endif /* MS_WINDOWS */ } + + +_PyTime_t +_PyDeadline_Init(_PyTime_t timeout) +{ + _PyTime_t now = _PyTime_GetMonotonicClock(); + return _PyTime_Add(now, timeout); +} + + +_PyTime_t +_PyDeadline_Get(_PyTime_t deadline) +{ + _PyTime_t now = _PyTime_GetMonotonicClock(); + return deadline - now; +} diff --git a/Python/thread_nt.h b/Python/thread_nt.h index 26f054ff0ce49b..0dde1a04097389 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -75,20 +75,20 @@ EnterNonRecursiveMutex(PNRMUTEX mutex, DWORD milliseconds) } } } else if (milliseconds != 0) { - /* wait at least until the target */ - _PyTime_t now = _PyTime_GetPerfCounter(); + /* wait at least until the deadline */ _PyTime_t nanoseconds = _PyTime_FromNanoseconds((_PyTime_t)milliseconds * 1000000); - _PyTime_t target = now + nanoseconds; + _PyTime_t deadline = _PyTime_Add(_PyTime_GetPerfCounter(), nanoseconds); while (mutex->locked) { - _PyTime_t microseconds = _PyTime_AsMicroseconds(nanoseconds, _PyTime_ROUND_TIMEOUT); + _PyTime_t microseconds = _PyTime_AsMicroseconds(nanoseconds, + _PyTime_ROUND_TIMEOUT); if (PyCOND_TIMEDWAIT(&mutex->cv, &mutex->cs, microseconds) < 0) { result = WAIT_FAILED; break; } - now = _PyTime_GetPerfCounter(); - if (target <= now) + nanoseconds = deadline - _PyTime_GetPerfCounter(); + if (nanoseconds <= 0) { break; - nanoseconds = target - now; + } } } if (!mutex->locked) { diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 9b5e273f1a8bac..12dad7e9e44272 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -438,7 +438,7 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, dprintf(("PyThread_acquire_lock_timed(%p, %lld, %d) called\n", lock, microseconds, intr_flag)); - _PyTime_t timeout; + _PyTime_t timeout; // relative timeout if (microseconds >= 0) { _PyTime_t ns; if (microseconds <= _PyTime_MAX / 1000) { @@ -465,16 +465,13 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, struct timespec abs_timeout; // Local scope for deadline { - _PyTime_t deadline = _PyTime_GetMonotonicClock() + timeout; + _PyTime_t deadline = _PyTime_Add(_PyTime_GetMonotonicClock(), timeout); _PyTime_AsTimespec_clamp(deadline, &abs_timeout); } #else _PyTime_t deadline = 0; - if (timeout > 0 - && !intr_flag - ) - { - deadline = _PyTime_GetMonotonicClock() + timeout; + if (timeout > 0 && !intr_flag) { + deadline = _PyDeadline_Init(timeout); } #endif @@ -484,9 +481,10 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, status = fix_status(sem_clockwait(thelock, CLOCK_MONOTONIC, &abs_timeout)); #else - _PyTime_t abs_timeout = _PyTime_GetSystemClock() + timeout; + _PyTime_t abs_time = _PyTime_Add(_PyTime_GetSystemClock(), + timeout); struct timespec ts; - _PyTime_AsTimespec_clamp(abs_timeout, &ts); + _PyTime_AsTimespec_clamp(abs_time, &ts); status = fix_status(sem_timedwait(thelock, &ts)); #endif } @@ -508,7 +506,7 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, #ifndef HAVE_SEM_CLOCKWAIT if (timeout > 0) { /* wait interrupted by a signal (EINTR): recompute the timeout */ - _PyTime_t timeout = deadline - _PyTime_GetMonotonicClock(); + _PyTime_t timeout = _PyDeadline_Get(deadline); if (timeout < 0) { status = ETIMEDOUT; break; From 1dac95c814763eb8a53896ac4326d8d51895d43d Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Fri, 1 Oct 2021 14:37:56 +0200 Subject: [PATCH 047/263] sqlite3: Modernize documentation around unicode and bytes. (GH-28652) --- Doc/includes/sqlite3/text_factory.py | 4 ++-- Doc/library/sqlite3.rst | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/includes/sqlite3/text_factory.py b/Doc/includes/sqlite3/text_factory.py index a857a155cdd4ff..c0d87cd559118c 100644 --- a/Doc/includes/sqlite3/text_factory.py +++ b/Doc/includes/sqlite3/text_factory.py @@ -3,9 +3,9 @@ con = sqlite3.connect(":memory:") cur = con.cursor() -AUSTRIA = "\xd6sterreich" +AUSTRIA = "Österreich" -# by default, rows are returned as Unicode +# by default, rows are returned as str cur.execute("select ?", (AUSTRIA,)) row = cur.fetchone() assert row[0] == AUSTRIA diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index e6b8b95d2aa52e..eaea7ae390b972 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -537,8 +537,8 @@ Connection Objects Using this attribute you can control what objects are returned for the ``TEXT`` data type. By default, this attribute is set to :class:`str` and the - :mod:`sqlite3` module will return Unicode objects for ``TEXT``. If you want to - return bytestrings instead, you can set it to :class:`bytes`. + :mod:`sqlite3` module will return :class:`str` objects for ``TEXT``. + If you want to return :class:`bytes` instead, you can set it to :class:`bytes`. You can also set it to any other callable that accepts a single bytestring parameter and returns the resulting object. From 9ce0f48e918860ffa32751a85b0fe7967723e2e3 Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Fri, 1 Oct 2021 14:38:49 +0200 Subject: [PATCH 048/263] hashlib: Fix old message about unicode objects. (GH-28653) --- Modules/hashlib.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/hashlib.h b/Modules/hashlib.h index 978593e2f1a0c2..56ae7a5e50bf58 100644 --- a/Modules/hashlib.h +++ b/Modules/hashlib.h @@ -8,7 +8,7 @@ #define GET_BUFFER_VIEW_OR_ERROR(obj, viewp, erraction) do { \ if (PyUnicode_Check((obj))) { \ PyErr_SetString(PyExc_TypeError, \ - "Unicode-objects must be encoded before hashing");\ + "Strings must be encoded before hashing");\ erraction; \ } \ if (!PyObject_CheckBuffer((obj))) { \ From 9eed75fde226cec5a02301cfac1dc8039b5a183e Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Fri, 1 Oct 2021 13:49:46 +0000 Subject: [PATCH 049/263] bpo-45332: Fix broken Decimal test and benchmark (GH-28680) --- Modules/_decimal/tests/bench.py | 5 +---- Modules/_decimal/tests/deccheck.py | 2 +- Modules/_decimal/tests/formathelper.py | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Modules/_decimal/tests/bench.py b/Modules/_decimal/tests/bench.py index 3726db194e032f..24e091b6887ccd 100644 --- a/Modules/_decimal/tests/bench.py +++ b/Modules/_decimal/tests/bench.py @@ -7,10 +7,7 @@ import time -try: - from test.support import import_fresh_module -except ImportError: - from test.test_support import import_fresh_module +from test.support.import_helper import import_fresh_module C = import_fresh_module('decimal', fresh=['_decimal']) P = import_fresh_module('decimal', blocked=['_decimal']) diff --git a/Modules/_decimal/tests/deccheck.py b/Modules/_decimal/tests/deccheck.py index 98ecd502c03fe9..edf753f3704a18 100644 --- a/Modules/_decimal/tests/deccheck.py +++ b/Modules/_decimal/tests/deccheck.py @@ -47,7 +47,7 @@ from queue import Queue, Empty from threading import Thread, Event, Lock -from test.support import import_fresh_module +from test.support.import_helper import import_fresh_module from randdec import randfloat, all_unary, all_binary, all_ternary from randdec import unary_optarg, binary_optarg, ternary_optarg from formathelper import rand_format, rand_locale diff --git a/Modules/_decimal/tests/formathelper.py b/Modules/_decimal/tests/formathelper.py index 19b2aad4a503b1..c3daacfb7b44f4 100644 --- a/Modules/_decimal/tests/formathelper.py +++ b/Modules/_decimal/tests/formathelper.py @@ -31,7 +31,7 @@ import os, sys, locale, random import platform, subprocess -from test.support import import_fresh_module +from test.support.import_helper import import_fresh_module from distutils.spawn import find_executable C = import_fresh_module('decimal', fresh=['_decimal']) From cd760ceb67c5164983838ed7eb73a833d1597da0 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Fri, 1 Oct 2021 15:44:19 +0100 Subject: [PATCH 050/263] Fix a couple of compiler warnings. (GH-28677) --- Python/ceval.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c index ab692fd8ded157..7f29967eb3272f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3666,7 +3666,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr assert(PyDict_CheckExact((PyObject *)dict)); PyObject *name = GETITEM(names, cache0->original_oparg); uint32_t hint = cache1->dk_version_or_hint; - DEOPT_IF(hint >= dict->ma_keys->dk_nentries, LOAD_ATTR); + DEOPT_IF(hint >= (size_t)dict->ma_keys->dk_nentries, LOAD_ATTR); PyDictKeyEntry *ep = DK_ENTRIES(dict->ma_keys) + hint; DEOPT_IF(ep->me_key != name, LOAD_ATTR); res = ep->me_value; @@ -3774,7 +3774,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr assert(PyDict_CheckExact((PyObject *)dict)); PyObject *name = GETITEM(names, cache0->original_oparg); uint32_t hint = cache1->dk_version_or_hint; - DEOPT_IF(hint >= dict->ma_keys->dk_nentries, STORE_ATTR); + DEOPT_IF(hint >= (size_t)dict->ma_keys->dk_nentries, STORE_ATTR); PyDictKeyEntry *ep = DK_ENTRIES(dict->ma_keys) + hint; DEOPT_IF(ep->me_key != name, STORE_ATTR); PyObject *old_value = ep->me_value; From a450398933d265011e1e8eae7f771b70f97945fb Mon Sep 17 00:00:00 2001 From: AngstyDuck Date: Sat, 2 Oct 2021 04:11:08 +0800 Subject: [PATCH 051/263] bpo-44687: Ensure BufferedReader objects with unread buffers can peek even when the underlying file is closed (GH-28457) --- .../next/C API/2021-09-19-17-18-25.bpo-44687.3fqDRC.rst | 1 + Modules/_io/bufferedio.c | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2021-09-19-17-18-25.bpo-44687.3fqDRC.rst diff --git a/Misc/NEWS.d/next/C API/2021-09-19-17-18-25.bpo-44687.3fqDRC.rst b/Misc/NEWS.d/next/C API/2021-09-19-17-18-25.bpo-44687.3fqDRC.rst new file mode 100644 index 00000000000000..d38fa6057f6f99 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-09-19-17-18-25.bpo-44687.3fqDRC.rst @@ -0,0 +1 @@ +:meth:`BufferedReader.peek` no longer raises :exc:`ValueError` when the entire file has already been buffered. diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index 5984d34cc08290..ba966f568b399a 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -341,11 +341,10 @@ _enter_buffered_busy(buffered *self) : buffered_closed(self))) #define CHECK_CLOSED(self, error_msg) \ - if (IS_CLOSED(self)) { \ + if (IS_CLOSED(self) & (Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t) == 0)) { \ PyErr_SetString(PyExc_ValueError, error_msg); \ return NULL; \ - } - + } \ #define VALID_READ_BUFFER(self) \ (self->readable && self->read_end != -1) @@ -530,6 +529,9 @@ buffered_close(buffered *self, PyObject *args) Py_CLEAR(res); } + self->read_end = 0; + self->pos = 0; + end: LEAVE_BUFFERED(self) return res; From 0be338199fd663f020d833a4db185d0c5a0e0078 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Sat, 2 Oct 2021 02:04:55 -0400 Subject: [PATCH 052/263] bpo-45341: Replace 'Packaging' with 'Package' in "Python P... Index" (#28687) pypi.org " The Python Package Index (PyPI) ... --- Doc/distributing/index.rst | 8 ++++---- Doc/installing/index.rst | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Doc/distributing/index.rst b/Doc/distributing/index.rst index 66ba1e9fb9b347..136cf4e77b1543 100644 --- a/Doc/distributing/index.rst +++ b/Doc/distributing/index.rst @@ -31,7 +31,7 @@ installing other Python projects, refer to the Key terms ========= -* the `Python Packaging Index `__ is a public +* the `Python Package Index `__ is a public repository of open source licensed packages made available for use by other Python users * the `Python Packaging Authority @@ -127,14 +127,14 @@ involved in creating and publishing a project: * `Project structure`_ * `Building and packaging the project`_ -* `Uploading the project to the Python Packaging Index`_ +* `Uploading the project to the Python Package Index`_ * `The .pypirc file`_ .. _Project structure: \ https://packaging.python.org/tutorials/packaging-projects/#packaging-python-projects .. _Building and packaging the project: \ https://packaging.python.org/tutorials/packaging-projects/#creating-the-package-files -.. _Uploading the project to the Python Packaging Index: \ +.. _Uploading the project to the Python Package Index: \ https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives .. _The .pypirc file: \ https://packaging.python.org/specifications/pypirc/ @@ -150,7 +150,7 @@ These are quick answers or links for some common tasks. This isn't an easy topic, but here are a few tips: -* check the Python Packaging Index to see if the name is already in use +* check the Python Package Index to see if the name is already in use * check popular hosting sites like GitHub, Bitbucket, etc to see if there is already a project with that name * check what comes up in a web search for the name you're considering diff --git a/Doc/installing/index.rst b/Doc/installing/index.rst index 5e7e03045b2acc..4bacc7ba0c2cf2 100644 --- a/Doc/installing/index.rst +++ b/Doc/installing/index.rst @@ -44,7 +44,7 @@ Key terms ``venv``. It allows virtual environments to be used on versions of Python prior to 3.4, which either don't provide ``venv`` at all, or aren't able to automatically install ``pip`` into created environments. -* The `Python Packaging Index `__ is a public +* The `Python Package Index `__ is a public repository of open source licensed packages made available for use by other Python users. * the `Python Packaging Authority @@ -78,7 +78,7 @@ The standard packaging tools are all designed to be used from the command line. The following command will install the latest version of a module and its -dependencies from the Python Packaging Index:: +dependencies from the Python Package Index:: python -m pip install SomePackage @@ -226,7 +226,7 @@ the installation process. With the introduction of support for the binary ``wheel`` format, and the ability to publish wheels for at least Windows and macOS through the -Python Packaging Index, this problem is expected to diminish over time, +Python Package Index, this problem is expected to diminish over time, as users are more regularly able to install pre-built extensions rather than needing to build them themselves. From 417faa69bd48dfc22e4eff9bb2c610f53d59d02f Mon Sep 17 00:00:00 2001 From: native-api Date: Sat, 2 Oct 2021 12:38:59 +0300 Subject: [PATCH 053/263] Makefile: Fix missing slashes (GH-28659) --- Makefile.pre.in | 4 ++-- Misc/NEWS.d/next/Build/2021-10-01-12-20-05.bpo-0.2ykYK2.rst | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-10-01-12-20-05.bpo-0.2ykYK2.rst diff --git a/Makefile.pre.in b/Makefile.pre.in index 670887437360cc..ce75af1b79c81a 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1443,13 +1443,13 @@ altbininstall: $(BUILDPYTHON) @FRAMEWORKPYTHONW@ fi; \ fi if test "x$(LIPO_32BIT_FLAGS)" != "x" ; then \ - rm -f $(DESTDIR)$(BINDIR)python$(VERSION)-32$(EXE); \ + rm -f $(DESTDIR)$(BINDIR)/python$(VERSION)-32$(EXE); \ lipo $(LIPO_32BIT_FLAGS) \ -output $(DESTDIR)$(BINDIR)/python$(VERSION)-32$(EXE) \ $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE); \ fi if test "x$(LIPO_INTEL64_FLAGS)" != "x" ; then \ - rm -f $(DESTDIR)$(BINDIR)python$(VERSION)-intel64$(EXE); \ + rm -f $(DESTDIR)$(BINDIR)/python$(VERSION)-intel64$(EXE); \ lipo $(LIPO_INTEL64_FLAGS) \ -output $(DESTDIR)$(BINDIR)/python$(VERSION)-intel64$(EXE) \ $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE); \ diff --git a/Misc/NEWS.d/next/Build/2021-10-01-12-20-05.bpo-0.2ykYK2.rst b/Misc/NEWS.d/next/Build/2021-10-01-12-20-05.bpo-0.2ykYK2.rst new file mode 100644 index 00000000000000..a0ab4baf7952b3 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-10-01-12-20-05.bpo-0.2ykYK2.rst @@ -0,0 +1 @@ +Makefile: fix missing slashes in some invocations cleaning previous build results when builing a macOS universal binary. \ No newline at end of file From 0742abdc48886b74ed3b66985a54bb1c32802670 Mon Sep 17 00:00:00 2001 From: TAGAMI Yukihiro Date: Sat, 2 Oct 2021 18:57:13 +0900 Subject: [PATCH 054/263] bpo-45329: Fix freed memory access in pyexpat.c (GH-28649) --- .../next/Library/2021-10-01-13-09-53.bpo-45329.9iMYaO.rst | 2 ++ Modules/pyexpat.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2021-10-01-13-09-53.bpo-45329.9iMYaO.rst diff --git a/Misc/NEWS.d/next/Library/2021-10-01-13-09-53.bpo-45329.9iMYaO.rst b/Misc/NEWS.d/next/Library/2021-10-01-13-09-53.bpo-45329.9iMYaO.rst new file mode 100644 index 00000000000000..b4bedbc278edf1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-10-01-13-09-53.bpo-45329.9iMYaO.rst @@ -0,0 +1,2 @@ +Fix freed memory access in :class:`pyexpat.xmlparser` when building it with an +installed expat library <= 2.2.0. diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index ec684638ead118..b3d9bdda7e7ac5 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1204,10 +1204,10 @@ static void xmlparse_dealloc(xmlparseobject *self) { PyObject_GC_UnTrack(self); + (void)xmlparse_clear(self); if (self->itself != NULL) XML_ParserFree(self->itself); self->itself = NULL; - (void)xmlparse_clear(self); if (self->handlers != NULL) { PyMem_Free(self->handlers); From db91b058d5d4fbff4185982095d90fe6a2741aed Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 2 Oct 2021 13:48:08 -0500 Subject: [PATCH 055/263] bpo-45346: Keep docs consistent regarding true and false values (GH-28697) --- Doc/library/ast.rst | 2 +- Doc/reference/compound_stmts.rst | 8 ++++---- Lib/test/test_builtin.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index e21151bd4ef792..d84c841fa4a08e 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -1266,7 +1266,7 @@ Pattern matching the pattern matches the subject. ``body`` contains a list of nodes to execute if the pattern matches and - the result of evaluating the guard expression is truthy. + the result of evaluating the guard expression is true. .. doctest:: diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index f24222f5fd9e94..5936cdf5ffc304 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -585,8 +585,8 @@ Here's an overview of the logical flow of a match statement: #. If the pattern succeeds, the corresponding guard (if present) is evaluated. In this case all name bindings are guaranteed to have happened. - * If the guard evaluates as truthy or missing, the ``block`` inside ``case_block`` is - executed. + * If the guard evaluates as true or is missing, the ``block`` inside + ``case_block`` is executed. * Otherwise, the next ``case_block`` is attempted as described above. @@ -637,10 +637,10 @@ The logical flow of a ``case`` block with a ``guard`` follows: #. If the pattern succeeded, evaluate the ``guard``. - * If the ``guard`` condition evaluates to "truthy", the case block is + * If the ``guard`` condition evaluates as true, the case block is selected. - * If the ``guard`` condition evaluates to "falsy", the case block is not + * If the ``guard`` condition evaluates as false, the case block is not selected. * If the ``guard`` raises an exception during evaluation, the exception diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index bd8353d038b6fe..6dc4fa555021cc 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -1861,7 +1861,7 @@ def test_warning_notimplemented(self): # be evaluated in a boolean context (virtually all such use cases # are a result of accidental misuse implementing rich comparison # operations in terms of one another). - # For the time being, it will continue to evaluate as truthy, but + # For the time being, it will continue to evaluate as a true value, but # issue a deprecation warning (with the eventual intent to make it # a TypeError). self.assertWarns(DeprecationWarning, bool, NotImplemented) From dc878240dcbb47e660f5ad094deba5381872f2c9 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 2 Oct 2021 13:52:05 -0500 Subject: [PATCH 056/263] Fix spelling error in comment (GH-28696) --- Objects/setobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/setobject.c b/Objects/setobject.c index a3cdd33664d089..f71417d9f6dedd 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -16,7 +16,7 @@ reduces the cost of hash collisions because consecutive memory accesses tend to be much cheaper than scattered probes. After LINEAR_PROBES steps, we then use more of the upper bits from the hash value and apply a simple - linear congruential random number genearator. This helps break-up long + linear congruential random number generator. This helps break-up long chains of collisions. All arithmetic on hash should ignore overflow. From a5a56154f14f3f4656a510e8b79e96d06289e654 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 3 Oct 2021 16:58:14 +0300 Subject: [PATCH 057/263] Remove trailing spaces. (GH-28706) --- Lib/test/test_syntax.py | 4 ++-- Lib/test/test_tokenize.py | 2 +- Modules/termios.c | 2 +- Python/Python-tokenize.c | 2 +- Python/bltinmodule.c | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index f4a507e91faa23..3ce362788da6e0 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -1299,7 +1299,7 @@ def _check_error(self, code, errtext, self.assertEqual(err.end_lineno, end_lineno) if end_offset is not None: self.assertEqual(err.end_offset, end_offset) - + else: self.fail("compile() did not raise SyntaxError") @@ -1439,7 +1439,7 @@ def test_kwargs_last3(self): self._check_error("int(**{'base': 10}, *['2'])", "iterable argument unpacking follows " "keyword argument unpacking") - + def test_generator_in_function_call(self): self._check_error("foo(x, y for y in range(3) for z in range(2) if z , p)", "Generator expression must be parenthesized", diff --git a/Lib/test/test_tokenize.py b/Lib/test/test_tokenize.py index f8b16e52976451..ca2821de7c0816 100644 --- a/Lib/test/test_tokenize.py +++ b/Lib/test/test_tokenize.py @@ -1933,7 +1933,7 @@ def test_string(self): c"""', """\ STRING 'rb"\""a\\\\\\nb\\\\\\nc"\""' (1, 0) (3, 4) """) - + self.check_tokenize('f"abc"', """\ STRING 'f"abc"' (1, 0) (1, 6) """) diff --git a/Modules/termios.c b/Modules/termios.c index 38573e25f51dd8..354e5ca18d04d8 100644 --- a/Modules/termios.c +++ b/Modules/termios.c @@ -408,7 +408,7 @@ termios_tcsetwinsize_impl(PyObject *module, int fd, PyObject *winsz) } Py_XDECREF(tmp_item); tmp_item = PySequence_GetItem(winsz, 1); - winsz_1 = PyLong_AsLong(tmp_item); + winsz_1 = PyLong_AsLong(tmp_item); if (winsz_1 == -1 && PyErr_Occurred()) { Py_XDECREF(tmp_item); return NULL; diff --git a/Python/Python-tokenize.c b/Python/Python-tokenize.c index 2933b5b7b1e202..fa713282558b03 100644 --- a/Python/Python-tokenize.c +++ b/Python/Python-tokenize.c @@ -150,7 +150,7 @@ static PyMethodDef tokenize_methods[] = { }; static PyModuleDef_Slot tokenizemodule_slots[] = { - {Py_mod_exec, tokenizemodule_exec}, + {Py_mod_exec, tokenizemodule_exec}, {0, NULL} }; diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index d0d31805b3018d..1f038166890fde 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -2485,7 +2485,7 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start) switch (Py_SIZE(item)) { case -1: b = -(sdigit) ((PyLongObject*)item)->ob_digit[0]; break; // Note: the continue goes to the top of the "while" loop that iterates over the elements - case 0: Py_DECREF(item); continue; + case 0: Py_DECREF(item); continue; case 1: b = ((PyLongObject*)item)->ob_digit[0]; break; default: b = PyLong_AsLongAndOverflow(item, &overflow); break; } From 4f6e0680d0d8545aa151ccd9de56a39bfe9532a2 Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Sun, 3 Oct 2021 16:21:31 +0200 Subject: [PATCH 058/263] Remove news entry without bpo issue number. (GH-28703) I'm just removing an erroneous NEWS entry I previously merged. Automerge-Triggered-By: GH:JulienPalard --- Misc/NEWS.d/next/Build/2021-10-01-12-20-05.bpo-0.2ykYK2.rst | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Misc/NEWS.d/next/Build/2021-10-01-12-20-05.bpo-0.2ykYK2.rst diff --git a/Misc/NEWS.d/next/Build/2021-10-01-12-20-05.bpo-0.2ykYK2.rst b/Misc/NEWS.d/next/Build/2021-10-01-12-20-05.bpo-0.2ykYK2.rst deleted file mode 100644 index a0ab4baf7952b3..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-10-01-12-20-05.bpo-0.2ykYK2.rst +++ /dev/null @@ -1 +0,0 @@ -Makefile: fix missing slashes in some invocations cleaning previous build results when builing a macOS universal binary. \ No newline at end of file From 60b9e040c9cf40e69f42c0008e564458aa0379e8 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 3 Oct 2021 21:22:42 +0300 Subject: [PATCH 059/263] bpo-45355: Use sizeof(_Py_CODEUNIT) instead of literal 2 for the size of the code unit (GH-28711) --- Modules/_tracemalloc.c | 2 +- Objects/frameobject.c | 4 ++-- Objects/genobject.c | 2 +- Python/ceval.c | 18 +++++++++--------- Python/traceback.c | 4 ++-- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c index fc3d7f51ee29a1..09d18fb8f278f0 100644 --- a/Modules/_tracemalloc.c +++ b/Modules/_tracemalloc.c @@ -302,7 +302,7 @@ static void tracemalloc_get_frame(InterpreterFrame *pyframe, frame_t *frame) { frame->filename = unknown_filename; - int lineno = PyCode_Addr2Line(pyframe->f_code, pyframe->f_lasti*2); + int lineno = PyCode_Addr2Line(pyframe->f_code, pyframe->f_lasti*sizeof(_Py_CODEUNIT)); if (lineno < 0) { lineno = 0; } diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 00d6888ff2a2ac..b743dc72eee790 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -45,7 +45,7 @@ PyFrame_GetLineNumber(PyFrameObject *f) return f->f_lineno; } else { - return PyCode_Addr2Line(f->f_frame->f_code, f->f_frame->f_lasti*2); + return PyCode_Addr2Line(f->f_frame->f_code, f->f_frame->f_lasti*sizeof(_Py_CODEUNIT)); } } @@ -67,7 +67,7 @@ frame_getlasti(PyFrameObject *f, void *closure) if (f->f_frame->f_lasti < 0) { return PyLong_FromLong(-1); } - return PyLong_FromLong(f->f_frame->f_lasti*2); + return PyLong_FromLong(f->f_frame->f_lasti*sizeof(_Py_CODEUNIT)); } static PyObject * diff --git a/Objects/genobject.c b/Objects/genobject.c index be9238d9b6cfd3..8bd6c8d2c4ccc7 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -1284,7 +1284,7 @@ compute_cr_origin(int origin_depth) PyCodeObject *code = frame->f_code; PyObject *frameinfo = Py_BuildValue("OiO", code->co_filename, - PyCode_Addr2Line(frame->f_code, frame->f_lasti*2), + PyCode_Addr2Line(frame->f_code, frame->f_lasti*sizeof(_Py_CODEUNIT)), code->co_name); if (!frameinfo) { Py_DECREF(cr_origin); diff --git a/Python/ceval.c b/Python/ceval.c index 7f29967eb3272f..c951e563cd7a10 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4815,7 +4815,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr #endif fprintf(stderr, "XXX lineno: %d, opcode: %d\n", - PyCode_Addr2Line(frame->f_code, frame->f_lasti*2), + PyCode_Addr2Line(frame->f_code, frame->f_lasti*sizeof(_Py_CODEUNIT)), opcode); _PyErr_SetString(tstate, PyExc_SystemError, "unknown opcode"); goto error; @@ -5996,7 +5996,7 @@ call_trace(Py_tracefunc func, PyObject *obj, } else { initialize_trace_info(&tstate->trace_info, frame); - f->f_lineno = _PyCode_CheckLineNumber(frame->f_lasti*2, &tstate->trace_info.bounds); + f->f_lineno = _PyCode_CheckLineNumber(frame->f_lasti*sizeof(_Py_CODEUNIT), &tstate->trace_info.bounds); } result = func(obj, f, what, arg); f->f_lineno = 0; @@ -6035,8 +6035,8 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj, then call the trace function if we're tracing source lines. */ initialize_trace_info(&tstate->trace_info, frame); - int lastline = _PyCode_CheckLineNumber(instr_prev*2, &tstate->trace_info.bounds); - int line = _PyCode_CheckLineNumber(frame->f_lasti*2, &tstate->trace_info.bounds); + int lastline = _PyCode_CheckLineNumber(instr_prev*sizeof(_Py_CODEUNIT), &tstate->trace_info.bounds); + int line = _PyCode_CheckLineNumber(frame->f_lasti*sizeof(_Py_CODEUNIT), &tstate->trace_info.bounds); PyFrameObject *f = _PyFrame_GetFrameObject(frame); if (f == NULL) { return -1; @@ -6978,7 +6978,7 @@ dtrace_function_entry(InterpreterFrame *frame) PyCodeObject *code = frame->f_code; filename = PyUnicode_AsUTF8(code->co_filename); funcname = PyUnicode_AsUTF8(code->co_name); - lineno = PyCode_Addr2Line(frame->f_code, frame->f_lasti*2); + lineno = PyCode_Addr2Line(frame->f_code, frame->f_lasti*sizeof(_Py_CODEUNIT)); PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno); } @@ -6993,7 +6993,7 @@ dtrace_function_return(InterpreterFrame *frame) PyCodeObject *code = frame->f_code; filename = PyUnicode_AsUTF8(code->co_filename); funcname = PyUnicode_AsUTF8(code->co_name); - lineno = PyCode_Addr2Line(frame->f_code, frame->f_lasti*2); + lineno = PyCode_Addr2Line(frame->f_code, frame->f_lasti*sizeof(_Py_CODEUNIT)); PyDTrace_FUNCTION_RETURN(filename, funcname, lineno); } @@ -7010,12 +7010,12 @@ maybe_dtrace_line(InterpreterFrame *frame, instruction window, reset the window. */ initialize_trace_info(trace_info, frame); - int lastline = _PyCode_CheckLineNumber(instr_prev*2, &trace_info->bounds); - int line = _PyCode_CheckLineNumber(frame->f_lasti*2, &trace_info->bounds); + int lastline = _PyCode_CheckLineNumber(instr_prev*sizeof(_Py_CODEUNIT), &trace_info->bounds); + int line = _PyCode_CheckLineNumber(frame->f_lasti*sizeof(_Py_CODEUNIT), &trace_info->bounds); if (line != -1) { /* Trace backward edges or first instruction of a new line */ if (frame->f_lasti < instr_prev || - (line != lastline && frame->f_lasti*2 == trace_info->bounds.ar_start)) + (line != lastline && frame->f_lasti*sizeof(_Py_CODEUNIT) == trace_info->bounds.ar_start)) { co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename); if (!co_filename) { diff --git a/Python/traceback.c b/Python/traceback.c index 76280a35e3a5f0..06b40bbbdc9f8e 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -240,7 +240,7 @@ _PyTraceBack_FromFrame(PyObject *tb_next, PyFrameObject *frame) assert(tb_next == NULL || PyTraceBack_Check(tb_next)); assert(frame != NULL); - return tb_create_raw((PyTracebackObject *)tb_next, frame, frame->f_frame->f_lasti*2, + return tb_create_raw((PyTracebackObject *)tb_next, frame, frame->f_frame->f_lasti*sizeof(_Py_CODEUNIT), PyFrame_GetLineNumber(frame)); } @@ -1047,7 +1047,7 @@ dump_frame(int fd, InterpreterFrame *frame) PUTS(fd, "???"); } - int lineno = PyCode_Addr2Line(code, frame->f_lasti*2); + int lineno = PyCode_Addr2Line(code, frame->f_lasti*sizeof(_Py_CODEUNIT)); PUTS(fd, ", line "); if (lineno >= 0) { _Py_DumpDecimal(fd, (size_t)lineno); From a25dcaefb7c4eb0767a112cd31fe0b055f168844 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Mon, 4 Oct 2021 00:46:52 +0100 Subject: [PATCH 060/263] bpo-45350: Rerun autoreconf with the pkg-config macros (GH-28708) --- .github/workflows/build.yml | 10 +- aclocal.m4 | 344 ++++++++++++++++++++++++++++++++++++ configure | 135 +++++++++++++- 3 files changed, 484 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b0a18913bf6a09..ec3acf77563f7e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -85,7 +85,9 @@ jobs: - name: Check limited ABI symbols run: make check-limited-abi - name: Check Autoconf version 2.69 - run: grep "Generated by GNU Autoconf 2.69" configure + run: | + grep "Generated by GNU Autoconf 2.69" configure + grep "PKG_PROG_PKG_CONFIG" aclocal.m4 build_win32: name: 'Windows (x86)' @@ -126,8 +128,12 @@ jobs: PYTHONSTRICTEXTENSIONBUILD: 1 steps: - uses: actions/checkout@v2 + - name: Prepare homebrew environment variables + run: | + echo "LDFLAGS=-L$(brew --prefix tcl-tk)/lib" >> $GITHUB_ENV + echo "PKG_CONFIG_PATH=$(brew --prefix openssl@1.1)/lib/pkgconfig:$(brew --prefix tcl-tk)/lib/pkgconfig" >> $GITHUB_ENV - name: Configure CPython - run: ./configure --with-pydebug --with-openssl=/usr/local/opt/openssl --prefix=/opt/python-dev + run: ./configure --with-pydebug --prefix=/opt/python-dev - name: Build CPython run: make -j4 - name: Display build info diff --git a/aclocal.m4 b/aclocal.m4 index 987bfdf215ccb4..2f1bd37528c85d 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -275,3 +275,347 @@ AC_DEFUN([AX_CHECK_OPENSSL], [ AC_SUBST([OPENSSL_LDFLAGS]) ]) +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 11 (pkg-config-0.29.1) + +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29.1]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR + +dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------ +dnl +dnl Prepare a "--with-" configure option using the lowercase +dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and +dnl PKG_CHECK_MODULES in a single macro. +AC_DEFUN([PKG_WITH_MODULES], +[ +m4_pushdef([with_arg], m4_tolower([$1])) + +m4_pushdef([description], + [m4_default([$5], [build with ]with_arg[ support])]) + +m4_pushdef([def_arg], [m4_default([$6], [auto])]) +m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) +m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) + +m4_case(def_arg, + [yes],[m4_pushdef([with_without], [--without-]with_arg)], + [m4_pushdef([with_without],[--with-]with_arg)]) + +AC_ARG_WITH(with_arg, + AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, + [AS_TR_SH([with_]with_arg)=def_arg]) + +AS_CASE([$AS_TR_SH([with_]with_arg)], + [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], + [auto],[PKG_CHECK_MODULES([$1],[$2], + [m4_n([def_action_if_found]) $3], + [m4_n([def_action_if_not_found]) $4])]) + +m4_popdef([with_arg]) +m4_popdef([description]) +m4_popdef([def_arg]) + +])dnl PKG_WITH_MODULES + +dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ----------------------------------------------- +dnl +dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES +dnl check._[VARIABLE-PREFIX] is exported as make variable. +AC_DEFUN([PKG_HAVE_WITH_MODULES], +[ +PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) + +AM_CONDITIONAL([HAVE_][$1], + [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) +])dnl PKG_HAVE_WITH_MODULES + +dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------------------ +dnl +dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after +dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make +dnl and preprocessor variable. +AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], +[ +PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) + +AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], + [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) +])dnl PKG_HAVE_DEFINE_WITH_MODULES + diff --git a/configure b/configure index 75e2e296f10b1a..3b39641bab37c6 100755 --- a/configure +++ b/configure @@ -630,7 +630,6 @@ OPENSSL_RPATH OPENSSL_LDFLAGS OPENSSL_LIBS OPENSSL_INCLUDES -PKG_CONFIG ENSUREPIP SRCDIRS THREADHEADERS @@ -662,6 +661,9 @@ DTRACE TCLTK_LIBS TCLTK_INCLUDES LIBFFI_INCLUDEDIR +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG TZPATH SHLIBS CFLAGSFORSHARED @@ -873,7 +875,10 @@ LDFLAGS LIBS CPPFLAGS CPP -PROFILE_TASK' +PROFILE_TASK +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR' # Initialize some variables set by options. @@ -1638,6 +1643,11 @@ Some influential environment variables: CPP C preprocessor PROFILE_TASK Python args for PGO generation task + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -10621,7 +10631,126 @@ $as_echo "no" >&6; } fi -PKG_PROG_PKG_CONFIG + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi +fi # Check for use of the system expat library { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-system-expat" >&5 From e6d1aa1ac65b6908fdea2c70ec3aa8c4f1dffcb5 Mon Sep 17 00:00:00 2001 From: John Belmonte Date: Mon, 4 Oct 2021 15:49:55 +0900 Subject: [PATCH 061/263] bpo-44594: fix (Async)ExitStack handling of __context__ (gh-27089) * bpo-44594: fix (Async)ExitStack handling of __context__ Make enter_context(foo()) / enter_async_context(foo()) equivalent to `[async] with foo()` regarding __context__ when an exception is raised. Previously exceptions would be caught and re-raised with the wrong context when explicitly overriding __context__ with None. --- Lib/contextlib.py | 8 ++--- Lib/test/test_contextlib.py | 34 ++++++++++++++++++ Lib/test/test_contextlib_async.py | 35 +++++++++++++++++++ .../2021-07-12-10-32-48.bpo-44594.eEa5zi.rst | 3 ++ 4 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-07-12-10-32-48.bpo-44594.eEa5zi.rst diff --git a/Lib/contextlib.py b/Lib/contextlib.py index 1384d8903d17bf..d90ca5d8ef9886 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -553,10 +553,10 @@ def _fix_exception_context(new_exc, old_exc): # Context may not be correct, so find the end of the chain while 1: exc_context = new_exc.__context__ - if exc_context is old_exc: + if exc_context is None or exc_context is old_exc: # Context is already set correctly (see issue 20317) return - if exc_context is None or exc_context is frame_exc: + if exc_context is frame_exc: break new_exc = exc_context # Change the end of the chain to point to the exception @@ -693,10 +693,10 @@ def _fix_exception_context(new_exc, old_exc): # Context may not be correct, so find the end of the chain while 1: exc_context = new_exc.__context__ - if exc_context is old_exc: + if exc_context is None or exc_context is old_exc: # Context is already set correctly (see issue 20317) return - if exc_context is None or exc_context is frame_exc: + if exc_context is frame_exc: break new_exc = exc_context # Change the end of the chain to point to the exception diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index 43b8507771e25a..7982d9d835a2b1 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -799,6 +799,40 @@ def suppress_exc(*exc_details): self.assertIsInstance(inner_exc, ValueError) self.assertIsInstance(inner_exc.__context__, ZeroDivisionError) + def test_exit_exception_explicit_none_context(self): + # Ensure ExitStack chaining matches actual nested `with` statements + # regarding explicit __context__ = None. + + class MyException(Exception): + pass + + @contextmanager + def my_cm(): + try: + yield + except BaseException: + exc = MyException() + try: + raise exc + finally: + exc.__context__ = None + + @contextmanager + def my_cm_with_exit_stack(): + with self.exit_stack() as stack: + stack.enter_context(my_cm()) + yield stack + + for cm in (my_cm, my_cm_with_exit_stack): + with self.subTest(): + try: + with cm(): + raise IndexError() + except MyException as exc: + self.assertIsNone(exc.__context__) + else: + self.fail("Expected IndexError, but no exception was raised") + def test_exit_exception_non_suppressing(self): # http://bugs.python.org/issue19092 def raise_exc(exc): diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py index c738bf3c0bdfeb..c16c7ecd19a259 100644 --- a/Lib/test/test_contextlib_async.py +++ b/Lib/test/test_contextlib_async.py @@ -646,6 +646,41 @@ async def suppress_exc(*exc_details): self.assertIsInstance(inner_exc, ValueError) self.assertIsInstance(inner_exc.__context__, ZeroDivisionError) + @_async_test + async def test_async_exit_exception_explicit_none_context(self): + # Ensure AsyncExitStack chaining matches actual nested `with` statements + # regarding explicit __context__ = None. + + class MyException(Exception): + pass + + @asynccontextmanager + async def my_cm(): + try: + yield + except BaseException: + exc = MyException() + try: + raise exc + finally: + exc.__context__ = None + + @asynccontextmanager + async def my_cm_with_exit_stack(): + async with self.exit_stack() as stack: + await stack.enter_async_context(my_cm()) + yield stack + + for cm in (my_cm, my_cm_with_exit_stack): + with self.subTest(): + try: + async with cm(): + raise IndexError() + except MyException as exc: + self.assertIsNone(exc.__context__) + else: + self.fail("Expected IndexError, but no exception was raised") + @_async_test async def test_instance_bypass_async(self): class Example(object): pass diff --git a/Misc/NEWS.d/next/Library/2021-07-12-10-32-48.bpo-44594.eEa5zi.rst b/Misc/NEWS.d/next/Library/2021-07-12-10-32-48.bpo-44594.eEa5zi.rst new file mode 100644 index 00000000000000..a2bfd8ff5b51bc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-07-12-10-32-48.bpo-44594.eEa5zi.rst @@ -0,0 +1,3 @@ +Fix an edge case of :class:`ExitStack` and :class:`AsyncExitStack` exception +chaining. They will now match ``with`` block behavior when ``__context__`` is +explicitly set to ``None`` when the exception is in flight. From 9be930f9b169fb3d92693670ae069df902709b83 Mon Sep 17 00:00:00 2001 From: Bibo-Joshi <22366557+Bibo-Joshi@users.noreply.github.com> Date: Mon, 4 Oct 2021 13:09:40 +0200 Subject: [PATCH 062/263] bpo-28206: Document signals Handlers, Sigmasks and Signals enums (GH-28628) Co-authored-by: desbma --- Doc/library/signal.rst | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index 84a569d03eb293..63821866a012bb 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -68,10 +68,34 @@ Module contents signal (SIG*), handler (:const:`SIG_DFL`, :const:`SIG_IGN`) and sigmask (:const:`SIG_BLOCK`, :const:`SIG_UNBLOCK`, :const:`SIG_SETMASK`) related constants listed below were turned into - :class:`enums `. + :class:`enums ` (:class:`Signals`, :class:`Handlers` and :class:`Sigmasks` respectively). :func:`getsignal`, :func:`pthread_sigmask`, :func:`sigpending` and :func:`sigwait` functions return human-readable - :class:`enums `. + :class:`enums ` as :class:`Signals` objects. + + +The signal module defines three enums: + +.. class:: Signals + + :class:`enum.IntEnum` collection of SIG* constants and the CTRL_* constants. + + .. versionadded:: 3.5 + +.. class:: Handlers + + :class:`enum.IntEnum` collection the constants :const:`SIG_DFL` and :const:`SIG_IGN`. + + .. versionadded:: 3.5 + +.. class:: Sigmasks + + :class:`enum.IntEnum` collection the constants :const:`SIG_BLOCK`, :const:`SIG_UNBLOCK` and :const:`SIG_SETMASK`. + + Availability: Unix. See the man page :manpage:`sigprocmask(3)` and + :manpage:`pthread_sigmask(3)` for further information. + + .. versionadded:: 3.5 The variables defined in the :mod:`signal` module are: @@ -618,8 +642,8 @@ The :mod:`signal` module defines the following functions: .. _signal-example: -Example -------- +Examples +-------- Here is a minimal example program. It uses the :func:`alarm` function to limit the time spent waiting to open a file; this is useful if the file is for a @@ -631,7 +655,8 @@ be sent, and the handler raises an exception. :: import signal, os def handler(signum, frame): - print('Signal handler called with signal', signum) + signame = signal.Signals(signum).name + print(f'Signal handler called with signal {signame} ({signum})') raise OSError("Couldn't open device!") # Set the signal handler and a 5-second alarm From 252b7bcb236dc261f3af1275bc90f9a303d9648f Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 4 Oct 2021 14:11:26 +0300 Subject: [PATCH 063/263] bpo-45355: More use of sizeof(_Py_CODEUNIT) (GH-28720) --- Objects/codeobject.c | 16 ++++++---------- Objects/frameobject.c | 4 ++-- Python/compile.c | 2 +- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/Objects/codeobject.c b/Objects/codeobject.c index ad8f13a781b94a..8de5c4d9c8a9d7 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -656,15 +656,13 @@ _PyCode_Addr2Offset(PyCodeObject* co, int addrq) if (co->co_columntable == Py_None || addrq < 0) { return -1; } - if (addrq % 2 == 1) { - --addrq; - } - if (addrq >= PyBytes_GET_SIZE(co->co_columntable)) { + addrq /= sizeof(_Py_CODEUNIT); + if (addrq*2 >= PyBytes_GET_SIZE(co->co_columntable)) { return -1; } unsigned char* bytes = (unsigned char*)PyBytes_AS_STRING(co->co_columntable); - return bytes[addrq] - 1; + return bytes[addrq*2] - 1; } int @@ -673,15 +671,13 @@ _PyCode_Addr2EndOffset(PyCodeObject* co, int addrq) if (co->co_columntable == Py_None || addrq < 0) { return -1; } - if (addrq % 2 == 0) { - ++addrq; - } - if (addrq >= PyBytes_GET_SIZE(co->co_columntable)) { + addrq /= sizeof(_Py_CODEUNIT); + if (addrq*2+1 >= PyBytes_GET_SIZE(co->co_columntable)) { return -1; } unsigned char* bytes = (unsigned char*)PyBytes_AS_STRING(co->co_columntable); - return bytes[addrq] - 1; + return bytes[addrq*2+1] - 1; } void diff --git a/Objects/frameobject.c b/Objects/frameobject.c index b743dc72eee790..e4c16de66211d0 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -373,8 +373,8 @@ marklines(PyCodeObject *code, int len) } while (PyLineTable_NextAddressRange(&bounds)) { - assert(bounds.ar_start/2 < len); - linestarts[bounds.ar_start/2] = bounds.ar_line; + assert(bounds.ar_start/(int)sizeof(_Py_CODEUNIT) < len); + linestarts[bounds.ar_start/sizeof(_Py_CODEUNIT)] = bounds.ar_line; } return linestarts; } diff --git a/Python/compile.c b/Python/compile.c index fdc2ce61a8e035..694da29b771d07 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -7081,7 +7081,7 @@ assemble_line_range(struct assembler* a, int current, PyObject** table, int* prev, int* start, int* offset) { int ldelta, bdelta; - bdelta = (a->a_offset - *start) * 2; + bdelta = (a->a_offset - *start) * sizeof(_Py_CODEUNIT); if (bdelta == 0) { return 1; } From 07cf10bafc8f6e1fcc82c10d97d3452325fc7c04 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Mon, 4 Oct 2021 12:13:46 +0100 Subject: [PATCH 064/263] Fix compiler warning in ceval.c regarding signed comparison (GH-28716) --- Python/ceval.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/ceval.c b/Python/ceval.c index c951e563cd7a10..8f65bb3aec4bc1 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -7015,7 +7015,7 @@ maybe_dtrace_line(InterpreterFrame *frame, if (line != -1) { /* Trace backward edges or first instruction of a new line */ if (frame->f_lasti < instr_prev || - (line != lastline && frame->f_lasti*sizeof(_Py_CODEUNIT) == trace_info->bounds.ar_start)) + (line != lastline && frame->f_lasti*sizeof(_Py_CODEUNIT) == (unsigned int)trace_info->bounds.ar_start)) { co_filename = PyUnicode_AsUTF8(frame->f_code->co_filename); if (!co_filename) { From ef6196028f966f22d82930b66e1371e75c5df2f7 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Tue, 5 Oct 2021 12:43:46 +0300 Subject: [PATCH 065/263] bpo-45371: Fix distutils' rpath support for clang (GH-28732) Signed-off-by: Christian Heimes --- Lib/distutils/unixccompiler.py | 3 ++- .../next/Library/2021-10-05-11-03-48.bpo-45371.NOwcDJ.rst | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2021-10-05-11-03-48.bpo-45371.NOwcDJ.rst diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py index f0792de74a1a48..d00c48981eb6d6 100644 --- a/Lib/distutils/unixccompiler.py +++ b/Lib/distutils/unixccompiler.py @@ -215,7 +215,8 @@ def library_dir_option(self, dir): return "-L" + dir def _is_gcc(self, compiler_name): - return "gcc" in compiler_name or "g++" in compiler_name + # clang uses same syntax for rpath as gcc + return any(name in compiler_name for name in ("gcc", "g++", "clang")) def runtime_library_dir_option(self, dir): # XXX Hackish, at the very least. See Python bug #445902: diff --git a/Misc/NEWS.d/next/Library/2021-10-05-11-03-48.bpo-45371.NOwcDJ.rst b/Misc/NEWS.d/next/Library/2021-10-05-11-03-48.bpo-45371.NOwcDJ.rst new file mode 100644 index 00000000000000..045489be81a190 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-10-05-11-03-48.bpo-45371.NOwcDJ.rst @@ -0,0 +1,3 @@ +Fix clang rpath issue in :mod:`distutils`. The UnixCCompiler now uses +correct clang option to add a runtime library directory (rpath) to a shared +library. From bd627eb7ed08a891dd1356756feb1ce2600358e4 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Tue, 5 Oct 2021 11:01:11 +0100 Subject: [PATCH 066/263] bpo-43760: Check for tracing using 'bitwise or' instead of branch in dispatch. (GH-28723) --- Include/opcode.h | 1 + .../2021-10-04-16-11-50.bpo-43760.R9QoUv.rst | 3 + Python/ceval.c | 453 ++++++++++-------- Python/makeopcodetargets.py | 1 + Python/opcode_targets.h | 2 +- Python/sysmodule.c | 4 +- Tools/scripts/generate_opcode_h.py | 2 +- 7 files changed, 249 insertions(+), 217 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-10-04-16-11-50.bpo-43760.R9QoUv.rst diff --git a/Include/opcode.h b/Include/opcode.h index 27895255947837..8817a4d650fd11 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -167,6 +167,7 @@ extern "C" { #define LOAD_FAST__LOAD_CONST 134 #define LOAD_CONST__LOAD_FAST 140 #define STORE_FAST__STORE_FAST 143 +#define DO_TRACING 255 #ifdef NEED_OPCODE_JUMP_TABLES static uint32_t _PyOpcode_RelativeJump[8] = { 0U, diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-10-04-16-11-50.bpo-43760.R9QoUv.rst b/Misc/NEWS.d/next/Core and Builtins/2021-10-04-16-11-50.bpo-43760.R9QoUv.rst new file mode 100644 index 00000000000000..1809b42b94438b --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-10-04-16-11-50.bpo-43760.R9QoUv.rst @@ -0,0 +1,3 @@ +The number of hardware branches per instruction dispatch is reduced from two +to one by adding a special instruction for tracing. Patch by Mark Shannon. + diff --git a/Python/ceval.c b/Python/ceval.c index 8f65bb3aec4bc1..2dbc291897c033 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1218,7 +1218,7 @@ eval_frame_handle_pending(PyThreadState *tstate) #endif #ifdef WITH_DTRACE -#define OR_DTRACE_LINE || PyDTrace_LINE_ENABLED() +#define OR_DTRACE_LINE | (PyDTrace_LINE_ENABLED() ? 255 : 0) #else #define OR_DTRACE_LINE #endif @@ -1240,11 +1240,13 @@ eval_frame_handle_pending(PyThreadState *tstate) #define USE_COMPUTED_GOTOS 0 #endif +#define INSTRUCTION_START() frame->f_lasti = INSTR_OFFSET(); next_instr++ + #if USE_COMPUTED_GOTOS -#define TARGET(op) TARGET_##op +#define TARGET(op) TARGET_##op: INSTRUCTION_START(); #define DISPATCH_GOTO() goto *opcode_targets[opcode] #else -#define TARGET(op) case op +#define TARGET(op) case op: INSTRUCTION_START(); #define DISPATCH_GOTO() goto dispatch_opcode #endif @@ -1274,12 +1276,11 @@ eval_frame_handle_pending(PyThreadState *tstate) #endif #endif #ifndef PRE_DISPATCH_GOTO -#define PRE_DISPATCH_GOTO() do { LLTRACE_INSTR(); RECORD_DXPROFILE(); } while (0) +#define PRE_DISPATCH_GOTO() do { LLTRACE_INSTR(); RECORD_DXPROFILE(); } while (0) #endif #define NOTRACE_DISPATCH() \ { \ - frame->f_lasti = INSTR_OFFSET(); \ NEXTOPARG(); \ PRE_DISPATCH_GOTO(); \ DISPATCH_GOTO(); \ @@ -1288,10 +1289,11 @@ eval_frame_handle_pending(PyThreadState *tstate) /* Do interpreter dispatch accounting for tracing and instrumentation */ #define DISPATCH() \ { \ - if (cframe.use_tracing OR_DTRACE_LINE) { \ - goto tracing_dispatch; \ - } \ - NOTRACE_DISPATCH(); \ + NEXTOPARG(); \ + PRE_DISPATCH_GOTO(); \ + assert(cframe.use_tracing == 0 || cframe.use_tracing == 255); \ + opcode |= cframe.use_tracing OR_DTRACE_LINE; \ + DISPATCH_GOTO(); \ } #define CHECK_EVAL_BREAKER() \ @@ -1316,7 +1318,6 @@ eval_frame_handle_pending(PyThreadState *tstate) _Py_CODEUNIT word = *next_instr; \ opcode = _Py_OPCODE(word); \ oparg = _Py_OPARG(word); \ - next_instr++; \ } while (0) #define JUMPTO(x) (next_instr = first_instr + (x)) #define JUMPBY(x) (next_instr += (x)) @@ -1326,7 +1327,6 @@ eval_frame_handle_pending(PyThreadState *tstate) _Py_CODEUNIT word = ((_Py_CODEUNIT *)PyBytes_AS_STRING(co->co_code))[INSTR_OFFSET()]; \ opcode = _Py_OPCODE(word); \ oparg = _Py_OPARG(word); \ - next_instr++; \ } while (0) /* OpCode prediction macros @@ -1363,10 +1363,10 @@ eval_frame_handle_pending(PyThreadState *tstate) #define PREDICT(op) \ do { \ _Py_CODEUNIT word = *next_instr; \ - opcode = _Py_OPCODE(word); \ + opcode = _Py_OPCODE(word) | cframe.use_tracing OR_DTRACE_LINE; \ if (opcode == op) { \ oparg = _Py_OPARG(word); \ - next_instr++; \ + INSTRUCTION_START(); \ goto PREDICT_ID(op); \ } \ } while(0) @@ -1516,6 +1516,15 @@ trace_function_entry(PyThreadState *tstate, InterpreterFrame *frame) return 0; } +static int +skip_backwards_over_extended_args(PyCodeObject *code, int offset) { + _Py_CODEUNIT *instrs = (_Py_CODEUNIT *)PyBytes_AS_STRING(code->co_code); + while (offset > 0 && _Py_OPCODE(instrs[offset-1]) == EXTENDED_ARG) { + offset--; + } + return offset; +} + PyObject* _Py_HOT_FUNCTION _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int throwflag) { @@ -1668,42 +1677,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); - tracing_dispatch: - { - int instr_prev = frame->f_lasti; - frame->f_lasti = INSTR_OFFSET(); - TRACING_NEXTOPARG(); - - if (PyDTrace_LINE_ENABLED()) - maybe_dtrace_line(frame, &tstate->trace_info, instr_prev); - - /* line-by-line tracing support */ - - if (cframe.use_tracing && - tstate->c_tracefunc != NULL && !tstate->tracing) { - int err; - /* see maybe_call_line_trace() - for expository comments */ - _PyFrame_SetStackPointer(frame, stack_pointer); - - err = maybe_call_line_trace(tstate->c_tracefunc, - tstate->c_traceobj, - tstate, frame, instr_prev); - if (err) { - /* trace function raised an exception */ - goto error; - } - /* Reload possibly changed frame fields */ - JUMPTO(frame->f_lasti); - - stack_pointer = _PyFrame_GetStackPointer(frame); - frame->stacktop = -1; - TRACING_NEXTOPARG(); - } - PRE_DISPATCH_GOTO(); - DISPATCH_GOTO(); - } - /* Start instructions */ #if USE_COMPUTED_GOTOS { @@ -1716,13 +1689,12 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr It is essential that any operation that fails must goto error and that all operation that succeed call DISPATCH() ! */ - TARGET(NOP): { + TARGET(NOP) { DISPATCH(); } /* We keep LOAD_CLOSURE so that the bytecode stays more readable. */ - TARGET(LOAD_CLOSURE): - TARGET(LOAD_FAST): { + TARGET(LOAD_CLOSURE) { PyObject *value = GETLOCAL(oparg); if (value == NULL) { goto unbound_local_error; @@ -1732,7 +1704,17 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_CONST): { + TARGET(LOAD_FAST) { + PyObject *value = GETLOCAL(oparg); + if (value == NULL) { + goto unbound_local_error; + } + Py_INCREF(value); + PUSH(value); + DISPATCH(); + } + + TARGET(LOAD_CONST) { PREDICTED(LOAD_CONST); PyObject *value = GETITEM(consts, oparg); Py_INCREF(value); @@ -1740,19 +1722,20 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(STORE_FAST): { + TARGET(STORE_FAST) { PREDICTED(STORE_FAST); PyObject *value = POP(); SETLOCAL(oparg, value); DISPATCH(); } - TARGET(LOAD_FAST__LOAD_FAST): { + TARGET(LOAD_FAST__LOAD_FAST) { PyObject *value = GETLOCAL(oparg); if (value == NULL) { goto unbound_local_error; } NEXTOPARG(); + next_instr++; Py_INCREF(value); PUSH(value); value = GETLOCAL(oparg); @@ -1764,12 +1747,13 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr NOTRACE_DISPATCH(); } - TARGET(LOAD_FAST__LOAD_CONST): { + TARGET(LOAD_FAST__LOAD_CONST) { PyObject *value = GETLOCAL(oparg); if (value == NULL) { goto unbound_local_error; } NEXTOPARG(); + next_instr++; Py_INCREF(value); PUSH(value); value = GETITEM(consts, oparg); @@ -1778,10 +1762,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr NOTRACE_DISPATCH(); } - TARGET(STORE_FAST__LOAD_FAST): { + TARGET(STORE_FAST__LOAD_FAST) { PyObject *value = POP(); SETLOCAL(oparg, value); NEXTOPARG(); + next_instr++; value = GETLOCAL(oparg); if (value == NULL) { goto unbound_local_error; @@ -1791,18 +1776,20 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr NOTRACE_DISPATCH(); } - TARGET(STORE_FAST__STORE_FAST): { + TARGET(STORE_FAST__STORE_FAST) { PyObject *value = POP(); SETLOCAL(oparg, value); NEXTOPARG(); + next_instr++; value = POP(); SETLOCAL(oparg, value); NOTRACE_DISPATCH(); } - TARGET(LOAD_CONST__LOAD_FAST): { + TARGET(LOAD_CONST__LOAD_FAST) { PyObject *value = GETITEM(consts, oparg); NEXTOPARG(); + next_instr++; Py_INCREF(value); PUSH(value); value = GETLOCAL(oparg); @@ -1814,13 +1801,13 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr NOTRACE_DISPATCH(); } - TARGET(POP_TOP): { + TARGET(POP_TOP) { PyObject *value = POP(); Py_DECREF(value); DISPATCH(); } - TARGET(ROT_TWO): { + TARGET(ROT_TWO) { PyObject *top = TOP(); PyObject *second = SECOND(); SET_TOP(second); @@ -1828,7 +1815,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(ROT_THREE): { + TARGET(ROT_THREE) { PyObject *top = TOP(); PyObject *second = SECOND(); PyObject *third = THIRD(); @@ -1838,7 +1825,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(ROT_FOUR): { + TARGET(ROT_FOUR) { PyObject *top = TOP(); PyObject *second = SECOND(); PyObject *third = THIRD(); @@ -1850,14 +1837,14 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(DUP_TOP): { + TARGET(DUP_TOP) { PyObject *top = TOP(); Py_INCREF(top); PUSH(top); DISPATCH(); } - TARGET(DUP_TOP_TWO): { + TARGET(DUP_TOP_TWO) { PyObject *top = TOP(); PyObject *second = SECOND(); Py_INCREF(top); @@ -1868,7 +1855,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(UNARY_POSITIVE): { + TARGET(UNARY_POSITIVE) { PyObject *value = TOP(); PyObject *res = PyNumber_Positive(value); Py_DECREF(value); @@ -1878,7 +1865,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(UNARY_NEGATIVE): { + TARGET(UNARY_NEGATIVE) { PyObject *value = TOP(); PyObject *res = PyNumber_Negative(value); Py_DECREF(value); @@ -1888,7 +1875,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(UNARY_NOT): { + TARGET(UNARY_NOT) { PyObject *value = TOP(); int err = PyObject_IsTrue(value); Py_DECREF(value); @@ -1906,7 +1893,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr goto error; } - TARGET(UNARY_INVERT): { + TARGET(UNARY_INVERT) { PyObject *value = TOP(); PyObject *res = PyNumber_Invert(value); Py_DECREF(value); @@ -1916,7 +1903,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_POWER): { + TARGET(BINARY_POWER) { PyObject *exp = POP(); PyObject *base = TOP(); PyObject *res = PyNumber_Power(base, exp, Py_None); @@ -1928,7 +1915,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_MULTIPLY): { + TARGET(BINARY_MULTIPLY) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_Multiply(left, right); @@ -1940,7 +1927,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_MATRIX_MULTIPLY): { + TARGET(BINARY_MATRIX_MULTIPLY) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_MatrixMultiply(left, right); @@ -1952,7 +1939,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_TRUE_DIVIDE): { + TARGET(BINARY_TRUE_DIVIDE) { PyObject *divisor = POP(); PyObject *dividend = TOP(); PyObject *quotient = PyNumber_TrueDivide(dividend, divisor); @@ -1964,7 +1951,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_FLOOR_DIVIDE): { + TARGET(BINARY_FLOOR_DIVIDE) { PyObject *divisor = POP(); PyObject *dividend = TOP(); PyObject *quotient = PyNumber_FloorDivide(dividend, divisor); @@ -1976,7 +1963,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_MODULO): { + TARGET(BINARY_MODULO) { PyObject *divisor = POP(); PyObject *dividend = TOP(); PyObject *res; @@ -1996,7 +1983,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_ADD): { + TARGET(BINARY_ADD) { PREDICTED(BINARY_ADD); STAT_INC(BINARY_ADD, unquickened); PyObject *right = POP(); @@ -2011,7 +1998,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_ADD_ADAPTIVE): { + TARGET(BINARY_ADD_ADAPTIVE) { if (oparg == 0) { PyObject *left = SECOND(); PyObject *right = TOP(); @@ -2029,7 +2016,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr } } - TARGET(BINARY_ADD_UNICODE): { + TARGET(BINARY_ADD_UNICODE) { PyObject *left = SECOND(); PyObject *right = TOP(); DEOPT_IF(!PyUnicode_CheckExact(left), BINARY_ADD); @@ -2047,7 +2034,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_ADD_UNICODE_INPLACE_FAST): { + TARGET(BINARY_ADD_UNICODE_INPLACE_FAST) { PyObject *left = SECOND(); PyObject *right = TOP(); DEOPT_IF(!PyUnicode_CheckExact(left), BINARY_ADD); @@ -2076,7 +2063,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_ADD_FLOAT): { + TARGET(BINARY_ADD_FLOAT) { PyObject *left = SECOND(); PyObject *right = TOP(); DEOPT_IF(!PyFloat_CheckExact(left), BINARY_ADD); @@ -2096,7 +2083,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_ADD_INT): { + TARGET(BINARY_ADD_INT) { PyObject *left = SECOND(); PyObject *right = TOP(); DEOPT_IF(!PyLong_CheckExact(left), BINARY_ADD); @@ -2114,7 +2101,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_SUBTRACT): { + TARGET(BINARY_SUBTRACT) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *diff = PyNumber_Subtract(left, right); @@ -2126,7 +2113,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_SUBSCR): { + TARGET(BINARY_SUBSCR) { PREDICTED(BINARY_SUBSCR); STAT_INC(BINARY_SUBSCR, unquickened); PyObject *sub = POP(); @@ -2140,7 +2127,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_SUBSCR_ADAPTIVE): { + TARGET(BINARY_SUBSCR_ADAPTIVE) { if (oparg == 0) { PyObject *sub = TOP(); PyObject *container = SECOND(); @@ -2161,7 +2148,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr } } - TARGET(BINARY_SUBSCR_LIST_INT): { + TARGET(BINARY_SUBSCR_LIST_INT) { PyObject *sub = TOP(); PyObject *list = SECOND(); DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR); @@ -2185,7 +2172,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_SUBSCR_TUPLE_INT): { + TARGET(BINARY_SUBSCR_TUPLE_INT) { PyObject *sub = TOP(); PyObject *tuple = SECOND(); DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR); @@ -2209,7 +2196,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_SUBSCR_DICT): { + TARGET(BINARY_SUBSCR_DICT) { PyObject *dict = SECOND(); DEOPT_IF(!PyDict_CheckExact(SECOND()), BINARY_SUBSCR); STAT_INC(BINARY_SUBSCR, hit); @@ -2226,7 +2213,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_LSHIFT): { + TARGET(BINARY_LSHIFT) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_Lshift(left, right); @@ -2238,7 +2225,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_RSHIFT): { + TARGET(BINARY_RSHIFT) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_Rshift(left, right); @@ -2250,7 +2237,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_AND): { + TARGET(BINARY_AND) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_And(left, right); @@ -2262,7 +2249,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_XOR): { + TARGET(BINARY_XOR) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_Xor(left, right); @@ -2274,7 +2261,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BINARY_OR): { + TARGET(BINARY_OR) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_Or(left, right); @@ -2286,7 +2273,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LIST_APPEND): { + TARGET(LIST_APPEND) { PyObject *v = POP(); PyObject *list = PEEK(oparg); int err; @@ -2298,7 +2285,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(SET_ADD): { + TARGET(SET_ADD) { PyObject *v = POP(); PyObject *set = PEEK(oparg); int err; @@ -2310,7 +2297,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(INPLACE_POWER): { + TARGET(INPLACE_POWER) { PyObject *exp = POP(); PyObject *base = TOP(); PyObject *res = PyNumber_InPlacePower(base, exp, Py_None); @@ -2322,7 +2309,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(INPLACE_MULTIPLY): { + TARGET(INPLACE_MULTIPLY) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_InPlaceMultiply(left, right); @@ -2334,7 +2321,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(INPLACE_MATRIX_MULTIPLY): { + TARGET(INPLACE_MATRIX_MULTIPLY) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right); @@ -2346,7 +2333,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(INPLACE_TRUE_DIVIDE): { + TARGET(INPLACE_TRUE_DIVIDE) { PyObject *divisor = POP(); PyObject *dividend = TOP(); PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor); @@ -2358,7 +2345,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(INPLACE_FLOOR_DIVIDE): { + TARGET(INPLACE_FLOOR_DIVIDE) { PyObject *divisor = POP(); PyObject *dividend = TOP(); PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor); @@ -2370,7 +2357,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(INPLACE_MODULO): { + TARGET(INPLACE_MODULO) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *mod = PyNumber_InPlaceRemainder(left, right); @@ -2382,7 +2369,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(INPLACE_ADD): { + TARGET(INPLACE_ADD) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *sum; @@ -2401,7 +2388,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(INPLACE_SUBTRACT): { + TARGET(INPLACE_SUBTRACT) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *diff = PyNumber_InPlaceSubtract(left, right); @@ -2413,7 +2400,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(INPLACE_LSHIFT): { + TARGET(INPLACE_LSHIFT) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_InPlaceLshift(left, right); @@ -2425,7 +2412,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(INPLACE_RSHIFT): { + TARGET(INPLACE_RSHIFT) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_InPlaceRshift(left, right); @@ -2437,7 +2424,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(INPLACE_AND): { + TARGET(INPLACE_AND) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_InPlaceAnd(left, right); @@ -2449,7 +2436,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(INPLACE_XOR): { + TARGET(INPLACE_XOR) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_InPlaceXor(left, right); @@ -2461,7 +2448,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(INPLACE_OR): { + TARGET(INPLACE_OR) { PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_InPlaceOr(left, right); @@ -2473,7 +2460,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(STORE_SUBSCR): { + TARGET(STORE_SUBSCR) { PyObject *sub = TOP(); PyObject *container = SECOND(); PyObject *v = THIRD(); @@ -2489,7 +2476,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(DELETE_SUBSCR): { + TARGET(DELETE_SUBSCR) { PyObject *sub = TOP(); PyObject *container = SECOND(); int err; @@ -2503,7 +2490,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(PRINT_EXPR): { + TARGET(PRINT_EXPR) { _Py_IDENTIFIER(displayhook); PyObject *value = POP(); PyObject *hook = _PySys_GetObjectId(&PyId_displayhook); @@ -2522,7 +2509,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(RAISE_VARARGS): { + TARGET(RAISE_VARARGS) { PyObject *cause = NULL, *exc = NULL; switch (oparg) { case 2: @@ -2544,7 +2531,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr goto error; } - TARGET(RETURN_VALUE): { + TARGET(RETURN_VALUE) { retval = POP(); assert(EMPTY()); frame->f_state = FRAME_RETURNED; @@ -2552,7 +2539,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr goto exiting; } - TARGET(GET_AITER): { + TARGET(GET_AITER) { unaryfunc getter = NULL; PyObject *iter = NULL; PyObject *obj = TOP(); @@ -2596,7 +2583,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(GET_ANEXT): { + TARGET(GET_ANEXT) { unaryfunc getter = NULL; PyObject *next_iter = NULL; PyObject *awaitable = NULL; @@ -2647,7 +2634,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(GET_AWAITABLE): { + TARGET(GET_AWAITABLE) { PREDICTED(GET_AWAITABLE); PyObject *iterable = TOP(); PyObject *iter = _PyCoro_GetAwaitableIter(iterable); @@ -2688,7 +2675,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(YIELD_FROM): { + TARGET(YIELD_FROM) { PyObject *v = POP(); PyObject *receiver = TOP(); PySendResult gen_status; @@ -2740,7 +2727,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr goto exiting; } - TARGET(YIELD_VALUE): { + TARGET(YIELD_VALUE) { retval = POP(); if (co->co_flags & CO_ASYNC_GENERATOR) { @@ -2757,7 +2744,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr goto exiting; } - TARGET(GEN_START): { + TARGET(GEN_START) { PyObject *none = POP(); Py_DECREF(none); if (!Py_IsNone(none)) { @@ -2781,7 +2768,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(POP_EXCEPT): { + TARGET(POP_EXCEPT) { PyObject *type, *value, *traceback; _PyErr_StackItem *exc_info; exc_info = tstate->exc_info; @@ -2797,7 +2784,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(POP_EXCEPT_AND_RERAISE): { + TARGET(POP_EXCEPT_AND_RERAISE) { PyObject *lasti = PEEK(4); if (PyLong_Check(lasti)) { frame->f_lasti = PyLong_AsLong(lasti); @@ -2827,7 +2814,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr goto exception_unwind; } - TARGET(RERAISE): { + TARGET(RERAISE) { if (oparg) { PyObject *lasti = PEEK(oparg+3); if (PyLong_Check(lasti)) { @@ -2848,7 +2835,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr goto exception_unwind; } - TARGET(END_ASYNC_FOR): { + TARGET(END_ASYNC_FOR) { PyObject *exc = POP(); PyObject *val = POP(); PyObject *tb = POP(); @@ -2866,14 +2853,14 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr } } - TARGET(LOAD_ASSERTION_ERROR): { + TARGET(LOAD_ASSERTION_ERROR) { PyObject *value = PyExc_AssertionError; Py_INCREF(value); PUSH(value); DISPATCH(); } - TARGET(LOAD_BUILD_CLASS): { + TARGET(LOAD_BUILD_CLASS) { _Py_IDENTIFIER(__build_class__); PyObject *bc; @@ -2904,7 +2891,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(STORE_NAME): { + TARGET(STORE_NAME) { PyObject *name = GETITEM(names, oparg); PyObject *v = POP(); PyObject *ns = LOCALS(); @@ -2925,7 +2912,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(DELETE_NAME): { + TARGET(DELETE_NAME) { PyObject *name = GETITEM(names, oparg); PyObject *ns = LOCALS(); int err; @@ -2944,7 +2931,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(UNPACK_SEQUENCE): { + TARGET(UNPACK_SEQUENCE) { PREDICTED(UNPACK_SEQUENCE); PyObject *seq = POP(), *item, **items; if (PyTuple_CheckExact(seq) && @@ -2975,7 +2962,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(UNPACK_EX): { + TARGET(UNPACK_EX) { int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); PyObject *seq = POP(); @@ -2990,7 +2977,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(STORE_ATTR): { + TARGET(STORE_ATTR) { PREDICTED(STORE_ATTR); STAT_INC(STORE_ATTR, unquickened); PyObject *name = GETITEM(names, oparg); @@ -3006,7 +2993,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(DELETE_ATTR): { + TARGET(DELETE_ATTR) { PyObject *name = GETITEM(names, oparg); PyObject *owner = POP(); int err; @@ -3017,7 +3004,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(STORE_GLOBAL): { + TARGET(STORE_GLOBAL) { PyObject *name = GETITEM(names, oparg); PyObject *v = POP(); int err; @@ -3028,7 +3015,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(DELETE_GLOBAL): { + TARGET(DELETE_GLOBAL) { PyObject *name = GETITEM(names, oparg); int err; err = PyDict_DelItem(GLOBALS(), name); @@ -3042,7 +3029,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_NAME): { + TARGET(LOAD_NAME) { PyObject *name = GETITEM(names, oparg); PyObject *locals = LOCALS(); PyObject *v; @@ -3106,7 +3093,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_GLOBAL): { + TARGET(LOAD_GLOBAL) { PREDICTED(LOAD_GLOBAL); STAT_INC(LOAD_GLOBAL, unquickened); PyObject *name = GETITEM(names, oparg); @@ -3156,7 +3143,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_GLOBAL_ADAPTIVE): { + TARGET(LOAD_GLOBAL_ADAPTIVE) { assert(cframe.use_tracing == 0); SpecializedCacheEntry *cache = GET_CACHE(); if (cache->adaptive.counter == 0) { @@ -3176,7 +3163,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr } } - TARGET(LOAD_GLOBAL_MODULE): { + TARGET(LOAD_GLOBAL_MODULE) { assert(cframe.use_tracing == 0); DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL); PyDictObject *dict = (PyDictObject *)GLOBALS(); @@ -3194,7 +3181,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_GLOBAL_BUILTIN): { + TARGET(LOAD_GLOBAL_BUILTIN) { assert(cframe.use_tracing == 0); DEOPT_IF(!PyDict_CheckExact(GLOBALS()), LOAD_GLOBAL); DEOPT_IF(!PyDict_CheckExact(BUILTINS()), LOAD_GLOBAL); @@ -3215,7 +3202,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(DELETE_FAST): { + TARGET(DELETE_FAST) { PyObject *v = GETLOCAL(oparg); if (v != NULL) { SETLOCAL(oparg, NULL); @@ -3229,7 +3216,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr goto error; } - TARGET(MAKE_CELL): { + TARGET(MAKE_CELL) { // "initial" is probably NULL but not if it's an arg (or set // via PyFrame_LocalsToFast() before MAKE_CELL has run). PyObject *initial = GETLOCAL(oparg); @@ -3241,7 +3228,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(DELETE_DEREF): { + TARGET(DELETE_DEREF) { PyObject *cell = GETLOCAL(oparg); PyObject *oldobj = PyCell_GET(cell); if (oldobj != NULL) { @@ -3253,7 +3240,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr goto error; } - TARGET(LOAD_CLASSDEREF): { + TARGET(LOAD_CLASSDEREF) { PyObject *name, *value, *locals = LOCALS(); assert(locals); assert(oparg >= 0 && oparg < co->co_nlocalsplus); @@ -3289,7 +3276,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_DEREF): { + TARGET(LOAD_DEREF) { PyObject *cell = GETLOCAL(oparg); PyObject *value = PyCell_GET(cell); if (value == NULL) { @@ -3301,7 +3288,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(STORE_DEREF): { + TARGET(STORE_DEREF) { PyObject *v = POP(); PyObject *cell = GETLOCAL(oparg); PyObject *oldobj = PyCell_GET(cell); @@ -3310,7 +3297,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BUILD_STRING): { + TARGET(BUILD_STRING) { PyObject *str; PyObject *empty = PyUnicode_New(0, 0); if (empty == NULL) { @@ -3328,7 +3315,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BUILD_TUPLE): { + TARGET(BUILD_TUPLE) { PyObject *tup = PyTuple_New(oparg); if (tup == NULL) goto error; @@ -3340,7 +3327,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BUILD_LIST): { + TARGET(BUILD_LIST) { PyObject *list = PyList_New(oparg); if (list == NULL) goto error; @@ -3352,7 +3339,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LIST_TO_TUPLE): { + TARGET(LIST_TO_TUPLE) { PyObject *list = POP(); PyObject *tuple = PyList_AsTuple(list); Py_DECREF(list); @@ -3363,7 +3350,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LIST_EXTEND): { + TARGET(LIST_EXTEND) { PyObject *iterable = POP(); PyObject *list = PEEK(oparg); PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable); @@ -3384,7 +3371,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(SET_UPDATE): { + TARGET(SET_UPDATE) { PyObject *iterable = POP(); PyObject *set = PEEK(oparg); int err = _PySet_Update(set, iterable); @@ -3395,7 +3382,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BUILD_SET): { + TARGET(BUILD_SET) { PyObject *set = PySet_New(NULL); int err = 0; int i; @@ -3416,7 +3403,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BUILD_MAP): { + TARGET(BUILD_MAP) { Py_ssize_t i; PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg); if (map == NULL) @@ -3440,7 +3427,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(SETUP_ANNOTATIONS): { + TARGET(SETUP_ANNOTATIONS) { _Py_IDENTIFIER(__annotations__); int err; PyObject *ann_dict; @@ -3499,7 +3486,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BUILD_CONST_KEY_MAP): { + TARGET(BUILD_CONST_KEY_MAP) { Py_ssize_t i; PyObject *map; PyObject *keys = TOP(); @@ -3532,7 +3519,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(DICT_UPDATE): { + TARGET(DICT_UPDATE) { PyObject *update = POP(); PyObject *dict = PEEK(oparg); if (PyDict_Update(dict, update) < 0) { @@ -3548,7 +3535,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(DICT_MERGE): { + TARGET(DICT_MERGE) { PyObject *update = POP(); PyObject *dict = PEEK(oparg); @@ -3562,7 +3549,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(MAP_ADD): { + TARGET(MAP_ADD) { PyObject *value = TOP(); PyObject *key = SECOND(); PyObject *map; @@ -3579,7 +3566,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_ATTR): { + TARGET(LOAD_ATTR) { PREDICTED(LOAD_ATTR); STAT_INC(LOAD_ATTR, unquickened); PyObject *name = GETITEM(names, oparg); @@ -3593,7 +3580,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_ATTR_ADAPTIVE): { + TARGET(LOAD_ATTR_ADAPTIVE) { assert(cframe.use_tracing == 0); SpecializedCacheEntry *cache = GET_CACHE(); if (cache->adaptive.counter == 0) { @@ -3614,7 +3601,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr } } - TARGET(LOAD_ATTR_SPLIT_KEYS): { + TARGET(LOAD_ATTR_SPLIT_KEYS) { assert(cframe.use_tracing == 0); PyObject *owner = TOP(); PyObject *res; @@ -3639,7 +3626,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_ATTR_MODULE): { + TARGET(LOAD_ATTR_MODULE) { assert(cframe.use_tracing == 0); // shared with LOAD_METHOD_MODULE PyObject *owner = TOP(); @@ -3650,7 +3637,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_ATTR_WITH_HINT): { + TARGET(LOAD_ATTR_WITH_HINT) { assert(cframe.use_tracing == 0); PyObject *owner = TOP(); PyObject *res; @@ -3679,7 +3666,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_ATTR_SLOT): { + TARGET(LOAD_ATTR_SLOT) { assert(cframe.use_tracing == 0); PyObject *owner = TOP(); PyObject *res; @@ -3700,7 +3687,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(STORE_ATTR_ADAPTIVE): { + TARGET(STORE_ATTR_ADAPTIVE) { assert(cframe.use_tracing == 0); SpecializedCacheEntry *cache = GET_CACHE(); if (cache->adaptive.counter == 0) { @@ -3721,7 +3708,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr } } - TARGET(STORE_ATTR_SPLIT_KEYS): { + TARGET(STORE_ATTR_SPLIT_KEYS) { assert(cframe.use_tracing == 0); PyObject *owner = TOP(); PyTypeObject *tp = Py_TYPE(owner); @@ -3759,7 +3746,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(STORE_ATTR_WITH_HINT): { + TARGET(STORE_ATTR_WITH_HINT) { assert(cframe.use_tracing == 0); PyObject *owner = TOP(); PyTypeObject *tp = Py_TYPE(owner); @@ -3795,7 +3782,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(STORE_ATTR_SLOT): { + TARGET(STORE_ATTR_SLOT) { assert(cframe.use_tracing == 0); PyObject *owner = TOP(); PyTypeObject *tp = Py_TYPE(owner); @@ -3816,7 +3803,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(COMPARE_OP): { + TARGET(COMPARE_OP) { assert(oparg <= Py_GE); PyObject *right = POP(); PyObject *left = TOP(); @@ -3831,7 +3818,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(IS_OP): { + TARGET(IS_OP) { PyObject *right = POP(); PyObject *left = TOP(); int res = Py_Is(left, right) ^ oparg; @@ -3845,7 +3832,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(CONTAINS_OP): { + TARGET(CONTAINS_OP) { PyObject *right = POP(); PyObject *left = POP(); int res = PySequence_Contains(right, left); @@ -3865,7 +3852,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr #define CANNOT_CATCH_MSG "catching classes that do not inherit from "\ "BaseException is not allowed" - TARGET(JUMP_IF_NOT_EXC_MATCH): { + TARGET(JUMP_IF_NOT_EXC_MATCH) { PyObject *right = POP(); PyObject *left = POP(); if (PyTuple_Check(right)) { @@ -3906,7 +3893,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(IMPORT_NAME): { + TARGET(IMPORT_NAME) { PyObject *name = GETITEM(names, oparg); PyObject *fromlist = POP(); PyObject *level = TOP(); @@ -3920,7 +3907,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(IMPORT_STAR): { + TARGET(IMPORT_STAR) { PyObject *from = POP(), *locals; int err; if (_PyFrame_FastToLocalsWithError(frame) < 0) { @@ -3943,7 +3930,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(IMPORT_FROM): { + TARGET(IMPORT_FROM) { PyObject *name = GETITEM(names, oparg); PyObject *from = TOP(); PyObject *res; @@ -3954,12 +3941,12 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(JUMP_FORWARD): { + TARGET(JUMP_FORWARD) { JUMPBY(oparg); DISPATCH(); } - TARGET(POP_JUMP_IF_FALSE): { + TARGET(POP_JUMP_IF_FALSE) { PREDICTED(POP_JUMP_IF_FALSE); PyObject *cond = POP(); int err; @@ -3986,7 +3973,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(POP_JUMP_IF_TRUE): { + TARGET(POP_JUMP_IF_TRUE) { PREDICTED(POP_JUMP_IF_TRUE); PyObject *cond = POP(); int err; @@ -4013,7 +4000,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(JUMP_IF_FALSE_OR_POP): { + TARGET(JUMP_IF_FALSE_OR_POP) { PyObject *cond = TOP(); int err; if (Py_IsTrue(cond)) { @@ -4037,7 +4024,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(JUMP_IF_TRUE_OR_POP): { + TARGET(JUMP_IF_TRUE_OR_POP) { PyObject *cond = TOP(); int err; if (Py_IsFalse(cond)) { @@ -4062,7 +4049,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(JUMP_ABSOLUTE): { + TARGET(JUMP_ABSOLUTE) { PREDICTED(JUMP_ABSOLUTE); if (oparg < INSTR_OFFSET()) { /* Increment the warmup counter and quicken if warm enough @@ -4084,13 +4071,13 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(JUMP_ABSOLUTE_QUICK): { + TARGET(JUMP_ABSOLUTE_QUICK) { JUMPTO(oparg); CHECK_EVAL_BREAKER(); DISPATCH(); } - TARGET(GET_LEN): { + TARGET(GET_LEN) { // PUSH(len(TOS)) Py_ssize_t len_i = PyObject_Length(TOP()); if (len_i < 0) { @@ -4104,7 +4091,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(MATCH_CLASS): { + TARGET(MATCH_CLASS) { // Pop TOS. On success, set TOS to True and TOS1 to a tuple of // attributes. On failure, set TOS to False. PyObject *names = POP(); @@ -4127,7 +4114,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(MATCH_MAPPING): { + TARGET(MATCH_MAPPING) { PyObject *subject = TOP(); int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING; PyObject *res = match ? Py_True : Py_False; @@ -4136,7 +4123,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(MATCH_SEQUENCE): { + TARGET(MATCH_SEQUENCE) { PyObject *subject = TOP(); int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE; PyObject *res = match ? Py_True : Py_False; @@ -4145,7 +4132,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(MATCH_KEYS): { + TARGET(MATCH_KEYS) { // On successful match for all keys, PUSH(values) and PUSH(True). // Otherwise, PUSH(None) and PUSH(False). PyObject *keys = TOP(); @@ -4166,7 +4153,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(COPY_DICT_WITHOUT_KEYS): { + TARGET(COPY_DICT_WITHOUT_KEYS) { // rest = dict(TOS1) // for key in TOS: // del rest[key] @@ -4192,7 +4179,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(GET_ITER): { + TARGET(GET_ITER) { /* before: [obj]; after [getiter(obj)] */ PyObject *iterable = TOP(); PyObject *iter = PyObject_GetIter(iterable); @@ -4205,7 +4192,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(GET_YIELD_FROM_ITER): { + TARGET(GET_YIELD_FROM_ITER) { /* before: [obj]; after [getiter(obj)] */ PyObject *iterable = TOP(); PyObject *iter; @@ -4234,7 +4221,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(FOR_ITER): { + TARGET(FOR_ITER) { PREDICTED(FOR_ITER); /* before: [iter]; after: [iter, iter()] *or* [] */ PyObject *iter = TOP(); @@ -4261,7 +4248,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BEFORE_ASYNC_WITH): { + TARGET(BEFORE_ASYNC_WITH) { _Py_IDENTIFIER(__aenter__); _Py_IDENTIFIER(__aexit__); PyObject *mgr = TOP(); @@ -4299,7 +4286,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BEFORE_WITH): { + TARGET(BEFORE_WITH) { _Py_IDENTIFIER(__enter__); _Py_IDENTIFIER(__exit__); PyObject *mgr = TOP(); @@ -4337,7 +4324,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(WITH_EXCEPT_START): { + TARGET(WITH_EXCEPT_START) { /* At the top of the stack are 8 values: - (TOP, SECOND, THIRD) = exc_info() - (FOURTH, FIFTH, SIXTH) = previous exception @@ -4367,7 +4354,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(PUSH_EXC_INFO): { + TARGET(PUSH_EXC_INFO) { PyObject *type = TOP(); PyObject *value = SECOND(); PyObject *tb = THIRD(); @@ -4398,7 +4385,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_METHOD): { + TARGET(LOAD_METHOD) { PREDICTED(LOAD_METHOD); STAT_INC(LOAD_METHOD, unquickened); /* Designed to work in tandem with CALL_METHOD. */ @@ -4437,7 +4424,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_METHOD_ADAPTIVE): { + TARGET(LOAD_METHOD_ADAPTIVE) { assert(cframe.use_tracing == 0); SpecializedCacheEntry *cache = GET_CACHE(); if (cache->adaptive.counter == 0) { @@ -4458,7 +4445,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr } } - TARGET(LOAD_METHOD_CACHED): { + TARGET(LOAD_METHOD_CACHED) { /* LOAD_METHOD, with cached method object */ assert(cframe.use_tracing == 0); PyObject *self = TOP(); @@ -4495,7 +4482,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_METHOD_MODULE): { + TARGET(LOAD_METHOD_MODULE) { /* LOAD_METHOD, for module methods */ assert(cframe.use_tracing == 0); PyObject *owner = TOP(); @@ -4507,7 +4494,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(LOAD_METHOD_CLASS): { + TARGET(LOAD_METHOD_CLASS) { /* LOAD_METHOD, for class methods */ assert(cframe.use_tracing == 0); SpecializedCacheEntry *caches = GET_CACHE(); @@ -4533,7 +4520,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(CALL_METHOD): { + TARGET(CALL_METHOD) { /* Designed to work in tamdem with LOAD_METHOD. */ PyObject **sp, *res; int meth_found; @@ -4577,7 +4564,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(CALL_METHOD_KW): { + TARGET(CALL_METHOD_KW) { /* Designed to work in tandem with LOAD_METHOD. Same as CALL_METHOD but pops TOS to get a tuple of keyword names. */ PyObject **sp, *res; @@ -4601,7 +4588,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(CALL_FUNCTION): { + TARGET(CALL_FUNCTION) { PREDICTED(CALL_FUNCTION); PyObject **sp, *res; sp = stack_pointer; @@ -4615,7 +4602,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(CALL_FUNCTION_KW): { + TARGET(CALL_FUNCTION_KW) { PyObject **sp, *res, *names; names = POP(); @@ -4635,7 +4622,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(CALL_FUNCTION_EX): { + TARGET(CALL_FUNCTION_EX) { PREDICTED(CALL_FUNCTION_EX); PyObject *func, *callargs, *kwargs = NULL, *result; if (oparg & 0x01) { @@ -4682,7 +4669,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(MAKE_FUNCTION): { + TARGET(MAKE_FUNCTION) { PyObject *codeobj = POP(); PyFunctionObject *func = (PyFunctionObject *) PyFunction_New(codeobj, GLOBALS()); @@ -4713,7 +4700,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(BUILD_SLICE): { + TARGET(BUILD_SLICE) { PyObject *start, *stop, *step, *slice; if (oparg == 3) step = POP(); @@ -4731,7 +4718,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(FORMAT_VALUE): { + TARGET(FORMAT_VALUE) { /* Handles f-string value formatting. */ PyObject *result; PyObject *fmt_spec; @@ -4791,7 +4778,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(ROT_N): { + TARGET(ROT_N) { PyObject *top = TOP(); memmove(&PEEK(oparg - 1), &PEEK(oparg), sizeof(PyObject*) * (oparg - 1)); @@ -4799,7 +4786,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH(); } - TARGET(EXTENDED_ARG): { + TARGET(EXTENDED_ARG) { int oldoparg = oparg; NEXTOPARG(); oparg |= oldoparg << 8; @@ -4807,6 +4794,45 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr DISPATCH_GOTO(); } +#if USE_COMPUTED_GOTOS + TARGET_DO_TRACING: { +#else + case DO_TRACING: { +#endif + int instr_prev = skip_backwards_over_extended_args(co, frame->f_lasti); + frame->f_lasti = INSTR_OFFSET(); + TRACING_NEXTOPARG(); + if (PyDTrace_LINE_ENABLED()) { + maybe_dtrace_line(frame, &tstate->trace_info, instr_prev); + } + /* line-by-line tracing support */ + + if (cframe.use_tracing && + tstate->c_tracefunc != NULL && !tstate->tracing) { + int err; + /* see maybe_call_line_trace() + for expository comments */ + _PyFrame_SetStackPointer(frame, stack_pointer); + + err = maybe_call_line_trace(tstate->c_tracefunc, + tstate->c_traceobj, + tstate, frame, instr_prev); + if (err) { + /* trace function raised an exception */ + next_instr++; + goto error; + } + /* Reload possibly changed frame fields */ + JUMPTO(frame->f_lasti); + + stack_pointer = _PyFrame_GetStackPointer(frame); + frame->stacktop = -1; + TRACING_NEXTOPARG(); + } + PRE_DISPATCH_GOTO(); + DISPATCH_GOTO(); + } + #if USE_COMPUTED_GOTOS _unknown_opcode: @@ -6001,7 +6027,7 @@ call_trace(Py_tracefunc func, PyObject *obj, result = func(obj, f, what, arg); f->f_lineno = 0; tstate->cframe->use_tracing = ((tstate->c_tracefunc != NULL) - || (tstate->c_profilefunc != NULL)); + || (tstate->c_profilefunc != NULL)) ? 255 : 0; tstate->tracing--; return result; } @@ -6016,7 +6042,7 @@ _PyEval_CallTracing(PyObject *func, PyObject *args) tstate->tracing = 0; tstate->cframe->use_tracing = ((tstate->c_tracefunc != NULL) - || (tstate->c_profilefunc != NULL)); + || (tstate->c_profilefunc != NULL)) ? 255 : 0; result = PyObject_Call(func, args, NULL); tstate->tracing = save_tracing; tstate->cframe->use_tracing = save_use_tracing; @@ -6081,7 +6107,7 @@ _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) tstate->c_profilefunc = func; /* Flag that tracing or profiling is turned on */ - tstate->cframe->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL); + tstate->cframe->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL) ? 255 : 0; return 0; } @@ -6114,7 +6140,7 @@ _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) tstate->c_tracefunc = NULL; tstate->c_traceobj = NULL; /* Must make sure that profiling is not ignored if 'traceobj' is freed */ - tstate->cframe->use_tracing = (tstate->c_profilefunc != NULL); + tstate->cframe->use_tracing = (tstate->c_profilefunc != NULL) ? 255 : 0; Py_XDECREF(traceobj); Py_XINCREF(arg); @@ -6123,7 +6149,7 @@ _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) /* Flag that tracing or profiling is turned on */ tstate->cframe->use_tracing = ((func != NULL) - || (tstate->c_profilefunc != NULL)); + || (tstate->c_profilefunc != NULL)) ? 255 : 0; return 0; } @@ -6871,6 +6897,7 @@ unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w, */ int opcode, oparg; NEXTOPARG(); + next_instr++; switch (opcode) { case STORE_FAST: { diff --git a/Python/makeopcodetargets.py b/Python/makeopcodetargets.py index 189d72a8c84af3..3bf2e35ccb6dab 100755 --- a/Python/makeopcodetargets.py +++ b/Python/makeopcodetargets.py @@ -32,6 +32,7 @@ def write_contents(f): """ opcode = find_module('opcode') targets = ['_unknown_opcode'] * 256 + targets[255] = "TARGET_DO_TRACING" for opname, op in opcode.opmap.items(): targets[op] = "TARGET_%s" % opname next_op = 1 diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index f3bfae545bcd48..30df68382536ad 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -254,5 +254,5 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode + &&TARGET_DO_TRACING }; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 6e7e45bf3fde20..f2cd3a9d5a0109 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -268,7 +268,7 @@ sys_audit_tstate(PyThreadState *ts, const char *event, break; } if (canTrace) { - ts->cframe->use_tracing = (ts->c_tracefunc || ts->c_profilefunc); + ts->cframe->use_tracing = (ts->c_tracefunc || ts->c_profilefunc) ? 255 : 0; ts->tracing--; } PyObject* args[2] = {eventName, eventArgs}; @@ -283,7 +283,7 @@ sys_audit_tstate(PyThreadState *ts, const char *event, Py_DECREF(o); Py_CLEAR(hook); } - ts->cframe->use_tracing = (ts->c_tracefunc || ts->c_profilefunc); + ts->cframe->use_tracing = (ts->c_tracefunc || ts->c_profilefunc) ? 255 : 0; ts->tracing--; if (_PyErr_Occurred(ts)) { goto exit; diff --git a/Tools/scripts/generate_opcode_h.py b/Tools/scripts/generate_opcode_h.py index 48875d2a9dd391..dca9bbcfcbc839 100644 --- a/Tools/scripts/generate_opcode_h.py +++ b/Tools/scripts/generate_opcode_h.py @@ -72,7 +72,7 @@ def main(opcode_py, outfile='Include/opcode.h'): next_op += 1 fobj.write("#define %-23s %3s\n" % (name, next_op)) used[next_op] = True - + fobj.write("#define DO_TRACING 255\n") fobj.write("#ifdef NEED_OPCODE_JUMP_TABLES\n") write_int_array_from_ops("_PyOpcode_RelativeJump", opcode['hasjrel'], fobj) write_int_array_from_ops("_PyOpcode_Jump", opcode['hasjrel'] + opcode['hasjabs'], fobj) From 0af08f343a7b792f527b78e2a35d9453039940c2 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 5 Oct 2021 06:02:57 -0400 Subject: [PATCH 067/263] bpo-45163: Restrict added libnetwork check to builds on Haiku. (GH-28729) For example, without the guard the check could cause macOS installer builds to fail to install on older supported macOS releases where libnetwork is not available and is not needed on any release. --- configure | 7 +++++-- configure.ac | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/configure b/configure index 3b39641bab37c6..3a6cf305171bcd 100755 --- a/configure +++ b/configure @@ -10573,8 +10573,9 @@ if test "x$ac_cv_lib_socket_socket" = xyes; then : fi # SVR4 sockets -# Haiku system library -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lnetwork" >&5 +case $ac_sys_system/$ac_sys_release in + Haiku*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lnetwork" >&5 $as_echo_n "checking for socket in -lnetwork... " >&6; } if ${ac_cv_lib_network_socket+:} false; then : $as_echo_n "(cached) " >&6 @@ -10614,6 +10615,8 @@ if test "x$ac_cv_lib_network_socket" = xyes; then : LIBS="-lnetwork $LIBS" fi + ;; +esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-libs" >&5 $as_echo_n "checking for --with-libs... " >&6; } diff --git a/configure.ac b/configure.ac index 908dd28e7aacad..c7cb797e8f3a0b 100644 --- a/configure.ac +++ b/configure.ac @@ -3099,8 +3099,11 @@ AC_SUBST(TZPATH) AC_CHECK_LIB(nsl, t_open, [LIBS="-lnsl $LIBS"]) # SVR4 AC_CHECK_LIB(socket, socket, [LIBS="-lsocket $LIBS"], [], $LIBS) # SVR4 sockets -# Haiku system library -AC_CHECK_LIB(network, socket, [LIBS="-lnetwork $LIBS"], [], $LIBS) +case $ac_sys_system/$ac_sys_release in + Haiku*) + AC_CHECK_LIB(network, socket, [LIBS="-lnetwork $LIBS"], [], $LIBS) + ;; +esac AC_MSG_CHECKING(for --with-libs) AC_ARG_WITH(libs, From de4052fe0633e3a053e66c8477f13677054d6ede Mon Sep 17 00:00:00 2001 From: Jeremy Kloth Date: Tue, 5 Oct 2021 06:17:13 -0600 Subject: [PATCH 068/263] bpo-45354: Skip obsolete device name tests on Windows 11 (GH-28712) --- Lib/test/test_winconsoleio.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_winconsoleio.py b/Lib/test/test_winconsoleio.py index 1807e47c66c387..70a85552cc03b0 100644 --- a/Lib/test/test_winconsoleio.py +++ b/Lib/test/test_winconsoleio.py @@ -92,9 +92,11 @@ def test_open_name(self): f.close() f.close() - f = open('C:/con', 'rb', buffering=0) - self.assertIsInstance(f, ConIO) - f.close() + # bpo-45354: Windows 11 changed MS-DOS device name handling + if sys.getwindowsversion()[:3] < (10, 0, 22000): + f = open('C:/con', 'rb', buffering=0) + self.assertIsInstance(f, ConIO) + f.close() @unittest.skipIf(sys.getwindowsversion()[:2] <= (6, 1), "test does not work on Windows 7 and earlier") @@ -114,7 +116,8 @@ def test_conout_path(self): conout_path = os.path.join(temp_path, 'CONOUT$') with open(conout_path, 'wb', buffering=0) as f: - if sys.getwindowsversion()[:2] > (6, 1): + # bpo-45354: Windows 11 changed MS-DOS device name handling + if (6, 1) < sys.getwindowsversion()[:3] < (10, 0, 22000): self.assertIsInstance(f, ConIO) else: self.assertNotIsInstance(f, ConIO) From 5146877623ebe8a2806411703b0de9c0aba179a1 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 5 Oct 2021 13:37:43 +0100 Subject: [PATCH 069/263] bpo-45375: Fix assertion failure due to searching for stdlib in unnormalised paths (GH-28735) --- .../2021-10-05-12-41-53.bpo-45375.CohPP-.rst | 2 ++ PC/getpathp.c | 24 ++++++++++++++++++- PCbuild/regen.targets | 4 +++- 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2021-10-05-12-41-53.bpo-45375.CohPP-.rst diff --git a/Misc/NEWS.d/next/Windows/2021-10-05-12-41-53.bpo-45375.CohPP-.rst b/Misc/NEWS.d/next/Windows/2021-10-05-12-41-53.bpo-45375.CohPP-.rst new file mode 100644 index 00000000000000..c72164373abe6b --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2021-10-05-12-41-53.bpo-45375.CohPP-.rst @@ -0,0 +1,2 @@ +Fixes an assertion failure due to searching for the standard library in +unnormalised paths. diff --git a/PC/getpathp.c b/PC/getpathp.c index 16bb4997f819b7..98a754976c6708 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -265,7 +265,21 @@ canonicalize(wchar_t *buffer, const wchar_t *path) return _PyStatus_NO_MEMORY(); } - if (FAILED(PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) { + if (PathIsRelativeW(path)) { + wchar_t buff[MAXPATHLEN]; + if (!GetCurrentDirectoryW(MAXPATHLEN, buff)) { + return _PyStatus_ERR("unable to find current working directory"); + } + if (FAILED(PathCchCombineEx(buff, MAXPATHLEN + 1, buff, path, PATHCCH_ALLOW_LONG_PATHS))) { + return INIT_ERR_BUFFER_OVERFLOW(); + } + if (FAILED(PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, buff, PATHCCH_ALLOW_LONG_PATHS))) { + return INIT_ERR_BUFFER_OVERFLOW(); + } + return _PyStatus_OK(); + } + + if (FAILED(PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, PATHCCH_ALLOW_LONG_PATHS))) { return INIT_ERR_BUFFER_OVERFLOW(); } return _PyStatus_OK(); @@ -291,6 +305,9 @@ search_for_prefix(wchar_t *prefix, const wchar_t *argv0_path) /* Search from argv0_path, until LANDMARK is found. We guarantee 'prefix' is null terminated in bounds. */ wcscpy_s(prefix, MAXPATHLEN+1, argv0_path); + if (!prefix[0]) { + return 0; + } wchar_t stdlibdir[MAXPATHLEN+1]; wcscpy_s(stdlibdir, Py_ARRAY_LENGTH(stdlibdir), prefix); /* We initialize with the longest possible path, in case it doesn't fit. @@ -925,6 +942,7 @@ calculate_module_search_path(PyCalculatePath *calculate, the parent of that. */ if (prefix[0] == L'\0') { + PyStatus status; wchar_t lookBuf[MAXPATHLEN+1]; const wchar_t *look = buf - 1; /* 'buf' is at the end of the buffer */ while (1) { @@ -939,6 +957,10 @@ calculate_module_search_path(PyCalculatePath *calculate, nchars = lookEnd-look; wcsncpy(lookBuf, look+1, nchars); lookBuf[nchars] = L'\0'; + status = canonicalize(lookBuf, lookBuf); + if (_PyStatus_EXCEPTION(status)) { + return status; + } /* Up one level to the parent */ reduce(lookBuf); if (search_for_prefix(prefix, lookBuf)) { diff --git a/PCbuild/regen.targets b/PCbuild/regen.targets index 9492cff2d8c3ea..c0bde1ec6ba511 100644 --- a/PCbuild/regen.targets +++ b/PCbuild/regen.targets @@ -104,7 +104,9 @@ Condition="($(Platform) == 'Win32' or $(Platform) == 'x64') and $(Configuration) != 'PGInstrument' and $(Configuration) != 'PGUpdate'"> - From 7c12e4835ebe52287acd200a2e76b533413b15d0 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 5 Oct 2021 13:42:52 +0100 Subject: [PATCH 070/263] Python 3.11.0a1 --- Include/patchlevel.h | 4 +- Lib/pydoc_data/topics.py | 867 ++- Misc/NEWS.d/3.11.0a1.rst | 5098 +++++++++++++++++ .../2021-05-24-03-31-17.bpo-41282.L8nP44.rst | 3 - .../2021-06-10-18-08-44.bpo-44381.Xpc1iX.rst | 2 - .../2021-06-19-11-50-03.bpo-43298.9ircMb.rst | 1 - .../2021-06-30-02-32-46.bpo-44535.M9iN4-.rst | 1 - .../2021-07-19-01-09-56.bpo-44340.JNeOf4.rst | 2 - .../2021-08-26-13-10-46.bpo-45019.e0mo49.rst | 3 - .../2021-09-09-16-45-26.bpo-45067.mFmY92.rst | 7 - .../2021-09-11-06-05-23.bpo-45163.q7xT93.rst | 1 - .../2021-09-14-00-47-57.bpo-45188.MNbo_T.rst | 3 - .../2021-09-14-10-07-23.bpo-45020._VGGPv.rst | 4 - .../2021-09-16-18-00-43.bpo-45220.TgbkvW.rst | 3 - .../2020-12-23-01-28-50.bpo-42035.S9eUm0.rst | 1 - .../2021-05-04-17-43-39.bpo-44029.ayX4PR.rst | 9 - .../2021-05-05-19-04-50.bpo-43795.9Ojj73.rst | 2 - .../2021-05-10-14-34-22.bpo-44094.HayXZO.rst | 4 - .../2021-05-12-12-24-45.bpo-44113.DcgOqE.rst | 14 - .../2021-05-19-15-09-47.bpo-43795.WAHRxt.rst | 1 - .../2021-05-31-11-31-13.bpo-44263.8mIOfV.rst | 4 - .../2021-06-03-00-59-48.bpo-39573.-elHTJ.rst | 3 - .../2021-06-10-15-22-31.bpo-44378.jGYakF.rst | 3 - .../2021-06-15-16-28-18.bpo-43795.fy0AXK.rst | 3 - .../2021-06-22-17-00-06.bpo-40939.CGB0I5.rst | 1 - .../2021-06-23-10-31-45.bpo-39947.je_HMo.rst | 20 - .../2021-06-23-12-12-04.bpo-44441.3p14JB.rst | 4 - .../2021-06-28-23-44-47.bpo-44530.qij7YC.rst | 4 - .../2021-07-20-16-21-06.bpo-42747.rRxjUY.rst | 4 - .../2021-07-27-17-29-12.bpo-44751.4qmbDG.rst | 1 - .../2021-07-29-16-04-28.bpo-41103.hiKKcF.rst | 2 - .../2021-08-02-20-49-36.bpo-42035.HTBcZt.rst | 2 - .../2021-08-31-15-21-36.bpo-45061.ZH0HVe.rst | 3 - .../2021-09-03-15-53-43.bpo-45094.tinXwL.rst | 2 - .../2021-09-16-18-05-20.bpo-45116.WxXewl.rst | 3 - .../2021-09-19-17-18-25.bpo-44687.3fqDRC.rst | 1 - .../2021-09-30-03-14-35.bpo-41710.DDWJKx.rst | 2 - .../2018-05-11-12-44-03.bpo-33346.ZgBkvB.rst | 3 - .../2019-12-21-14-18-32.bpo-39091.dOexgQ.rst | 1 - .../2020-06-02-13-21-14.bpo-11105.wceryW.rst | 3 - .../2021-01-13-19-34-41.bpo-28146.AZBBkH.rst | 1 - .../2021-03-22-17-50-30.bpo-17792._zssjS.rst | 1 - .../2021-04-02-15-02-16.bpo-43693.l3Ureu.rst | 4 - .../2021-04-17-16-08-00.bpo-43879.zkyJgh.rst | 1 - .../2021-04-18-18-07-33.bpo-43833.oChkCi.rst | 4 - .../2021-04-23-03-46-45.bpo-43918.nNDY3S.rst | 1 - .../2021-04-30-15-48-36.bpo-40222.j3VxeX.rst | 7 - .../2021-05-04-01-01-04.bpo-43822.9VeCg0.rst | 2 - .../2021-05-08-17-18-37.bpo-43149.Kp5FxD.rst | 2 - .../2021-05-08-19-54-57.bpo-28307.7ysaVW.rst | 3 - .../2021-05-10-18-49-13.bpo-26110.EQzqqA.rst | 3 - .../2021-05-11-21-52-44.bpo-44110.VqbAsB.rst | 1 - .../2021-05-12-14-26-16.bpo-44114.p-WfAE.rst | 1 - .../2021-05-14-20-03-32.bpo-44032.OzT1ob.rst | 2 - .../2021-05-15-17-30-57.bpo-44143.7UTS6H.rst | 2 - .../2021-05-17-20-44-45.bpo-44156.8KSp9l.rst | 1 - .../2021-05-18-11-27-02.bpo-44168.mgB-rt.rst | 2 - .../2021-05-19-20-33-36.bpo-44180.mQVaAs.rst | 3 - .../2021-05-20-12-43-04.bpo-44187.3lk0L1.rst | 3 - .../2021-05-21-01-42-45.bpo-44184.9qOptC.rst | 3 - .../2021-05-21-20-53-49.bpo-43693.-NN3J_.rst | 3 - .../2021-05-21-21-16-03.bpo-44201.bGaSjt.rst | 3 - .../2021-05-25-18-20-10.bpo-44232.DMcCCf.rst | 4 - .../2021-05-26-19-10-47.bpo-43693.1KSG9u.rst | 5 - .../2021-05-27-17-34-29.bpo-43667.ND9jP3.rst | 2 - .../2021-05-30-16-37-47.bpo-43413.vYFPPC.rst | 4 - .../2021-06-03-22-51-50.bpo-44305.66dVDG.rst | 2 - .../2021-06-05-02-34-57.bpo-44304._MAoPc.rst | 2 - .../2021-06-06-00-29-14.bpo-44317.xPPhcZ.rst | 1 - .../2021-06-07-15-13-44.bpo-43693.c_zDeY.rst | 4 - .../2021-06-08-01-13-47.bpo-44335.GQTTkl.rst | 2 - .../2021-06-08-10-22-46.bpo-44337.RTjmIt.rst | 11 - .../2021-06-08-22-49-06.bpo-44349.xgEgeA.rst | 1 - .../2021-06-09-22-56-59.bpo-44368.vgT0Cx.rst | 1 - .../2021-06-10-10-06-18.bpo-44338.c4Myr4.rst | 7 - .../2021-06-10-16-10-39.bpo-44313.34RjI8.rst | 4 - .../2021-06-11-17-37-15.bpo-44376.zhM1UW.rst | 1 - .../2021-06-11-18-17-42.bpo-44396.Z9EKim.rst | 2 - .../2021-06-13-23-12-18.bpo-44409.eW4LS-.rst | 2 - .../2021-06-18-22-08-25.bpo-44456.L0Rhko.rst | 2 - .../2021-06-19-12-41-13.bpo-44297.F53vHj.rst | 3 - .../2021-06-20-10-53-21.bpo-12022.SW240M.rst | 4 - .../2021-06-21-11-19-54.bpo-44472.Vvm1yn.rst | 1 - .../2021-06-22-10-55-23.bpo-44486.wct-9X.rst | 2 - .../2021-06-22-19-08-19.bpo-44483.eq2f7T.rst | 2 - .../2021-06-29-11-49-29.bpo-44523.67-ZIP.rst | 3 - .../2021-07-01-11-59-34.bpo-44490.xY80VR.rst | 2 - .../2021-07-02-22-54-41.bpo-44553.l9YqGg.rst | 2 - .../2021-07-03-00-20-39.bpo-43908.YHuV_s.rst | 3 - .../2021-07-04-17-41-47.bpo-41486.DiM24a.rst | 3 - .../2021-07-04-23-38-51.bpo-44562.QdeRQo.rst | 2 - .../2021-07-06-15-27-11.bpo-43950.LhL2-q.rst | 6 - .../2021-07-06-22-22-15.bpo-44490.BJxPbZ.rst | 3 - .../2021-07-07-16-05-35.bpo-43895.JFjR0-.rst | 4 - .../2021-07-08-12-18-56.bpo-44584.qKnSqV.rst | 3 - .../2021-07-09-12-08-17.bpo-44590.a2ntVX.rst | 5 - .../2021-07-12-04-06-57.bpo-41972.nDX5k_.rst | 1 - .../2021-07-13-17-47-32.bpo-42073.9wopiC.rst | 2 - .../2021-07-13-20-22-12.bpo-44606.S3Bv2w.rst | 1 - .../2021-07-13-23-19-41.bpo-44589.59OH8T.rst | 2 - .../2021-07-14-10-31-10.bpo-26280.cgpM4B.rst | 9 - .../2021-07-14-13-54-07.bpo-44635.7ZMAdB.rst | 1 - .../2021-07-16-01-01-11.bpo-44611.LcfHN-.rst | 2 - .../2021-07-16-09-36-12.bpo-44636.ZWebi8.rst | 1 - .../2021-07-16-09-59-13.bpo-44646.Yb6s05.rst | 2 - .../2021-07-16-20-25-37.bpo-44655.I3wRjL.rst | 2 - .../2021-07-16-21-35-14.bpo-44655.95I7M6.rst | 2 - .../2021-07-17-13-41-58.bpo-44662.q22kWR.rst | 3 - .../2021-07-17-14-20-59.bpo-44661.BQbXiH.rst | 2 - .../2021-07-17-21-04-04.bpo-44633.5-zKeI.rst | 2 - .../2021-07-19-19-53-46.bpo-44676.WgIMvh.rst | 2 - .../2021-07-19-20-49-06.bpo-44653.WcqGyI.rst | 1 - .../2021-07-21-15-26-56.bpo-44698.DA4_0o.rst | 1 - .../2021-07-23-01-52-13.bpo-44717.-vVmAh.rst | 1 - .../2021-07-23-15-17-01.bpo-44725.qcuKaa.rst | 1 - .../2021-07-26-15-27-03.bpo-44732.IxObt3.rst | 1 - .../2021-07-27-11-14-22.bpo-34013.SjLFe-.rst | 3 - .../2021-07-31-12-12-57.bpo-44792.mOReTW.rst | 1 - .../2021-08-04-11-37-38.bpo-44821.67YHGI.rst | 2 - .../2021-08-05-17-42-03.bpo-44838.r_Lkj_.rst | 2 - .../2021-08-05-17-49-55.bpo-44826.zQsyK5.rst | 9 - .../2021-08-07-01-26-12.bpo-44856.9rk3li.rst | 1 - .../2021-08-07-21-39-19.bpo-25782.B22lMx.rst | 1 - .../2021-08-09-14-29-52.bpo-33930.--5LQ-.rst | 2 - .../2021-08-09-16-16-03.bpo-44872.OKRlhK.rst | 1 - .../2021-08-09-19-05-20.bpo-44874.oOcfU4.rst | 1 - .../2021-08-11-12-03-52.bpo-44878.nEhjLi.rst | 2 - .../2021-08-11-14-12-41.bpo-44878.pAbBfc.rst | 2 - .../2021-08-11-15-39-57.bpo-44885.i4noUO.rst | 2 - .../2021-08-11-16-46-27.bpo-44890.PwNg8N.rst | 1 - .../2021-08-11-20-45-02.bpo-44889.2T3nTn.rst | 8 - .../2021-08-12-14-00-57.bpo-44900.w2gpwy.rst | 7 - .../2021-08-14-20-13-21.bpo-44895.Ic9m90.rst | 2 - .../2021-08-15-10-39-06.bpo-44698.lITKNc.rst | 2 - .../2021-08-16-11-36-02.bpo-44914.6Lgrx3.rst | 5 - .../2021-08-16-23-16-17.bpo-44929.qpMEky.rst | 2 - .../2021-08-18-11-14-38.bpo-44945.CO3s77.rst | 7 - .../2021-08-18-19-09-28.bpo-44947.mcvGdS.rst | 2 - .../2021-08-19-14-43-24.bpo-44954.dLn3lg.rst | 2 - .../2021-08-22-12-28-50.bpo-24234.n3oTdx.rst | 3 - .../2021-08-23-10-36-55.bpo-24234.MGVUQi.rst | 3 - .../2021-08-23-19-55-08.bpo-44962.J00ftt.rst | 1 - .../2021-08-25-23-07-10.bpo-44963.5EET8y.rst | 2 - .../2021-08-25-23-17-32.bpo-45000.XjmyLl.rst | 2 - .../2021-08-26-18-44-03.bpo-45018.pu8H9L.rst | 1 - .../2021-08-31-11-09-52.bpo-45012.ueeOcx.rst | 2 - .../2021-08-31-17-44-51.bpo-45020.ZPI_3L.rst | 3 - .../2021-09-01-16-55-43.bpo-45056.7AK2d9.rst | 1 - .../2021-09-01-19-21-48.bpo-34561.uMAVA-.rst | 1 - .../2021-09-01-23-55-49.bpo-45083.cLi9G3.rst | 3 - .../2021-09-02-01-28-01.bpo-37330.QDjM_l.rst | 4 - .../2021-09-03-12-35-17.bpo-41031.yPSJEs.rst | 1 - ...2021-09-03-16-18-10.bpo-1514420.2Lumpj.rst | 1 - .../2021-09-06-21-52-45.bpo-45123.8Eh9iI.rst | 3 - .../2021-09-07-00-21-04.bpo-44348.f8w_Td.rst | 8 - .../2021-09-07-17-10-16.bpo-45121.iG-Hsf.rst | 2 - .../2021-09-08-08-29-41.bpo-44959.OSwwPf.rst | 1 - .../2021-09-09-10-32-33.bpo-44219.WiYyjz.rst | 5 - .../2021-09-09-15-05-17.bpo-45155.JRw9TG.rst | 3 - .../2021-09-14-09-23-59.bpo-45167.CPSSoV.rst | 1 - .../2021-09-14-10-02-12.bpo-45190.ZFRgSj.rst | 1 - .../2021-09-20-10-02-12.bpo-24076.ZFgFSj.rst | 1 - .../2021-09-21-22-27-25.bpo-45061.5IOUf0.rst | 5 - .../2021-10-04-16-11-50.bpo-43760.R9QoUv.rst | 3 - .../2018-05-19-15-59-29.bpo-33479.4cLlxo.rst | 4 - .../2020-01-30-05-18-48.bpo-39498.Nu3sFL.rst | 1 - .../2020-03-21-01-19-28.bpo-21760.CqofIc.rst | 2 - .../2020-08-21-22-59-37.bpo-41576.7a6CQR.rst | 1 - .../2020-08-24-13-35-04.bpo-41621.nqaw9G.rst | 1 - .../2020-09-03-13-37-19.bpo-41706._zXWOR.rst | 2 - .../2021-05-03-22-08-08.bpo-44025.gcB7iP.rst | 1 - .../2021-05-07-12-27-09.bpo-43558.UGhA8R.rst | 2 - .../2021-05-08-09-48-05.bpo-44072.fb2x5I.rst | 2 - .../2021-05-17-20-03-47.bpo-41963.eUz9_o.rst | 1 - .../2021-05-23-09-11-28.bpo-44195.1bqkOs.rst | 2 - .../2021-05-26-11-16-33.bpo-42392.oxRx6E.rst | 2 - .../2021-06-06-14-12-00.bpo-44322.K0PHfE.rst | 2 - .../2021-06-14-09-20-37.bpo-38291.VMYa_Q.rst | 2 - .../2021-06-16-18-09-49.bpo-44392.6RF1Sc.rst | 2 - .../2021-06-18-06-44-45.bpo-44453.3PIkj2.rst | 1 - .../2021-06-18-18-04-53.bpo-27752.NEByNk.rst | 1 - .../2021-06-21-15-46-32.bpo-13814.LDcslu.rst | 1 - .../2021-06-23-15-21-36.bpo-39452.o_I-6d.rst | 4 - .../2021-06-24-14-37-16.bpo-43066.Ti7ahX.rst | 2 - .../2021-06-26-17-41-06.bpo-40620.PAYDrB.rst | 2 - .../2021-06-28-12-13-48.bpo-38062.9Ehp9O.rst | 1 - .../2021-07-02-14-02-29.bpo-44544._5_aCz.rst | 4 - .../2021-07-03-18-25-17.bpo-44558.0pTknl.rst | 2 - .../2021-07-12-11-39-20.bpo-44613.DIXNzc.rst | 1 - .../2021-07-13-22-25-13.bpo-44631.qkGwe4.rst | 1 - .../2021-07-15-11-19-03.bpo-42958.gC5IHM.rst | 2 - .../2021-07-18-22-26-02.bpo-44651.SjT9iY.rst | 1 - .../2021-07-18-22-43-14.bpo-44561.T7HpWm.rst | 3 - .../2021-07-20-21-03-18.bpo-30511.eMFkRi.rst | 2 - .../2021-07-22-08-28-03.bpo-35183.p9BWTB.rst | 1 - .../2021-07-25-23-04-15.bpo-44693.JuCbNq.rst | 2 - .../2021-07-26-23-48-31.bpo-44740.zMFGMV.rst | 2 - .../2021-08-09-19-58-45.bpo-36700.WPNW5f.rst | 3 - .../2021-08-11-18-02-06.bpo-33479.rCe4c5.rst | 2 - .../2021-08-13-19-08-03.bpo-44903.aJuvQF.rst | 3 - .../2021-08-13-20-17-59.bpo-16580.MZ_iK9.rst | 2 - .../2021-08-19-15-53-08.bpo-44957.imqrh3.rst | 3 - .../2021-09-08-17-20-19.bpo-45024.dkNPNi.rst | 4 - .../2021-09-18-13-45-19.bpo-45216.o56nyt.rst | 2 - .../2021-05-05-09-45-24.bpo-44026.m2Z0zR.rst | 2 - .../2021-05-09-09-02-09.bpo-44010.TaLe9x.rst | 5 - .../2021-05-27-13-39-43.bpo-41611.liNQqj.rst | 1 - .../2021-05-27-18-22-46.bpo-41611.jOKpfc.rst | 1 - .../2021-06-08-03-04-51.bpo-40468.tUCGUb.rst | 4 - .../2021-06-10-00-50-02.bpo-33962.ikAUNg.rst | 2 - .../2021-06-11-17-43-39.bpo-40128.7vDN3U.rst | 3 - .../2021-09-15-03-20-06.bpo-45193.G61_GV.rst | 1 - .../2021-09-27-01-21-59.bpo-45296.9H8rdY.rst | 2 - .../2017-09-20-14-43-03.bpo-29298._78CSN.rst | 2 - .../2018-04-24-14-25-07.bpo-33349.Y_0LIr.rst | 1 - .../2019-02-26-09-31-59.bpo-26228.wyrHKc.rst | 1 - .../2019-05-08-15-14-32.bpo-16379.rN5JVe.rst | 2 - .../2019-06-03-23-53-25.bpo-27513.qITN7d.rst | 3 - .../2019-09-25-13-54-41.bpo-30256.wBkzox.rst | 1 - .../2019-10-08-14-08-59.bpo-38415.N1bUw6.rst | 3 - .../2019-11-12-18-59-33.bpo-38741.W7IYkq.rst | 1 - .../2020-01-16-13-54-28.bpo-39359.hzTu0h.rst | 1 - .../2020-01-16-23-41-16.bpo-38840.VzzYZz.rst | 1 - .../2020-01-25-12-58-20.bpo-37022.FUZI25.rst | 1 - .../2020-02-03-21-18-31.bpo-39549.l4a8uH.rst | 4 - .../2020-04-24-20-39-38.bpo-34990.3SmL9M.rst | 2 - .../2020-05-21-01-42-32.bpo-40563.fDn5bP.rst | 1 - .../2020-05-25-23-58-29.bpo-5846.O9BIfm.rst | 14 - .../2020-05-30-10-48-04.bpo-24391.ZCTnhX.rst | 3 - .../2020-07-01-17-42-41.bpo-41137.AnqbP-.rst | 1 - .../2020-07-13-23-46-59.bpo-32695.tTqqXe.rst | 2 - .../2020-07-26-18-17-30.bpo-41402.YRkVkp.rst | 1 - .../2020-07-30-14-37-15.bpo-20684.qV35GU.rst | 2 - .../2020-09-10-07-23-24.bpo-41730.DyKFi9.rst | 1 - .../2020-10-01-21-46-34.bpo-40956._tvsZ7.rst | 1 - .../2020-10-11-20-23-48.bpo-37449.f-t3V6.rst | 1 - .../2020-10-18-09-42-53.bpo-40497.CRz2sG.rst | 4 - .../2020-12-08-01-08-58.bpo-41818.zO8vV7.rst | 1 - .../2021-01-13-00-02-44.bpo-42862.Z6ACLN.rst | 4 - .../2021-01-16-18-36-00.bpo-33809.BiMK6V.rst | 2 - .../2021-01-25-21-24-55.bpo-43024.vAUrIi.rst | 1 - .../2021-01-31-18-24-54.bpo-43086.2_P-SH.rst | 3 - .../2021-02-02-20-11-14.bpo-42971.OpVoFu.rst | 2 - .../2021-02-04-23-16-03.bpo-30077.v6TqAi.rst | 1 - .../2021-02-15-21-17-46.bpo-43232.awc4yZ.rst | 2 - .../2021-02-15-22-14-31.bpo-43234.F-vKAT.rst | 3 - .../2021-02-25-08-32-06.bpo-43318.bZJw6V.rst | 1 - .../2021-03-03-13-32-37.bpo-43392.QQumou.rst | 4 - .../2021-03-24-09-40-02.bpo-43612.vMGZ4y.rst | 5 - .../2021-03-29-00-23-30.bpo-43650.v01tic.rst | 2 - .../2021-03-30-08-39-08.bpo-43666.m72tlH.rst | 6 - .../2021-04-15-12-02-17.bpo-43853.XXCVAp.rst | 7 - .../2021-04-29-00-48-00.bpo-28528.JLAVWj.rst | 2 - .../2021-04-30-16-58-24.bpo-43972.Y2r9lg.rst | 3 - .../2021-05-01-15-43-37.bpo-44002.KLT_wd.rst | 5 - .../2021-05-02-13-54-25.bpo-38352.N9MlhV.rst | 2 - .../2021-05-03-10-07-43.bpo-44018.VDyW8f.rst | 1 - .../2021-05-03-19-59-14.bpo-40465.1tB4Y0.rst | 1 - .../2021-05-05-11-44-49.bpo-36515.uOSa3q.rst | 2 - .../2021-05-06-16-01-55.bpo-44059.GF5r6O.rst | 1 - .../2021-05-07-08-39-23.bpo-44061.MvElG6.rst | 2 - .../2021-05-09-03-26-31.bpo-44081.A-Mrto.rst | 2 - .../2021-05-09-22-52-34.bpo-44089.IoANsN.rst | 2 - .../2021-05-10-17-45-00.bpo-44098._MoxuZ.rst | 5 - .../2021-05-12-16-43-21.bpo-38908.nM2_rO.rst | 5 - .../2021-05-13-19-07-28.bpo-37788.adeFcf.rst | 1 - .../2021-05-13-19-44-38.bpo-44077.04b2a4.rst | 3 - .../2021-05-14-16-06-02.bpo-44095.v_pLwY.rst | 2 - .../2021-05-16-00-00-38.bpo-44145.ko5SJ7.rst | 3 - .../2021-05-16-02-24-23.bpo-44142.t-XU8k.rst | 2 - .../2021-05-16-11-57-38.bpo-44150.xAhhik.rst | 1 - .../2021-05-16-17-48-24.bpo-33433.MyzO71.rst | 1 - .../2021-05-17-07-24-24.bpo-44154.GRI5bf.rst | 1 - .../2021-05-17-21-05-06.bpo-4928.Ot2yjO.rst | 1 - .../2021-05-18-00-17-21.bpo-27334.32EJZi.rst | 2 - .../2021-05-21-12-12-35.bpo-43643.GWnmcF.rst | 1 - .../2021-05-21-21-23-43.bpo-44210.5afQ3K.rst | 1 - .../2021-05-25-23-26-38.bpo-43216.xTUyyX.rst | 6 - .../2021-05-26-13-15-51.bpo-44241.TBqej8.rst | 2 - .../2021-05-26-13-34-37.bpo-33693.3okzdo.rst | 1 - .../2021-05-26-14-50-06.bpo-38693.NkMacJ.rst | 1 - .../2021-05-26-22-04-40.bpo-44235.qFBYpp.rst | 1 - .../2021-05-28-09-43-33.bpo-44258.nh5F7R.rst | 1 - .../2021-05-29-01-05-43.bpo-44254.f06xDm.rst | 2 - .../2021-05-30-13-32-09.bpo-44260.ROEbVd.rst | 2 - .../2021-05-31-04-51-02.bpo-43858.r7LOu6.rst | 1 - .../2021-05-31-11-28-03.bpo-44246.nhmt-v.rst | 3 - .../2021-05-31-11-34-56.bpo-44246.yHAkF0.rst | 7 - .../2021-06-07-10-26-14.bpo-44242.MKeMCQ.rst | 2 - .../2021-06-08-17-47-38.bpo-44339.9JwMSc.rst | 3 - .../2021-06-09-08-32-39.bpo-44357.70Futb.rst | 1 - .../2021-06-09-10-08-32.bpo-35800.3hmkWw.rst | 2 - .../2021-06-10-07-26-12.bpo-44351.rvyf2v.rst | 2 - .../2021-06-10-08-35-38.bpo-44356.6oDFhO.rst | 1 - .../2021-06-10-15-06-47.bpo-44342.qqkGlj.rst | 1 - .../2021-06-10-20-07-32.bpo-44362.oVOMfd.rst | 2 - .../2021-06-10-21-53-46.bpo-34266.k3fxnm.rst | 1 - .../2021-06-12-10-08-14.bpo-44395.PcW6Sx.rst | 2 - .../2021-06-12-21-25-35.bpo-27827.TMWh1i.rst | 2 - .../2021-06-12-22-58-20.bpo-44389.WTRnoC.rst | 1 - .../2021-06-13-00-16-56.bpo-37880.5bTrkw.rst | 3 - .../2021-06-14-14-19-11.bpo-38291.ee4cSX.rst | 1 - .../2021-06-14-23-28-17.bpo-44422.BlWOgv.rst | 3 - .../2021-06-15-13-51-25.bpo-42972.UnyYo1.rst | 2 - .../2021-06-16-16-52-14.bpo-44434.SQS4Pg.rst | 4 - .../2021-06-17-15-01-51.bpo-44439.1S7QhT.rst | 3 - .../2021-06-17-22-39-34.bpo-44446.qwdRic.rst | 1 - .../2021-06-19-21-52-27.bpo-44464.U2oa-a.rst | 2 - .../2021-06-20-07-14-46.bpo-44458.myqCQ0.rst | 1 - .../2021-06-20-14-03-18.bpo-41546.lO1jXU.rst | 1 - .../2021-06-20-19-01-11.bpo-44404.McfrYB.rst | 1 - .../2021-06-21-10-46-58.bpo-44471.2QjXv_.rst | 5 - .../2021-06-21-12-43-04.bpo-44466.NSm6mv.rst | 2 - .../2021-06-22-08-43-04.bpo-44482.U9GznK.rst | 2 - .../2021-06-22-16-45-48.bpo-43977.bamAGF.rst | 3 - .../2021-06-23-01-33-01.bpo-44491.tiOlr5.rst | 3 - .../2021-06-23-19-02-00.bpo-44468.-klV5-.rst | 2 - .../2021-06-24-19-16-20.bpo-42892.qvRNhI.rst | 1 - .../2021-06-26-12-27-14.bpo-44516.BVyX_y.rst | 1 - .../2021-06-29-07-27-08.bpo-43625.ZlAxhp.rst | 2 - .../2021-06-29-21-17-17.bpo-44461.acqRnV.rst | 1 - .../2021-06-30-11-34-35.bpo-44539.nP0Xi4.rst | 1 - .../2021-06-30-13-29-49.bpo-34798.t7FCa0.rst | 1 - .../2021-07-02-18-17-56.bpo-44554.aBUmJo.rst | 1 - .../2021-07-04-11-33-34.bpo-41249.sHdwBE.rst | 2 - .../2021-07-04-21-16-53.bpo-44558.cm7Slv.rst | 2 - .../2021-07-05-18-13-25.bpo-44566.o51Bd1.rst | 1 - .../2021-07-08-12-22-54.bpo-44569.KZ02v9.rst | 3 - .../2021-07-09-07-14-37.bpo-41928.Q1jMrr.rst | 4 - .../2021-07-10-19-55-13.bpo-42799.ad4tq8.rst | 4 - .../2021-07-12-10-32-48.bpo-44594.eEa5zi.rst | 3 - .../2021-07-13-09-01-33.bpo-44608.R3IcM1.rst | 2 - .../2021-07-15-16-51-32.bpo-44648.2o49TB.rst | 3 - .../2021-07-16-08-57-27.bpo-44638.EwYKne.rst | 1 - .../2021-07-16-13-40-31.bpo-40897.aveAre.rst | 2 - .../2021-07-19-14-04-42.bpo-44524.Nbf2JC.rst | 2 - .../2021-07-19-18-45-00.bpo-44678.YMEAu0.rst | 1 - .../2021-07-19-22-43-15.bpo-44353.HF81_Q.rst | 2 - .../2021-07-20-00-11-47.bpo-44682.3m2qVV.rst | 2 - .../2021-07-20-18-34-16.bpo-44353.ATuYq4.rst | 2 - .../2021-07-20-19-35-49.bpo-44686.ucCGhu.rst | 1 - .../2021-07-20-21-51-35.bpo-42854.ThuDMI.rst | 3 - .../2021-07-20-22-03-24.bpo-44690.tV7Zjg.rst | 1 - .../2021-07-20-23-28-26.bpo-44688.buFgz3.rst | 2 - .../2021-07-21-10-43-22.bpo-44666.CEThkv.rst | 2 - .../2021-07-21-23-16-30.bpo-44704.iqHLxQ.rst | 1 - .../2021-07-24-02-17-59.bpo-44720.shU5Qm.rst | 1 - .../2021-07-25-08-17-55.bpo-42378.WIhUZK.rst | 4 - .../2021-07-27-12-06-19.bpo-44747.epUzZz.rst | 2 - .../2021-07-27-22-11-29.bpo-44752._bvbrZ.rst | 2 - .../2021-07-28-22-53-18.bpo-44771.BvLdnU.rst | 5 - .../2021-07-30-23-27-30.bpo-44667.tu0Xrv.rst | 4 - .../2021-07-31-08-45-31.bpo-44784.fIMIDS.rst | 2 - .../2021-07-31-20-28-20.bpo-44793.woaQSg.rst | 2 - .../2021-08-01-19-49-09.bpo-27275.QsvE0k.rst | 3 - .../2021-08-02-14-37-32.bpo-44806.wOW_Qn.rst | 2 - .../2021-08-03-20-37-45.bpo-44801.i49Aug.rst | 3 - .../2021-08-04-12-29-00.bpo-44822.zePNXA.rst | 3 - .../2021-08-05-14-59-39.bpo-44839.MURNL9.rst | 4 - .../2021-08-05-18-20-17.bpo-44524.9T1tfe.rst | 2 - .../2021-08-06-09-43-50.bpo-44605.q4YSBZ.rst | 1 - .../2021-08-06-13-00-28.bpo-44849.O78F_f.rst | 4 - .../2021-08-06-19-15-52.bpo-44581.oFDBTB.rst | 1 - .../2021-08-07-17-28-56.bpo-44859.CCopjk.rst | 8 - .../2021-08-07-22-51-32.bpo-44860.PTvRrU.rst | 2 - .../2021-08-09-13-17-10.bpo-38956.owWLNv.rst | 1 - .../2021-08-10-16-57-10.bpo-44524.dk9QX4.rst | 2 - .../2021-08-12-16-22-16.bpo-41322.utscTd.rst | 3 - .../2021-08-14-00-55-16.bpo-44911.uk3hYk.rst | 1 - .../2021-08-17-16-01-44.bpo-44935.roUl0G.rst | 2 - .../2021-08-18-10-36-14.bpo-39039.A63LYh.rst | 2 - .../2021-08-19-15-03-54.bpo-44955.1mxFQS.rst | 5 - .../2021-08-19-23-49-10.bpo-42255.ofe3ms.rst | 3 - .../2021-08-22-13-25-17.bpo-44019.BN8HDy.rst | 2 - .../2021-08-23-21-39-59.bpo-37596.ojRcwB.rst | 2 - .../2021-08-25-10-28-49.bpo-43613.WkYmI0.rst | 3 - .../2021-08-25-20-18-31.bpo-39218.BlO6jW.rst | 1 - .../2021-08-26-09-54-14.bpo-45010.Cn23bQ.rst | 2 - .../2021-08-26-16-25-48.bpo-45001.tn_dKp.rst | 2 - .../2021-08-27-19-01-23.bpo-45030.tAmBbY.rst | 1 - .../2021-08-27-23-40-51.bpo-43913.Uo1Gt5.rst | 8 - .../2021-08-28-13-00-12.bpo-45021.rReeaj.rst | 1 - .../2021-08-29-14-49-22.bpo-41620.WJ6PFL.rst | 3 - .../2021-08-30-13-55-09.bpo-31299.9QzjZs.rst | 1 - .../2021-09-01-15-27-00.bpo-45075.9xUpvt.rst | 5 - .../2021-09-02-00-18-32.bpo-40360.9nmMtB.rst | 3 - .../2021-09-02-00-47-14.bpo-45085.mMnaDv.rst | 10 - .../2021-09-02-12-42-25.bpo-45081.tOjJ1k.rst | 2 - .../2021-09-05-13-15-08.bpo-25894.zjbi2f.rst | 4 - .../2021-09-05-20-33-25.bpo-45034.62NLD5.rst | 2 - .../2021-09-05-21-37-28.bpo-30856.jj86y0.rst | 6 - .../2021-09-07-09-13-27.bpo-45124.Kw5AUs.rst | 5 - .../2021-09-07-14-27-39.bpo-45129.vXH0gw.rst | 6 - .../2021-09-07-16-33-51.bpo-45132.WI9zQY.rst | 5 - .../2021-09-08-01-19-31.bpo-20499.tSxx8Y.rst | 1 - .../2021-09-08-13-19-29.bpo-38371.y1kEfP.rst | 2 - .../2021-09-10-13-20-53.bpo-45162.2Jh-lq.rst | 6 - .../2021-09-10-21-35-53.bpo-45166.UHipXF.rst | 2 - .../2021-09-11-10-45-12.bpo-35474.tEY3SD.rst | 3 - .../2021-09-11-14-41-02.bpo-44987.Mt8DiX.rst | 2 - .../2021-09-11-17-46-20.bpo-45173.UptGAn.rst | 7 - .../2021-09-11-18-44-40.bpo-21302.QxHRpR.rst | 2 - .../2021-09-13-14-28-49.bpo-45168.Z1mfW4.rst | 1 - .../2021-09-13-14-59-01.bpo-20524.PMQ1Fh.rst | 3 - .../2021-09-13-19-32-58.bpo-42135.1ZAHqR.rst | 3 - .../2021-09-16-19-02-14.bpo-45225.xmKV4i.rst | 1 - .../2021-09-17-09-59-33.bpo-45228.WV1dcT.rst | 1 - .../2021-09-17-11-20-55.bpo-45234.qUcTVt.rst | 3 - .../2021-09-17-15-58-53.bpo-45183.Vv_vch.rst | 3 - .../2021-09-17-16-55-37.bpo-45235.sXnmPA.rst | 2 - .../2021-09-18-13-14-57.bpo-36674.a2k5Zb.rst | 2 - .../2021-09-18-16-56-33.bpo-45238.Hng_9V.rst | 2 - .../2021-09-20-22-46-40.bpo-21302.h56430.rst | 4 - .../2021-09-22-23-56-15.bpo-21302.vvQ3Su.rst | 1 - .../2021-09-23-22-17-26.bpo-45274.gPpa4E.rst | 5 - ...2021-09-24-17-20-23.bpo-1596321.3nhPUk.rst | 3 - .../2021-09-30-23-00-18.bpo-41710.svuloZ.rst | 5 - .../2021-10-01-13-09-53.bpo-45329.9iMYaO.rst | 2 - .../2021-10-05-11-03-48.bpo-45371.NOwcDJ.rst | 3 - .../2021-05-05-17-37-04.bpo-44022.bS3XJ9.rst | 2 - .../2021-05-08-11-50-46.bpo-43124.2CTM6M.rst | 2 - .../2021-06-29-02-45-53.bpo-44394.A220N1.rst | 3 - .../2021-06-29-23-40-22.bpo-41180.uTWHv_.rst | 5 - .../2021-07-25-20-04-54.bpo-44600.0WMldg.rst | 1 - .../2021-08-29-12-39-44.bpo-42278.jvmQz_.rst | 2 - .../2019-09-25-18-10-10.bpo-30256.A5i76Q.rst | 2 - .../2020-10-25-19-20-26.bpo-35753.2LT-hO.rst | 2 - .../2021-05-04-18-10-57.bpo-42083.EMS2TK.rst | 2 - .../2021-05-07-15-46-04.bpo-31904.8dk3la.rst | 1 - .../2021-05-14-14-13-44.bpo-44131.YPizoC.rst | 2 - .../2021-06-02-17-41-42.bpo-43921.xP7yZ4.rst | 2 - .../2021-06-03-03-29-34.bpo-43921.nwH1FS.rst | 3 - .../2021-06-09-15-32-05.bpo-44364.zu9Zee.rst | 1 - .../2021-06-10-11-19-43.bpo-44363.-K9jD0.rst | 2 - .../2021-06-18-15-19-35.bpo-44451.aj5pqE.rst | 3 - .../2021-06-21-17-53-41.bpo-44287.YON57s.rst | 4 - .../2021-06-26-18-37-36.bpo-44515.e9fO6f.rst | 2 - .../2021-07-16-14-02-33.bpo-44647.5LzqIy.rst | 4 - .../2021-07-17-11-41-20.bpo-42095.kCB7oj.rst | 2 - .../2021-07-22-16-38-39.bpo-44708.SYNaac.rst | 2 - .../2021-07-24-20-09-15.bpo-44734.KKsNOV.rst | 1 - .../2021-08-06-00-07-15.bpo-40928.aIwb6G.rst | 2 - .../2021-08-06-18-36-04.bpo-44852.sUL8YX.rst | 2 - .../2021-08-13-12-11-06.bpo-44891.T9_mBT.rst | 2 - .../2021-08-18-18-30-12.bpo-44949.VE5ENv.rst | 2 - .../2021-08-26-14-20-44.bpo-45011.mQZdXU.rst | 3 - .../2021-08-27-22-37-19.bpo-25130.ig4oJe.rst | 1 - .../2021-08-30-11-54-14.bpo-45042.QMz3X8.rst | 1 - .../2021-09-01-17-17-44.bpo-44895.kV7H77.rst | 5 - .../2021-09-06-19-00-29.bpo-45052.yrOK3J.rst | 7 - .../2021-09-08-13-01-37.bpo-44860.qXd0kx.rst | 2 - .../2021-09-11-22-08-18.bpo-45125.FVSzs2.rst | 2 - .../2021-09-13-00-28-17.bpo-45156.8oomV3.rst | 2 - .../2021-09-14-13-16-18.bpo-45195.EyQR1G.rst | 3 - .../2021-09-14-14-54-04.bpo-45185.qFx5I6.rst | 1 - .../2021-09-15-23-32-39.bpo-45209.55ntL5.rst | 2 - .../2021-09-16-17-22-35.bpo-45128.Jz6fl2.rst | 2 - .../2021-09-24-10-41-49.bpo-45269.8jKEr8.rst | 1 - .../2021-09-25-11-05-31.bpo-45280.3MA6lC.rst | 1 - .../2021-09-30-16-54-39.bpo-40173.J_slCw.rst | 2 - .../2020-02-25-18-22-09.bpo-20291.AyrDiZ.rst | 1 - .../2021-05-08-13-57-00.bpo-44074.F09kCK.rst | 1 - .../2021-07-01-22-21-25.bpo-43425.t65len.rst | 3 - .../2021-08-22-11-45-31.bpo-44978.QupKV3.rst | 1 - .../2021-08-26-11-57-31.bpo-44967.UT1RMV.rst | 1 - .../2021-09-14-11-44-26.bpo-44786.DU0LC0.rst | 1 - .../2020-04-13-15-20-28.bpo-40263.1KKEbu.rst | 3 - .../2021-01-01-21-21-03.bpo-42686.G_f-TC.rst | 1 - .../2021-06-06-16-36-13.bpo-41299.Rg-vb_.rst | 1 - .../2021-07-07-21-07-18.bpo-44582.4Mm6Hh.rst | 2 - .../2021-07-13-15-32-49.bpo-44572.gXvhDc.rst | 1 - .../2021-08-06-10-11-07.bpo-44848.ib3Jcz.rst | 1 - .../2021-08-27-23-50-02.bpo-45007.NIBlVG.rst | 1 - .../2021-09-03-18-05-21.bpo-45022.bgpD_r.rst | 1 - .../2021-10-05-12-41-53.bpo-45375.CohPP-.rst | 2 - .../2021-03-29-21-11-23.bpo-34932.f3Hdyd.rst | 1 - .../2021-05-24-21-15-41.bpo-43109.npKJ9c.rst | 2 - .../2021-07-12-15-42-02.bpo-41972.yUjE8j.rst | 2 - .../2021-07-20-22-27-01.bpo-44689.mmT_xH.rst | 5 - .../2021-08-06-10-08-41.bpo-44848.0uYXsE.rst | 1 - .../2021-08-27-16-55-10.bpo-34602.ZjHsYJ.rst | 3 - .../2021-08-30-00-04-10.bpo-45007.pixqUB.rst | 1 - README.rst | 2 +- 483 files changed, 5665 insertions(+), 1497 deletions(-) create mode 100644 Misc/NEWS.d/3.11.0a1.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-05-24-03-31-17.bpo-41282.L8nP44.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-06-10-18-08-44.bpo-44381.Xpc1iX.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-06-19-11-50-03.bpo-43298.9ircMb.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-06-30-02-32-46.bpo-44535.M9iN4-.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-07-19-01-09-56.bpo-44340.JNeOf4.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-08-26-13-10-46.bpo-45019.e0mo49.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-09-09-16-45-26.bpo-45067.mFmY92.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-09-11-06-05-23.bpo-45163.q7xT93.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-09-14-00-47-57.bpo-45188.MNbo_T.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-09-14-10-07-23.bpo-45020._VGGPv.rst delete mode 100644 Misc/NEWS.d/next/Build/2021-09-16-18-00-43.bpo-45220.TgbkvW.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-12-23-01-28-50.bpo-42035.S9eUm0.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-05-04-17-43-39.bpo-44029.ayX4PR.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-05-05-19-04-50.bpo-43795.9Ojj73.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-05-10-14-34-22.bpo-44094.HayXZO.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-05-12-12-24-45.bpo-44113.DcgOqE.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-05-19-15-09-47.bpo-43795.WAHRxt.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-05-31-11-31-13.bpo-44263.8mIOfV.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-06-03-00-59-48.bpo-39573.-elHTJ.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-06-10-15-22-31.bpo-44378.jGYakF.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-06-15-16-28-18.bpo-43795.fy0AXK.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-06-22-17-00-06.bpo-40939.CGB0I5.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-06-23-10-31-45.bpo-39947.je_HMo.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-06-23-12-12-04.bpo-44441.3p14JB.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-06-28-23-44-47.bpo-44530.qij7YC.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-07-20-16-21-06.bpo-42747.rRxjUY.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-07-27-17-29-12.bpo-44751.4qmbDG.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-07-29-16-04-28.bpo-41103.hiKKcF.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-08-02-20-49-36.bpo-42035.HTBcZt.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-08-31-15-21-36.bpo-45061.ZH0HVe.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-09-03-15-53-43.bpo-45094.tinXwL.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-09-16-18-05-20.bpo-45116.WxXewl.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-09-19-17-18-25.bpo-44687.3fqDRC.rst delete mode 100644 Misc/NEWS.d/next/C API/2021-09-30-03-14-35.bpo-41710.DDWJKx.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-05-11-12-44-03.bpo-33346.ZgBkvB.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-12-21-14-18-32.bpo-39091.dOexgQ.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-02-13-21-14.bpo-11105.wceryW.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-01-13-19-34-41.bpo-28146.AZBBkH.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-03-22-17-50-30.bpo-17792._zssjS.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-04-02-15-02-16.bpo-43693.l3Ureu.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-04-17-16-08-00.bpo-43879.zkyJgh.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-04-18-18-07-33.bpo-43833.oChkCi.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-04-23-03-46-45.bpo-43918.nNDY3S.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-04-30-15-48-36.bpo-40222.j3VxeX.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-04-01-01-04.bpo-43822.9VeCg0.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-08-17-18-37.bpo-43149.Kp5FxD.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-08-19-54-57.bpo-28307.7ysaVW.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-10-18-49-13.bpo-26110.EQzqqA.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-11-21-52-44.bpo-44110.VqbAsB.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-12-14-26-16.bpo-44114.p-WfAE.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-14-20-03-32.bpo-44032.OzT1ob.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-15-17-30-57.bpo-44143.7UTS6H.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-17-20-44-45.bpo-44156.8KSp9l.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-18-11-27-02.bpo-44168.mgB-rt.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-19-20-33-36.bpo-44180.mQVaAs.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-20-12-43-04.bpo-44187.3lk0L1.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-21-01-42-45.bpo-44184.9qOptC.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-21-20-53-49.bpo-43693.-NN3J_.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-21-21-16-03.bpo-44201.bGaSjt.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-25-18-20-10.bpo-44232.DMcCCf.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-26-19-10-47.bpo-43693.1KSG9u.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-27-17-34-29.bpo-43667.ND9jP3.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-05-30-16-37-47.bpo-43413.vYFPPC.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-03-22-51-50.bpo-44305.66dVDG.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-05-02-34-57.bpo-44304._MAoPc.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-06-00-29-14.bpo-44317.xPPhcZ.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-07-15-13-44.bpo-43693.c_zDeY.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-08-01-13-47.bpo-44335.GQTTkl.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-08-10-22-46.bpo-44337.RTjmIt.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-08-22-49-06.bpo-44349.xgEgeA.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-09-22-56-59.bpo-44368.vgT0Cx.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-10-10-06-18.bpo-44338.c4Myr4.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-10-16-10-39.bpo-44313.34RjI8.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-11-17-37-15.bpo-44376.zhM1UW.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-11-18-17-42.bpo-44396.Z9EKim.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-13-23-12-18.bpo-44409.eW4LS-.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-18-22-08-25.bpo-44456.L0Rhko.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-19-12-41-13.bpo-44297.F53vHj.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-20-10-53-21.bpo-12022.SW240M.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-21-11-19-54.bpo-44472.Vvm1yn.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-22-10-55-23.bpo-44486.wct-9X.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-22-19-08-19.bpo-44483.eq2f7T.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-06-29-11-49-29.bpo-44523.67-ZIP.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-01-11-59-34.bpo-44490.xY80VR.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-02-22-54-41.bpo-44553.l9YqGg.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-03-00-20-39.bpo-43908.YHuV_s.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-04-17-41-47.bpo-41486.DiM24a.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-04-23-38-51.bpo-44562.QdeRQo.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-06-15-27-11.bpo-43950.LhL2-q.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-06-22-22-15.bpo-44490.BJxPbZ.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-07-16-05-35.bpo-43895.JFjR0-.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-08-12-18-56.bpo-44584.qKnSqV.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-09-12-08-17.bpo-44590.a2ntVX.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-12-04-06-57.bpo-41972.nDX5k_.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-13-17-47-32.bpo-42073.9wopiC.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-13-20-22-12.bpo-44606.S3Bv2w.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-13-23-19-41.bpo-44589.59OH8T.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-14-10-31-10.bpo-26280.cgpM4B.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-14-13-54-07.bpo-44635.7ZMAdB.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-16-01-01-11.bpo-44611.LcfHN-.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-16-09-36-12.bpo-44636.ZWebi8.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-16-09-59-13.bpo-44646.Yb6s05.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-16-20-25-37.bpo-44655.I3wRjL.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-16-21-35-14.bpo-44655.95I7M6.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-17-13-41-58.bpo-44662.q22kWR.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-17-14-20-59.bpo-44661.BQbXiH.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-17-21-04-04.bpo-44633.5-zKeI.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-19-19-53-46.bpo-44676.WgIMvh.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-19-20-49-06.bpo-44653.WcqGyI.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-21-15-26-56.bpo-44698.DA4_0o.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-23-01-52-13.bpo-44717.-vVmAh.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-23-15-17-01.bpo-44725.qcuKaa.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-26-15-27-03.bpo-44732.IxObt3.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-27-11-14-22.bpo-34013.SjLFe-.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-07-31-12-12-57.bpo-44792.mOReTW.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-04-11-37-38.bpo-44821.67YHGI.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-05-17-42-03.bpo-44838.r_Lkj_.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-05-17-49-55.bpo-44826.zQsyK5.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-07-01-26-12.bpo-44856.9rk3li.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-07-21-39-19.bpo-25782.B22lMx.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-09-14-29-52.bpo-33930.--5LQ-.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-09-16-16-03.bpo-44872.OKRlhK.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-09-19-05-20.bpo-44874.oOcfU4.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-11-12-03-52.bpo-44878.nEhjLi.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-11-14-12-41.bpo-44878.pAbBfc.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-11-15-39-57.bpo-44885.i4noUO.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-11-16-46-27.bpo-44890.PwNg8N.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-11-20-45-02.bpo-44889.2T3nTn.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-12-14-00-57.bpo-44900.w2gpwy.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-14-20-13-21.bpo-44895.Ic9m90.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-15-10-39-06.bpo-44698.lITKNc.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-16-11-36-02.bpo-44914.6Lgrx3.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-16-23-16-17.bpo-44929.qpMEky.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-18-11-14-38.bpo-44945.CO3s77.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-18-19-09-28.bpo-44947.mcvGdS.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-19-14-43-24.bpo-44954.dLn3lg.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-22-12-28-50.bpo-24234.n3oTdx.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-23-10-36-55.bpo-24234.MGVUQi.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-23-19-55-08.bpo-44962.J00ftt.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-25-23-07-10.bpo-44963.5EET8y.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-25-23-17-32.bpo-45000.XjmyLl.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-26-18-44-03.bpo-45018.pu8H9L.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-31-11-09-52.bpo-45012.ueeOcx.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-31-17-44-51.bpo-45020.ZPI_3L.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-01-16-55-43.bpo-45056.7AK2d9.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-01-19-21-48.bpo-34561.uMAVA-.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-01-23-55-49.bpo-45083.cLi9G3.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-02-01-28-01.bpo-37330.QDjM_l.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-03-12-35-17.bpo-41031.yPSJEs.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-03-16-18-10.bpo-1514420.2Lumpj.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-06-21-52-45.bpo-45123.8Eh9iI.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-07-00-21-04.bpo-44348.f8w_Td.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-07-17-10-16.bpo-45121.iG-Hsf.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-08-08-29-41.bpo-44959.OSwwPf.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-09-10-32-33.bpo-44219.WiYyjz.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-09-15-05-17.bpo-45155.JRw9TG.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-14-09-23-59.bpo-45167.CPSSoV.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-14-10-02-12.bpo-45190.ZFRgSj.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-20-10-02-12.bpo-24076.ZFgFSj.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-21-22-27-25.bpo-45061.5IOUf0.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-10-04-16-11-50.bpo-43760.R9QoUv.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2018-05-19-15-59-29.bpo-33479.4cLlxo.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-01-30-05-18-48.bpo-39498.Nu3sFL.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-03-21-01-19-28.bpo-21760.CqofIc.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-08-21-22-59-37.bpo-41576.7a6CQR.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-08-24-13-35-04.bpo-41621.nqaw9G.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-09-03-13-37-19.bpo-41706._zXWOR.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-05-03-22-08-08.bpo-44025.gcB7iP.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-05-07-12-27-09.bpo-43558.UGhA8R.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-05-08-09-48-05.bpo-44072.fb2x5I.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-05-17-20-03-47.bpo-41963.eUz9_o.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-05-23-09-11-28.bpo-44195.1bqkOs.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-05-26-11-16-33.bpo-42392.oxRx6E.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-06-06-14-12-00.bpo-44322.K0PHfE.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-06-14-09-20-37.bpo-38291.VMYa_Q.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-06-16-18-09-49.bpo-44392.6RF1Sc.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-06-18-06-44-45.bpo-44453.3PIkj2.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-06-18-18-04-53.bpo-27752.NEByNk.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-06-21-15-46-32.bpo-13814.LDcslu.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-06-23-15-21-36.bpo-39452.o_I-6d.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-06-24-14-37-16.bpo-43066.Ti7ahX.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-06-26-17-41-06.bpo-40620.PAYDrB.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-06-28-12-13-48.bpo-38062.9Ehp9O.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-07-02-14-02-29.bpo-44544._5_aCz.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-07-03-18-25-17.bpo-44558.0pTknl.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-07-12-11-39-20.bpo-44613.DIXNzc.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-07-13-22-25-13.bpo-44631.qkGwe4.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-07-15-11-19-03.bpo-42958.gC5IHM.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-07-18-22-26-02.bpo-44651.SjT9iY.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-07-18-22-43-14.bpo-44561.T7HpWm.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-07-20-21-03-18.bpo-30511.eMFkRi.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-07-22-08-28-03.bpo-35183.p9BWTB.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-07-25-23-04-15.bpo-44693.JuCbNq.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-07-26-23-48-31.bpo-44740.zMFGMV.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-08-09-19-58-45.bpo-36700.WPNW5f.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-08-11-18-02-06.bpo-33479.rCe4c5.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-08-13-19-08-03.bpo-44903.aJuvQF.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-08-13-20-17-59.bpo-16580.MZ_iK9.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-08-19-15-53-08.bpo-44957.imqrh3.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-09-08-17-20-19.bpo-45024.dkNPNi.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2021-09-18-13-45-19.bpo-45216.o56nyt.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2021-05-05-09-45-24.bpo-44026.m2Z0zR.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2021-05-09-09-02-09.bpo-44010.TaLe9x.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2021-05-27-13-39-43.bpo-41611.liNQqj.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2021-05-27-18-22-46.bpo-41611.jOKpfc.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2021-06-08-03-04-51.bpo-40468.tUCGUb.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2021-06-10-00-50-02.bpo-33962.ikAUNg.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2021-06-11-17-43-39.bpo-40128.7vDN3U.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2021-09-15-03-20-06.bpo-45193.G61_GV.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2021-09-27-01-21-59.bpo-45296.9H8rdY.rst delete mode 100644 Misc/NEWS.d/next/Library/2017-09-20-14-43-03.bpo-29298._78CSN.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-04-24-14-25-07.bpo-33349.Y_0LIr.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-02-26-09-31-59.bpo-26228.wyrHKc.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-05-08-15-14-32.bpo-16379.rN5JVe.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-06-03-23-53-25.bpo-27513.qITN7d.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-09-25-13-54-41.bpo-30256.wBkzox.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-10-08-14-08-59.bpo-38415.N1bUw6.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-11-12-18-59-33.bpo-38741.W7IYkq.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-16-13-54-28.bpo-39359.hzTu0h.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-16-23-41-16.bpo-38840.VzzYZz.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-25-12-58-20.bpo-37022.FUZI25.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-02-03-21-18-31.bpo-39549.l4a8uH.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-04-24-20-39-38.bpo-34990.3SmL9M.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-21-01-42-32.bpo-40563.fDn5bP.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-25-23-58-29.bpo-5846.O9BIfm.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-05-30-10-48-04.bpo-24391.ZCTnhX.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-01-17-42-41.bpo-41137.AnqbP-.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-13-23-46-59.bpo-32695.tTqqXe.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-26-18-17-30.bpo-41402.YRkVkp.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-07-30-14-37-15.bpo-20684.qV35GU.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-10-07-23-24.bpo-41730.DyKFi9.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-01-21-46-34.bpo-40956._tvsZ7.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-11-20-23-48.bpo-37449.f-t3V6.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-10-18-09-42-53.bpo-40497.CRz2sG.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-12-08-01-08-58.bpo-41818.zO8vV7.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-13-00-02-44.bpo-42862.Z6ACLN.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-16-18-36-00.bpo-33809.BiMK6V.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-25-21-24-55.bpo-43024.vAUrIi.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-01-31-18-24-54.bpo-43086.2_P-SH.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-02-02-20-11-14.bpo-42971.OpVoFu.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-02-04-23-16-03.bpo-30077.v6TqAi.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-02-15-21-17-46.bpo-43232.awc4yZ.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-02-15-22-14-31.bpo-43234.F-vKAT.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-02-25-08-32-06.bpo-43318.bZJw6V.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-03-03-13-32-37.bpo-43392.QQumou.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-03-24-09-40-02.bpo-43612.vMGZ4y.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-03-29-00-23-30.bpo-43650.v01tic.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-03-30-08-39-08.bpo-43666.m72tlH.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-04-15-12-02-17.bpo-43853.XXCVAp.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-04-29-00-48-00.bpo-28528.JLAVWj.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-04-30-16-58-24.bpo-43972.Y2r9lg.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-01-15-43-37.bpo-44002.KLT_wd.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-02-13-54-25.bpo-38352.N9MlhV.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-03-10-07-43.bpo-44018.VDyW8f.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-03-19-59-14.bpo-40465.1tB4Y0.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-05-11-44-49.bpo-36515.uOSa3q.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-06-16-01-55.bpo-44059.GF5r6O.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-07-08-39-23.bpo-44061.MvElG6.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-09-03-26-31.bpo-44081.A-Mrto.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-09-22-52-34.bpo-44089.IoANsN.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-10-17-45-00.bpo-44098._MoxuZ.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-12-16-43-21.bpo-38908.nM2_rO.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-13-19-07-28.bpo-37788.adeFcf.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-13-19-44-38.bpo-44077.04b2a4.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-14-16-06-02.bpo-44095.v_pLwY.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-16-00-00-38.bpo-44145.ko5SJ7.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-16-02-24-23.bpo-44142.t-XU8k.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-16-11-57-38.bpo-44150.xAhhik.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-16-17-48-24.bpo-33433.MyzO71.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-17-07-24-24.bpo-44154.GRI5bf.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-17-21-05-06.bpo-4928.Ot2yjO.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-18-00-17-21.bpo-27334.32EJZi.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-21-12-12-35.bpo-43643.GWnmcF.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-21-21-23-43.bpo-44210.5afQ3K.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-25-23-26-38.bpo-43216.xTUyyX.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-26-13-15-51.bpo-44241.TBqej8.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-26-13-34-37.bpo-33693.3okzdo.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-26-14-50-06.bpo-38693.NkMacJ.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-26-22-04-40.bpo-44235.qFBYpp.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-28-09-43-33.bpo-44258.nh5F7R.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-29-01-05-43.bpo-44254.f06xDm.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-30-13-32-09.bpo-44260.ROEbVd.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-31-04-51-02.bpo-43858.r7LOu6.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-31-11-28-03.bpo-44246.nhmt-v.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-05-31-11-34-56.bpo-44246.yHAkF0.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-07-10-26-14.bpo-44242.MKeMCQ.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-08-17-47-38.bpo-44339.9JwMSc.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-09-08-32-39.bpo-44357.70Futb.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-09-10-08-32.bpo-35800.3hmkWw.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-10-07-26-12.bpo-44351.rvyf2v.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-10-08-35-38.bpo-44356.6oDFhO.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-10-15-06-47.bpo-44342.qqkGlj.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-10-20-07-32.bpo-44362.oVOMfd.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-10-21-53-46.bpo-34266.k3fxnm.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-12-10-08-14.bpo-44395.PcW6Sx.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-12-21-25-35.bpo-27827.TMWh1i.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-12-22-58-20.bpo-44389.WTRnoC.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-13-00-16-56.bpo-37880.5bTrkw.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-14-14-19-11.bpo-38291.ee4cSX.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-14-23-28-17.bpo-44422.BlWOgv.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-15-13-51-25.bpo-42972.UnyYo1.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-16-16-52-14.bpo-44434.SQS4Pg.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-17-15-01-51.bpo-44439.1S7QhT.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-17-22-39-34.bpo-44446.qwdRic.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-19-21-52-27.bpo-44464.U2oa-a.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-20-07-14-46.bpo-44458.myqCQ0.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-20-14-03-18.bpo-41546.lO1jXU.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-20-19-01-11.bpo-44404.McfrYB.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-21-10-46-58.bpo-44471.2QjXv_.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-21-12-43-04.bpo-44466.NSm6mv.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-22-08-43-04.bpo-44482.U9GznK.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-22-16-45-48.bpo-43977.bamAGF.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-23-01-33-01.bpo-44491.tiOlr5.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-23-19-02-00.bpo-44468.-klV5-.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-24-19-16-20.bpo-42892.qvRNhI.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-26-12-27-14.bpo-44516.BVyX_y.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-29-07-27-08.bpo-43625.ZlAxhp.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-29-21-17-17.bpo-44461.acqRnV.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-30-11-34-35.bpo-44539.nP0Xi4.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-06-30-13-29-49.bpo-34798.t7FCa0.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-02-18-17-56.bpo-44554.aBUmJo.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-04-11-33-34.bpo-41249.sHdwBE.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-04-21-16-53.bpo-44558.cm7Slv.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-05-18-13-25.bpo-44566.o51Bd1.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-08-12-22-54.bpo-44569.KZ02v9.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-09-07-14-37.bpo-41928.Q1jMrr.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-10-19-55-13.bpo-42799.ad4tq8.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-12-10-32-48.bpo-44594.eEa5zi.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-13-09-01-33.bpo-44608.R3IcM1.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-15-16-51-32.bpo-44648.2o49TB.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-16-08-57-27.bpo-44638.EwYKne.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-16-13-40-31.bpo-40897.aveAre.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-19-14-04-42.bpo-44524.Nbf2JC.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-19-18-45-00.bpo-44678.YMEAu0.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-19-22-43-15.bpo-44353.HF81_Q.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-20-00-11-47.bpo-44682.3m2qVV.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-20-18-34-16.bpo-44353.ATuYq4.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-20-19-35-49.bpo-44686.ucCGhu.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-20-21-51-35.bpo-42854.ThuDMI.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-20-22-03-24.bpo-44690.tV7Zjg.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-20-23-28-26.bpo-44688.buFgz3.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-21-10-43-22.bpo-44666.CEThkv.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-21-23-16-30.bpo-44704.iqHLxQ.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-24-02-17-59.bpo-44720.shU5Qm.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-25-08-17-55.bpo-42378.WIhUZK.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-27-12-06-19.bpo-44747.epUzZz.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-27-22-11-29.bpo-44752._bvbrZ.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-28-22-53-18.bpo-44771.BvLdnU.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-30-23-27-30.bpo-44667.tu0Xrv.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-31-08-45-31.bpo-44784.fIMIDS.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-07-31-20-28-20.bpo-44793.woaQSg.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-01-19-49-09.bpo-27275.QsvE0k.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-02-14-37-32.bpo-44806.wOW_Qn.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-03-20-37-45.bpo-44801.i49Aug.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-04-12-29-00.bpo-44822.zePNXA.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-05-14-59-39.bpo-44839.MURNL9.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-05-18-20-17.bpo-44524.9T1tfe.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-06-09-43-50.bpo-44605.q4YSBZ.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-06-13-00-28.bpo-44849.O78F_f.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-06-19-15-52.bpo-44581.oFDBTB.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-07-17-28-56.bpo-44859.CCopjk.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-07-22-51-32.bpo-44860.PTvRrU.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-09-13-17-10.bpo-38956.owWLNv.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-10-16-57-10.bpo-44524.dk9QX4.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-12-16-22-16.bpo-41322.utscTd.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-14-00-55-16.bpo-44911.uk3hYk.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-17-16-01-44.bpo-44935.roUl0G.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-18-10-36-14.bpo-39039.A63LYh.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-19-15-03-54.bpo-44955.1mxFQS.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-19-23-49-10.bpo-42255.ofe3ms.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-22-13-25-17.bpo-44019.BN8HDy.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-23-21-39-59.bpo-37596.ojRcwB.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-25-10-28-49.bpo-43613.WkYmI0.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-25-20-18-31.bpo-39218.BlO6jW.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-26-09-54-14.bpo-45010.Cn23bQ.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-26-16-25-48.bpo-45001.tn_dKp.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-27-19-01-23.bpo-45030.tAmBbY.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-27-23-40-51.bpo-43913.Uo1Gt5.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-28-13-00-12.bpo-45021.rReeaj.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-29-14-49-22.bpo-41620.WJ6PFL.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-08-30-13-55-09.bpo-31299.9QzjZs.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-01-15-27-00.bpo-45075.9xUpvt.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-02-00-18-32.bpo-40360.9nmMtB.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-02-00-47-14.bpo-45085.mMnaDv.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-02-12-42-25.bpo-45081.tOjJ1k.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-05-13-15-08.bpo-25894.zjbi2f.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-05-20-33-25.bpo-45034.62NLD5.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-05-21-37-28.bpo-30856.jj86y0.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-07-09-13-27.bpo-45124.Kw5AUs.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-07-14-27-39.bpo-45129.vXH0gw.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-07-16-33-51.bpo-45132.WI9zQY.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-08-01-19-31.bpo-20499.tSxx8Y.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-08-13-19-29.bpo-38371.y1kEfP.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-10-13-20-53.bpo-45162.2Jh-lq.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-10-21-35-53.bpo-45166.UHipXF.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-11-10-45-12.bpo-35474.tEY3SD.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-11-14-41-02.bpo-44987.Mt8DiX.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-11-17-46-20.bpo-45173.UptGAn.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-11-18-44-40.bpo-21302.QxHRpR.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-13-14-28-49.bpo-45168.Z1mfW4.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-13-14-59-01.bpo-20524.PMQ1Fh.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-13-19-32-58.bpo-42135.1ZAHqR.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-16-19-02-14.bpo-45225.xmKV4i.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-17-09-59-33.bpo-45228.WV1dcT.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-17-11-20-55.bpo-45234.qUcTVt.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-17-15-58-53.bpo-45183.Vv_vch.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-17-16-55-37.bpo-45235.sXnmPA.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-18-13-14-57.bpo-36674.a2k5Zb.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-18-16-56-33.bpo-45238.Hng_9V.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-20-22-46-40.bpo-21302.h56430.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-22-23-56-15.bpo-21302.vvQ3Su.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-23-22-17-26.bpo-45274.gPpa4E.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-24-17-20-23.bpo-1596321.3nhPUk.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-09-30-23-00-18.bpo-41710.svuloZ.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-10-01-13-09-53.bpo-45329.9iMYaO.rst delete mode 100644 Misc/NEWS.d/next/Library/2021-10-05-11-03-48.bpo-45371.NOwcDJ.rst delete mode 100644 Misc/NEWS.d/next/Security/2021-05-05-17-37-04.bpo-44022.bS3XJ9.rst delete mode 100644 Misc/NEWS.d/next/Security/2021-05-08-11-50-46.bpo-43124.2CTM6M.rst delete mode 100644 Misc/NEWS.d/next/Security/2021-06-29-02-45-53.bpo-44394.A220N1.rst delete mode 100644 Misc/NEWS.d/next/Security/2021-06-29-23-40-22.bpo-41180.uTWHv_.rst delete mode 100644 Misc/NEWS.d/next/Security/2021-07-25-20-04-54.bpo-44600.0WMldg.rst delete mode 100644 Misc/NEWS.d/next/Security/2021-08-29-12-39-44.bpo-42278.jvmQz_.rst delete mode 100644 Misc/NEWS.d/next/Tests/2019-09-25-18-10-10.bpo-30256.A5i76Q.rst delete mode 100644 Misc/NEWS.d/next/Tests/2020-10-25-19-20-26.bpo-35753.2LT-hO.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-05-04-18-10-57.bpo-42083.EMS2TK.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-05-07-15-46-04.bpo-31904.8dk3la.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-05-14-14-13-44.bpo-44131.YPizoC.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-06-02-17-41-42.bpo-43921.xP7yZ4.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-06-03-03-29-34.bpo-43921.nwH1FS.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-06-09-15-32-05.bpo-44364.zu9Zee.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-06-10-11-19-43.bpo-44363.-K9jD0.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-06-18-15-19-35.bpo-44451.aj5pqE.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-06-21-17-53-41.bpo-44287.YON57s.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-06-26-18-37-36.bpo-44515.e9fO6f.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-07-16-14-02-33.bpo-44647.5LzqIy.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-07-17-11-41-20.bpo-42095.kCB7oj.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-07-22-16-38-39.bpo-44708.SYNaac.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-07-24-20-09-15.bpo-44734.KKsNOV.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-08-06-00-07-15.bpo-40928.aIwb6G.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-08-06-18-36-04.bpo-44852.sUL8YX.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-08-13-12-11-06.bpo-44891.T9_mBT.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-08-18-18-30-12.bpo-44949.VE5ENv.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-08-26-14-20-44.bpo-45011.mQZdXU.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-08-27-22-37-19.bpo-25130.ig4oJe.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-08-30-11-54-14.bpo-45042.QMz3X8.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-09-01-17-17-44.bpo-44895.kV7H77.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-09-06-19-00-29.bpo-45052.yrOK3J.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-09-08-13-01-37.bpo-44860.qXd0kx.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-09-11-22-08-18.bpo-45125.FVSzs2.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-09-13-00-28-17.bpo-45156.8oomV3.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-09-14-13-16-18.bpo-45195.EyQR1G.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-09-14-14-54-04.bpo-45185.qFx5I6.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-09-15-23-32-39.bpo-45209.55ntL5.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-09-16-17-22-35.bpo-45128.Jz6fl2.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-09-24-10-41-49.bpo-45269.8jKEr8.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-09-25-11-05-31.bpo-45280.3MA6lC.rst delete mode 100644 Misc/NEWS.d/next/Tests/2021-09-30-16-54-39.bpo-40173.J_slCw.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2020-02-25-18-22-09.bpo-20291.AyrDiZ.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2021-05-08-13-57-00.bpo-44074.F09kCK.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2021-07-01-22-21-25.bpo-43425.t65len.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2021-08-22-11-45-31.bpo-44978.QupKV3.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2021-08-26-11-57-31.bpo-44967.UT1RMV.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2021-09-14-11-44-26.bpo-44786.DU0LC0.rst delete mode 100644 Misc/NEWS.d/next/Windows/2020-04-13-15-20-28.bpo-40263.1KKEbu.rst delete mode 100644 Misc/NEWS.d/next/Windows/2021-01-01-21-21-03.bpo-42686.G_f-TC.rst delete mode 100644 Misc/NEWS.d/next/Windows/2021-06-06-16-36-13.bpo-41299.Rg-vb_.rst delete mode 100644 Misc/NEWS.d/next/Windows/2021-07-07-21-07-18.bpo-44582.4Mm6Hh.rst delete mode 100644 Misc/NEWS.d/next/Windows/2021-07-13-15-32-49.bpo-44572.gXvhDc.rst delete mode 100644 Misc/NEWS.d/next/Windows/2021-08-06-10-11-07.bpo-44848.ib3Jcz.rst delete mode 100644 Misc/NEWS.d/next/Windows/2021-08-27-23-50-02.bpo-45007.NIBlVG.rst delete mode 100644 Misc/NEWS.d/next/Windows/2021-09-03-18-05-21.bpo-45022.bgpD_r.rst delete mode 100644 Misc/NEWS.d/next/Windows/2021-10-05-12-41-53.bpo-45375.CohPP-.rst delete mode 100644 Misc/NEWS.d/next/macOS/2021-03-29-21-11-23.bpo-34932.f3Hdyd.rst delete mode 100644 Misc/NEWS.d/next/macOS/2021-05-24-21-15-41.bpo-43109.npKJ9c.rst delete mode 100644 Misc/NEWS.d/next/macOS/2021-07-12-15-42-02.bpo-41972.yUjE8j.rst delete mode 100644 Misc/NEWS.d/next/macOS/2021-07-20-22-27-01.bpo-44689.mmT_xH.rst delete mode 100644 Misc/NEWS.d/next/macOS/2021-08-06-10-08-41.bpo-44848.0uYXsE.rst delete mode 100644 Misc/NEWS.d/next/macOS/2021-08-27-16-55-10.bpo-34602.ZjHsYJ.rst delete mode 100644 Misc/NEWS.d/next/macOS/2021-08-30-00-04-10.bpo-45007.pixqUB.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index f37c4d48e37607..28a081d0afa312 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 0 +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.11.0a0" +#define PY_VERSION "3.11.0a1" /*--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 40f7a50128619f..eb523370c58d77 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Mon Apr 5 17:39:41 2021 +# Autogenerated by Sphinx on Tue Oct 5 13:43:52 2021 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -551,13 +551,65 @@ 'exception.\n' ' That new exception causes the old one to be lost.\n' '\n' - '[2] A string literal appearing as the first statement in the ' + '[2] In pattern matching, a sequence is defined as one of the\n' + ' following:\n' + '\n' + ' * a class that inherits from "collections.abc.Sequence"\n' + '\n' + ' * a Python class that has been registered as\n' + ' "collections.abc.Sequence"\n' + '\n' + ' * a builtin class that has its (CPython) ' + '"Py_TPFLAGS_SEQUENCE"\n' + ' bit set\n' + '\n' + ' * a class that inherits from any of the above\n' + '\n' + ' The following standard library classes are sequences:\n' + '\n' + ' * "array.array"\n' + '\n' + ' * "collections.deque"\n' + '\n' + ' * "list"\n' + '\n' + ' * "memoryview"\n' + '\n' + ' * "range"\n' + '\n' + ' * "tuple"\n' + '\n' + ' Note:\n' + '\n' + ' Subject values of type "str", "bytes", and "bytearray" do ' + 'not\n' + ' match sequence patterns.\n' + '\n' + '[3] In pattern matching, a mapping is defined as one of the ' + 'following:\n' + '\n' + ' * a class that inherits from "collections.abc.Mapping"\n' + '\n' + ' * a Python class that has been registered as\n' + ' "collections.abc.Mapping"\n' + '\n' + ' * a builtin class that has its (CPython) ' + '"Py_TPFLAGS_MAPPING"\n' + ' bit set\n' + '\n' + ' * a class that inherits from any of the above\n' + '\n' + ' The standard library classes "dict" and ' + '"types.MappingProxyType"\n' + ' are mappings.\n' + '\n' + '[4] A string literal appearing as the first statement in the ' 'function\n' ' body is transformed into the function’s "__doc__" attribute ' 'and\n' ' therefore the function’s *docstring*.\n' '\n' - '[3] A string literal appearing as the first statement in the class\n' + '[5] A string literal appearing as the first statement in the class\n' ' body is transformed into the namespace’s "__doc__" item and\n' ' therefore the class’s *docstring*.\n', 'atom-identifiers': 'Identifiers (Names)\n' @@ -884,32 +936,6 @@ '*instance* of the\n' ' owner class.\n' '\n' - 'object.__set_name__(self, owner, name)\n' - '\n' - ' Called at the time the owning class *owner* is ' - 'created. The\n' - ' descriptor has been assigned to *name*.\n' - '\n' - ' Note:\n' - '\n' - ' "__set_name__()" is only called implicitly as part ' - 'of the "type"\n' - ' constructor, so it will need to be called ' - 'explicitly with the\n' - ' appropriate parameters when a descriptor is added ' - 'to a class\n' - ' after initial creation:\n' - '\n' - ' class A:\n' - ' pass\n' - ' descr = custom_descriptor()\n' - ' A.attr = descr\n' - " descr.__set_name__(A, 'attr')\n" - '\n' - ' See Creating the class object for more details.\n' - '\n' - ' New in version 3.6.\n' - '\n' 'The attribute "__objclass__" is interpreted by the ' '"inspect" module as\n' 'specifying the class where this object was defined ' @@ -988,9 +1014,9 @@ '\n' 'For instance bindings, the precedence of descriptor ' 'invocation depends\n' - 'on the which descriptor methods are defined. A ' - 'descriptor can define\n' - 'any combination of "__get__()", "__set__()" and ' + 'on which descriptor methods are defined. A descriptor ' + 'can define any\n' + 'combination of "__get__()", "__set__()" and ' '"__delete__()". If it\n' 'does not define "__get__()", then accessing the ' 'attribute will return\n' @@ -1261,6 +1287,10 @@ 'In the latter case, sequence repetition is performed; a negative\n' 'repetition factor yields an empty sequence.\n' '\n' + 'This operation can be customized using the special "__mul__()" ' + 'and\n' + '"__rmul__()" methods.\n' + '\n' 'The "@" (at) operator is intended to be used for matrix\n' 'multiplication. No builtin Python types implement this operator.\n' '\n' @@ -1276,6 +1306,10 @@ 'result. Division by zero raises the "ZeroDivisionError" ' 'exception.\n' '\n' + 'This operation can be customized using the special "__truediv__()" ' + 'and\n' + '"__floordiv__()" methods.\n' + '\n' 'The "%" (modulo) operator yields the remainder from the division ' 'of\n' 'the first argument by the second. The numeric arguments are ' @@ -1307,6 +1341,10 @@ 'string formatting is described in the Python Library Reference,\n' 'section printf-style String Formatting.\n' '\n' + 'The *modulo* operation can be customized using the special ' + '"__mod__()"\n' + 'method.\n' + '\n' 'The floor division operator, the modulo operator, and the ' '"divmod()"\n' 'function are not defined for complex numbers. Instead, convert to ' @@ -1321,9 +1359,16 @@ 'and then added together. In the latter case, the sequences are\n' 'concatenated.\n' '\n' + 'This operation can be customized using the special "__add__()" ' + 'and\n' + '"__radd__()" methods.\n' + '\n' 'The "-" (subtraction) operator yields the difference of its ' 'arguments.\n' - 'The numeric arguments are first converted to a common type.\n', + 'The numeric arguments are first converted to a common type.\n' + '\n' + 'This operation can be customized using the special "__sub__()" ' + 'method.\n', 'bitwise': 'Binary bitwise operations\n' '*************************\n' '\n' @@ -1336,14 +1381,18 @@ '\n' 'The "&" operator yields the bitwise AND of its arguments, which ' 'must\n' - 'be integers.\n' + 'be integers or one of them must be a custom object overriding\n' + '"__and__()" or "__rand__()" special methods.\n' '\n' 'The "^" operator yields the bitwise XOR (exclusive OR) of its\n' - 'arguments, which must be integers.\n' + 'arguments, which must be integers or one of them must be a ' + 'custom\n' + 'object overriding "__xor__()" or "__rxor__()" special methods.\n' '\n' 'The "|" operator yields the bitwise (inclusive) OR of its ' 'arguments,\n' - 'which must be integers.\n', + 'which must be integers or one of them must be a custom object\n' + 'overriding "__or__()" or "__ror__()" special methods.\n', 'bltin-code-objects': 'Code Objects\n' '************\n' '\n' @@ -1360,6 +1409,10 @@ 'through their "__code__" attribute. See also the ' '"code" module.\n' '\n' + 'Accessing "__code__" raises an auditing event ' + '"object.__getattr__"\n' + 'with arguments "obj" and ""__code__"".\n' + '\n' 'A code object can be executed or evaluated by passing ' 'it (instead of a\n' 'source string) to the "exec()" or "eval()" built-in ' @@ -1704,7 +1757,7 @@ 'original global namespace. (Usually, the suite contains mostly\n' 'function definitions.) When the class’s suite finishes execution, ' 'its\n' - 'execution frame is discarded but its local namespace is saved. [3] ' + 'execution frame is discarded but its local namespace is saved. [5] ' 'A\n' 'class object is then created using the inheritance list for the ' 'base\n' @@ -1785,7 +1838,11 @@ ' comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="\n' ' | "is" ["not"] | ["not"] "in"\n' '\n' - 'Comparisons yield boolean values: "True" or "False".\n' + 'Comparisons yield boolean values: "True" or "False". Custom ' + '*rich\n' + 'comparison methods* may return non-boolean values. In this ' + 'case Python\n' + 'will call "bool()" on such value in boolean contexts.\n' '\n' 'Comparisons can be chained arbitrarily, e.g., "x < y <= z" ' 'is\n' @@ -2381,11 +2438,11 @@ 'resulting\n' 'object is “compatible” with the exception. An object is ' 'compatible\n' - 'with an exception if it is the class or a base class of the ' - 'exception\n' - 'object, or a tuple containing an item that is the class or a ' - 'base\n' - 'class of the exception object.\n' + 'with an exception if the object is the class or a base class of ' + 'the\n' + 'exception object, or a tuple containing an item that is the ' + 'class or a\n' + 'base class of the exception object.\n' '\n' 'If no except clause matches the exception, the search for an ' 'exception\n' @@ -2694,7 +2751,7 @@ ' subject_expr ::= star_named_expression "," ' 'star_named_expressions?\n' ' | named_expression\n' - " case_block ::= 'case' patterns [guard] ':' block\n" + ' case_block ::= \'case\' patterns [guard] ":" block\n' '\n' 'Note:\n' '\n' @@ -2764,7 +2821,7 @@ 'have\n' ' happened.\n' '\n' - ' * If the guard evaluates as truthy or missing, the "block" ' + ' * If the guard evaluates as true or is missing, the "block" ' 'inside\n' ' "case_block" is executed.\n' '\n' @@ -2825,12 +2882,12 @@ '\n' '2. If the pattern succeeded, evaluate the "guard".\n' '\n' - ' * If the "guard" condition evaluates to “truthy”, the case ' - 'block is\n' + ' * If the "guard" condition evaluates as true, the case block ' + 'is\n' ' selected.\n' '\n' - ' * If the "guard" condition evaluates to “falsy”, the case ' - 'block is\n' + ' * If the "guard" condition evaluates as false, the case block ' + 'is\n' ' not selected.\n' '\n' ' * If the "guard" raises an exception during evaluation, the\n' @@ -3001,7 +3058,7 @@ '\n' 'A single underscore "_" is not a capture pattern (this is what ' '"!\'_\'"\n' - 'expresses). And is instead treated as a "wildcard_pattern".\n' + 'expresses). It is instead treated as a "wildcard_pattern".\n' '\n' 'In a given pattern, a given name can only be bound once. E.g. ' '"case\n' @@ -3029,7 +3086,10 @@ '\n' " wildcard_pattern ::= '_'\n" '\n' - '"_" is a soft keyword.\n' + '"_" is a soft keyword within any pattern, but only within ' + 'patterns.\n' + 'It is an identifier, as usual, even within "match" subject\n' + 'expressions, "guard"s, and "case" blocks.\n' '\n' 'In simple terms, "_" will always succeed.\n' '\n' @@ -3073,7 +3133,7 @@ 'additional\n' 'syntax. Syntax:\n' '\n' - " group_pattern ::= '(' pattern ')'\n" + ' group_pattern ::= "(" pattern ")"\n' '\n' 'In simple terms "(P)" has the same effect as "P".\n' '\n' @@ -3120,8 +3180,9 @@ 'pattern\n' 'against a subject value:\n' '\n' - '1. If the subject value is not an instance of a\n' - ' "collections.abc.Sequence" the sequence pattern fails.\n' + '1. If the subject value is not a sequence [2], the sequence ' + 'pattern\n' + ' fails.\n' '\n' '2. If the subject value is an instance of "str", "bytes" or\n' ' "bytearray" the sequence pattern fails.\n' @@ -3176,7 +3237,7 @@ 'the\n' 'following happens:\n' '\n' - '* "isinstance(, collections.abc.Sequence)"\n' + '* check "" is a sequence\n' '\n' '* "len(subject) == "\n' '\n' @@ -3210,18 +3271,19 @@ 'double star pattern must be the last subpattern in the mapping\n' 'pattern.\n' '\n' - 'Duplicate key values in mapping patterns are disallowed. (If all ' - 'key\n' - 'patterns are literal patterns this is considered a syntax ' - 'error;\n' - 'otherwise this is a runtime error and will raise "ValueError".)\n' + 'Duplicate keys in mapping patterns are disallowed. Duplicate ' + 'literal\n' + 'keys will raise a "SyntaxError". Two keys that otherwise have ' + 'the same\n' + 'value will raise a "ValueError" at runtime.\n' '\n' 'The following is the logical flow for matching a mapping ' 'pattern\n' 'against a subject value:\n' '\n' - '1. If the subject value is not an instance of\n' - ' "collections.abc.Mapping", the mapping pattern fails.\n' + '1. If the subject value is not a mapping [3],the mapping ' + 'pattern\n' + ' fails.\n' '\n' '2. If every key given in the mapping pattern is present in the ' 'subject\n' @@ -3231,7 +3293,10 @@ '\n' '3. If duplicate keys are detected in the mapping pattern, the ' 'pattern\n' - ' is considered invalid and "ValueError" is raised.\n' + ' is considered invalid. A "SyntaxError" is raised for ' + 'duplicate\n' + ' literal values; or a "ValueError" for named keys of the same ' + 'value.\n' '\n' 'Note:\n' '\n' @@ -3247,7 +3312,7 @@ 'the\n' 'following happens:\n' '\n' - '* "isinstance(, collections.abc.Mapping)"\n' + '* check "" is a mapping\n' '\n' '* "KEY1 in "\n' '\n' @@ -3293,7 +3358,9 @@ ' For a number of built-in types (specified below), a single\n' ' positional subpattern is accepted which will match the ' 'entire\n' - ' subject; for these types no keyword patterns are accepted.\n' + ' subject; for these types keyword patterns also work as for ' + 'other\n' + ' types.\n' '\n' ' If only keyword patterns are present, they are processed as\n' ' follows, one by one:\n' @@ -3324,15 +3391,14 @@ 'class\n' ' "name_or_attr" before matching:\n' '\n' - ' I. The equivalent of "getattr(cls, "__match_args__", ())" ' - 'is\n' + ' I. The equivalent of "getattr(cls, "__match_args__", ())" is\n' ' called.\n' '\n' ' * If this raises an exception, the exception bubbles up.\n' '\n' - ' * If the returned value is not a list or tuple, the ' - 'conversion\n' - ' fails and "TypeError" is raised.\n' + ' * If the returned value is not a tuple, the conversion ' + 'fails and\n' + ' "TypeError" is raised.\n' '\n' ' * If there are more positional patterns than\n' ' "len(cls.__match_args__)", "TypeError" is raised.\n' @@ -3426,7 +3492,6 @@ ' decorators ::= decorator+\n' ' decorator ::= "@" assignment_expression ' 'NEWLINE\n' - ' dotted_name ::= identifier ("." identifier)*\n' ' parameter_list ::= defparameter ("," ' 'defparameter)* "," "/" ["," [parameter_list_no_posonly]]\n' ' | parameter_list_no_posonly\n' @@ -3451,7 +3516,7 @@ '\n' 'The function definition does not execute the function body; this ' 'gets\n' - 'executed only when the function is called. [2]\n' + 'executed only when the function is called. [4]\n' '\n' 'A function definition may be wrapped by one or more *decorator*\n' 'expressions. Decorator expressions are evaluated when the ' @@ -3526,7 +3591,7 @@ 'Calls.\n' 'A function call always assigns values to all parameters ' 'mentioned in\n' - 'the parameter list, either from position arguments, from ' + 'the parameter list, either from positional arguments, from ' 'keyword\n' 'arguments, or from default values. If the form “"*identifier"” ' 'is\n' @@ -3538,8 +3603,14 @@ 'new\n' 'empty mapping of the same type. Parameters after “"*"” or\n' '“"*identifier"” are keyword-only parameters and may only be ' - 'passed\n' - 'used keyword arguments.\n' + 'passed by\n' + 'keyword arguments. Parameters before “"/"” are positional-only\n' + 'parameters and may only be passed by positional arguments.\n' + '\n' + 'Changed in version 3.8: The "/" function parameter syntax may be ' + 'used\n' + 'to indicate positional-only parameters. See **PEP 570** for ' + 'details.\n' '\n' 'Parameters may have an *annotation* of the form “": ' 'expression"”\n' @@ -3552,11 +3623,20 @@ 'parameter list. These annotations can be any valid Python ' 'expression.\n' 'The presence of annotations does not change the semantics of a\n' - 'function. The annotation values are available as string values ' - 'in a\n' + 'function. The annotation values are available as values of a\n' 'dictionary keyed by the parameters’ names in the ' '"__annotations__"\n' - 'attribute of the function object.\n' + 'attribute of the function object. If the "annotations" import ' + 'from\n' + '"__future__" is used, annotations are preserved as strings at ' + 'runtime\n' + 'which enables postponed evaluation. Otherwise, they are ' + 'evaluated\n' + 'when the function definition is executed. In this case ' + 'annotations\n' + 'may be evaluated in a different order than they appear in the ' + 'source\n' + 'code.\n' '\n' 'It is also possible to create anonymous functions (functions not ' 'bound\n' @@ -3641,7 +3721,7 @@ 'function definitions.) When the class’s suite finishes ' 'execution, its\n' 'execution frame is discarded but its local namespace is saved. ' - '[3] A\n' + '[5] A\n' 'class object is then created using the inheritance list for the ' 'base\n' 'classes and the saved local namespace for the attribute ' @@ -3845,13 +3925,65 @@ 'exception.\n' ' That new exception causes the old one to be lost.\n' '\n' - '[2] A string literal appearing as the first statement in the ' + '[2] In pattern matching, a sequence is defined as one of the\n' + ' following:\n' + '\n' + ' * a class that inherits from "collections.abc.Sequence"\n' + '\n' + ' * a Python class that has been registered as\n' + ' "collections.abc.Sequence"\n' + '\n' + ' * a builtin class that has its (CPython) ' + '"Py_TPFLAGS_SEQUENCE"\n' + ' bit set\n' + '\n' + ' * a class that inherits from any of the above\n' + '\n' + ' The following standard library classes are sequences:\n' + '\n' + ' * "array.array"\n' + '\n' + ' * "collections.deque"\n' + '\n' + ' * "list"\n' + '\n' + ' * "memoryview"\n' + '\n' + ' * "range"\n' + '\n' + ' * "tuple"\n' + '\n' + ' Note:\n' + '\n' + ' Subject values of type "str", "bytes", and "bytearray" do ' + 'not\n' + ' match sequence patterns.\n' + '\n' + '[3] In pattern matching, a mapping is defined as one of the ' + 'following:\n' + '\n' + ' * a class that inherits from "collections.abc.Mapping"\n' + '\n' + ' * a Python class that has been registered as\n' + ' "collections.abc.Mapping"\n' + '\n' + ' * a builtin class that has its (CPython) ' + '"Py_TPFLAGS_MAPPING"\n' + ' bit set\n' + '\n' + ' * a class that inherits from any of the above\n' + '\n' + ' The standard library classes "dict" and ' + '"types.MappingProxyType"\n' + ' are mappings.\n' + '\n' + '[4] A string literal appearing as the first statement in the ' 'function\n' ' body is transformed into the function’s "__doc__" attribute ' 'and\n' ' therefore the function’s *docstring*.\n' '\n' - '[3] A string literal appearing as the first statement in the ' + '[5] A string literal appearing as the first statement in the ' 'class\n' ' body is transformed into the namespace’s "__doc__" item and\n' ' therefore the class’s *docstring*.\n', @@ -3989,13 +4121,13 @@ '\n' ' If "__new__()" is invoked during object construction and ' 'it returns\n' - ' an instance or subclass of *cls*, then the new ' - 'instance’s\n' - ' "__init__()" method will be invoked like ' - '"__init__(self[, ...])",\n' - ' where *self* is the new instance and the remaining ' - 'arguments are\n' - ' the same as were passed to the object constructor.\n' + ' an instance of *cls*, then the new instance’s ' + '"__init__()" method\n' + ' will be invoked like "__init__(self[, ...])", where ' + '*self* is the\n' + ' new instance and the remaining arguments are the same as ' + 'were\n' + ' passed to the object constructor.\n' '\n' ' If "__new__()" does not return an instance of *cls*, ' 'then the new\n' @@ -4703,13 +4835,18 @@ '\n' 'If a file ".pdbrc" exists in the user’s home directory or in ' 'the\n' - 'current directory, it is read in and executed as if it had been ' - 'typed\n' - 'at the debugger prompt. This is particularly useful for ' - 'aliases. If\n' - 'both files exist, the one in the home directory is read first ' - 'and\n' - 'aliases defined there can be overridden by the local file.\n' + 'current directory, it is read with "\'utf-8\'" encoding and ' + 'executed as\n' + 'if it had been typed at the debugger prompt. This is ' + 'particularly\n' + 'useful for aliases. If both files exist, the one in the home\n' + 'directory is read first and aliases defined there can be ' + 'overridden by\n' + 'the local file.\n' + '\n' + 'Changed in version 3.11: ".pdbrc" is now read with "\'utf-8\'" ' + 'encoding.\n' + 'Previously, it was read with the system locale encoding.\n' '\n' 'Changed in version 3.2: ".pdbrc" can now contain commands that\n' 'continue debugging, such as "continue" or "next". Previously, ' @@ -6075,19 +6212,19 @@ 'complex\n' 'types. For integers, when binary, octal, or hexadecimal ' 'output is\n' - 'used, this option adds the prefix respective "\'0b\'", ' - '"\'0o\'", or "\'0x\'"\n' - 'to the output value. For float and complex the alternate ' - 'form causes\n' - 'the result of the conversion to always contain a ' - 'decimal-point\n' - 'character, even if no digits follow it. Normally, a ' - 'decimal-point\n' - 'character appears in the result of these conversions only ' - 'if a digit\n' - 'follows it. In addition, for "\'g\'" and "\'G\'" ' - 'conversions, trailing\n' - 'zeros are not removed from the result.\n' + 'used, this option adds the respective prefix "\'0b\'", ' + '"\'0o\'", "\'0x\'",\n' + 'or "\'0X\'" to the output value. For float and complex the ' + 'alternate\n' + 'form causes the result of the conversion to always contain ' + 'a decimal-\n' + 'point character, even if no digits follow it. Normally, a ' + 'decimal-\n' + 'point character appears in the result of these conversions ' + 'only if a\n' + 'digit follows it. In addition, for "\'g\'" and "\'G\'" ' + 'conversions,\n' + 'trailing zeros are not removed from the result.\n' '\n' 'The "\',\'" option signals the use of a comma for a ' 'thousands separator.\n' @@ -6204,8 +6341,12 @@ '+-----------+------------------------------------------------------------+\n' ' | "\'X\'" | Hex format. Outputs the number in base ' '16, using upper- |\n' - ' | | case letters for the digits above ' - '9. |\n' + ' | | case letters for the digits above 9. In ' + 'case "\'#\'" is |\n' + ' | | specified, the prefix "\'0x\'" will be ' + 'upper-cased to "\'0X\'" |\n' + ' | | as ' + 'well. |\n' ' ' '+-----------+------------------------------------------------------------+\n' ' | "\'n\'" | Number. This is the same as "\'d\'", ' @@ -6562,7 +6703,6 @@ ' decorators ::= decorator+\n' ' decorator ::= "@" assignment_expression ' 'NEWLINE\n' - ' dotted_name ::= identifier ("." identifier)*\n' ' parameter_list ::= defparameter ("," ' 'defparameter)* "," "/" ["," [parameter_list_no_posonly]]\n' ' | parameter_list_no_posonly\n' @@ -6587,7 +6727,7 @@ '\n' 'The function definition does not execute the function body; this ' 'gets\n' - 'executed only when the function is called. [2]\n' + 'executed only when the function is called. [4]\n' '\n' 'A function definition may be wrapped by one or more *decorator*\n' 'expressions. Decorator expressions are evaluated when the ' @@ -6662,7 +6802,7 @@ 'Calls.\n' 'A function call always assigns values to all parameters ' 'mentioned in\n' - 'the parameter list, either from position arguments, from ' + 'the parameter list, either from positional arguments, from ' 'keyword\n' 'arguments, or from default values. If the form “"*identifier"” ' 'is\n' @@ -6674,8 +6814,14 @@ 'new\n' 'empty mapping of the same type. Parameters after “"*"” or\n' '“"*identifier"” are keyword-only parameters and may only be ' - 'passed\n' - 'used keyword arguments.\n' + 'passed by\n' + 'keyword arguments. Parameters before “"/"” are positional-only\n' + 'parameters and may only be passed by positional arguments.\n' + '\n' + 'Changed in version 3.8: The "/" function parameter syntax may be ' + 'used\n' + 'to indicate positional-only parameters. See **PEP 570** for ' + 'details.\n' '\n' 'Parameters may have an *annotation* of the form “": ' 'expression"”\n' @@ -6688,11 +6834,20 @@ 'parameter list. These annotations can be any valid Python ' 'expression.\n' 'The presence of annotations does not change the semantics of a\n' - 'function. The annotation values are available as string values ' - 'in a\n' + 'function. The annotation values are available as values of a\n' 'dictionary keyed by the parameters’ names in the ' '"__annotations__"\n' - 'attribute of the function object.\n' + 'attribute of the function object. If the "annotations" import ' + 'from\n' + '"__future__" is used, annotations are preserved as strings at ' + 'runtime\n' + 'which enables postponed evaluation. Otherwise, they are ' + 'evaluated\n' + 'when the function definition is executed. In this case ' + 'annotations\n' + 'may be evaluated in a different order than they appear in the ' + 'source\n' + 'code.\n' '\n' 'It is also possible to create anonymous functions (functions not ' 'bound\n' @@ -6909,8 +7064,8 @@ '\n' 'A non-normative HTML file listing all valid identifier ' 'characters for\n' - 'Unicode 4.1 can be found at\n' - 'https://www.unicode.org/Public/13.0.0/ucd/DerivedCoreProperties.txt\n' + 'Unicode 14.0.0 can be found at\n' + 'https://www.unicode.org/Public/14.0.0/ucd/DerivedCoreProperties.txt\n' '\n' '\n' 'Keywords\n' @@ -7051,7 +7206,7 @@ ' | "from" relative_module "import" "(" ' 'identifier ["as" identifier]\n' ' ("," identifier ["as" identifier])* [","] ")"\n' - ' | "from" module "import" "*"\n' + ' | "from" relative_module "import" "*"\n' ' module ::= (identifier ".")* identifier\n' ' relative_module ::= "."* module | "."+\n' '\n' @@ -7395,10 +7550,7 @@ 'lambda': 'Lambdas\n' '*******\n' '\n' - ' lambda_expr ::= "lambda" [parameter_list] ":" ' - 'expression\n' - ' lambda_expr_nocond ::= "lambda" [parameter_list] ":" ' - 'expression_nocond\n' + ' lambda_expr ::= "lambda" [parameter_list] ":" expression\n' '\n' 'Lambda expressions (sometimes called lambda forms) are used to ' 'create\n' @@ -7715,11 +7867,11 @@ 'instance, to\n' ' evaluate the expression "x + y", where *x* is an ' 'instance of a\n' - ' class that has an "__add__()" method, "x.__add__(y)" is ' - 'called.\n' - ' The "__divmod__()" method should be the equivalent to ' - 'using\n' - ' "__floordiv__()" and "__mod__()"; it should not be ' + ' class that has an "__add__()" method, ' + '"type(x).__add__(x, y)" is\n' + ' called. The "__divmod__()" method should be the ' + 'equivalent to\n' + ' using "__floordiv__()" and "__mod__()"; it should not be ' 'related to\n' ' "__truediv__()". Note that "__pow__()" should be ' 'defined to accept\n' @@ -7760,9 +7912,9 @@ 'expression "x -\n' ' y", where *y* is an instance of a class that has an ' '"__rsub__()"\n' - ' method, "y.__rsub__(x)" is called if "x.__sub__(y)" ' - 'returns\n' - ' *NotImplemented*.\n' + ' method, "type(y).__rsub__(y, x)" is called if ' + '"type(x).__sub__(x,\n' + ' y)" returns *NotImplemented*.\n' '\n' ' Note that ternary "pow()" will not try calling ' '"__rpow__()" (the\n' @@ -8009,8 +8161,8 @@ '\n' 'The following table summarizes the operator precedence ' 'in Python, from\n' - 'lowest precedence (least binding) to highest precedence ' - '(most\n' + 'highest precedence (most binding) to lowest precedence ' + '(least\n' 'binding). Operators in the same box have the same ' 'precedence. Unless\n' 'the syntax is explicitly given, operators are binary. ' @@ -8029,71 +8181,71 @@ '| Operator | ' 'Description |\n' '|=================================================|=======================================|\n' - '| ":=" | ' - 'Assignment expression |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "lambda" | ' - 'Lambda expression |\n' + '| "(expressions...)", "[expressions...]", "{key: | ' + 'Binding or parenthesized expression, |\n' + '| value...}", "{expressions...}" | list ' + 'display, dictionary display, set |\n' + '| | ' + 'display |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "if" – "else" | ' - 'Conditional expression |\n' + '| "x[index]", "x[index:index]", | ' + 'Subscription, slicing, call, |\n' + '| "x(arguments...)", "x.attribute" | ' + 'attribute reference |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "or" | ' - 'Boolean OR |\n' + '| "await" "x" | ' + 'Await expression |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "and" | ' - 'Boolean AND |\n' + '| "**" | ' + 'Exponentiation [5] |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "not" "x" | ' - 'Boolean NOT |\n' + '| "+x", "-x", "~x" | ' + 'Positive, negative, bitwise NOT |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "in", "not in", "is", "is not", "<", "<=", ">", | ' - 'Comparisons, including membership |\n' - '| ">=", "!=", "==" | ' - 'tests and identity tests |\n' + '| "*", "@", "/", "//", "%" | ' + 'Multiplication, matrix |\n' + '| | ' + 'multiplication, division, floor |\n' + '| | ' + 'division, remainder [6] |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "|" | ' - 'Bitwise OR |\n' + '| "+", "-" | ' + 'Addition and subtraction |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "^" | ' - 'Bitwise XOR |\n' + '| "<<", ">>" | ' + 'Shifts |\n' '+-------------------------------------------------+---------------------------------------+\n' '| "&" | ' 'Bitwise AND |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "<<", ">>" | ' - 'Shifts |\n' + '| "^" | ' + 'Bitwise XOR |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "+", "-" | ' - 'Addition and subtraction |\n' + '| "|" | ' + 'Bitwise OR |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "*", "@", "/", "//", "%" | ' - 'Multiplication, matrix |\n' - '| | ' - 'multiplication, division, floor |\n' - '| | ' - 'division, remainder [5] |\n' + '| "in", "not in", "is", "is not", "<", "<=", ">", | ' + 'Comparisons, including membership |\n' + '| ">=", "!=", "==" | ' + 'tests and identity tests |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "+x", "-x", "~x" | ' - 'Positive, negative, bitwise NOT |\n' + '| "not" "x" | ' + 'Boolean NOT |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "**" | ' - 'Exponentiation [6] |\n' + '| "and" | ' + 'Boolean AND |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "await" "x" | ' - 'Await expression |\n' + '| "or" | ' + 'Boolean OR |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "x[index]", "x[index:index]", | ' - 'Subscription, slicing, call, |\n' - '| "x(arguments...)", "x.attribute" | ' - 'attribute reference |\n' + '| "if" – "else" | ' + 'Conditional expression |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "(expressions...)", "[expressions...]", "{key: | ' - 'Binding or parenthesized expression, |\n' - '| value...}", "{expressions...}" | list ' - 'display, dictionary display, set |\n' - '| | ' - 'display |\n' + '| "lambda" | ' + 'Lambda expression |\n' + '+-------------------------------------------------+---------------------------------------+\n' + '| ":=" | ' + 'Assignment expression |\n' '+-------------------------------------------------+---------------------------------------+\n' '\n' '-[ Footnotes ]-\n' @@ -8174,14 +8326,14 @@ 'Check their\n' ' documentation for more info.\n' '\n' - '[5] The "%" operator is also used for string formatting; ' - 'the same\n' - ' precedence applies.\n' - '\n' - '[6] The power operator "**" binds less tightly than an ' + '[5] The power operator "**" binds less tightly than an ' 'arithmetic or\n' ' bitwise unary operator on its right, that is, ' - '"2**-1" is "0.5".\n', + '"2**-1" is "0.5".\n' + '\n' + '[6] The "%" operator is also used for string formatting; ' + 'the same\n' + ' precedence applies.\n', 'pass': 'The "pass" statement\n' '********************\n' '\n' @@ -8229,7 +8381,10 @@ '"ZeroDivisionError".\n' 'Raising a negative number to a fractional power results in a ' '"complex"\n' - 'number. (In earlier versions it raised a "ValueError".)\n', + 'number. (In earlier versions it raised a "ValueError".)\n' + '\n' + 'This operation can be customized using the special "__pow__()" ' + 'method.\n', 'raise': 'The "raise" statement\n' '*********************\n' '\n' @@ -8266,12 +8421,18 @@ '\n' 'The "from" clause is used for exception chaining: if given, the ' 'second\n' - '*expression* must be another exception class or instance, which ' - 'will\n' - 'then be attached to the raised exception as the "__cause__" ' - 'attribute\n' - '(which is writable). If the raised exception is not handled, both\n' - 'exceptions will be printed:\n' + '*expression* must be another exception class or instance. If the\n' + 'second expression is an exception instance, it will be attached to ' + 'the\n' + 'raised exception as the "__cause__" attribute (which is writable). ' + 'If\n' + 'the expression is an exception class, the class will be ' + 'instantiated\n' + 'and the resulting exception instance will be attached to the ' + 'raised\n' + 'exception as the "__cause__" attribute. If the raised exception is ' + 'not\n' + 'handled, both exceptions will be printed:\n' '\n' ' >>> try:\n' ' ... print(1 / 0)\n' @@ -8623,6 +8784,10 @@ 'the\n' 'second argument.\n' '\n' + 'This operation can be customized using the special ' + '"__lshift__()" and\n' + '"__rshift__()" methods.\n' + '\n' 'A right shift by *n* bits is defined as floor division by ' '"pow(2,n)".\n' 'A left shift by *n* bits is defined as multiplication with ' @@ -8837,13 +9002,13 @@ '\n' ' If "__new__()" is invoked during object construction and ' 'it returns\n' - ' an instance or subclass of *cls*, then the new ' - 'instance’s\n' - ' "__init__()" method will be invoked like "__init__(self[, ' - '...])",\n' - ' where *self* is the new instance and the remaining ' - 'arguments are\n' - ' the same as were passed to the object constructor.\n' + ' an instance of *cls*, then the new instance’s ' + '"__init__()" method\n' + ' will be invoked like "__init__(self[, ...])", where ' + '*self* is the\n' + ' new instance and the remaining arguments are the same as ' + 'were\n' + ' passed to the object constructor.\n' '\n' ' If "__new__()" does not return an instance of *cls*, then ' 'the new\n' @@ -9511,32 +9676,6 @@ 'of the\n' ' owner class.\n' '\n' - 'object.__set_name__(self, owner, name)\n' - '\n' - ' Called at the time the owning class *owner* is created. ' - 'The\n' - ' descriptor has been assigned to *name*.\n' - '\n' - ' Note:\n' - '\n' - ' "__set_name__()" is only called implicitly as part of ' - 'the "type"\n' - ' constructor, so it will need to be called explicitly ' - 'with the\n' - ' appropriate parameters when a descriptor is added to a ' - 'class\n' - ' after initial creation:\n' - '\n' - ' class A:\n' - ' pass\n' - ' descr = custom_descriptor()\n' - ' A.attr = descr\n' - " descr.__set_name__(A, 'attr')\n" - '\n' - ' See Creating the class object for more details.\n' - '\n' - ' New in version 3.6.\n' - '\n' 'The attribute "__objclass__" is interpreted by the "inspect" ' 'module as\n' 'specifying the class where this object was defined (setting ' @@ -9613,10 +9752,10 @@ '\n' 'For instance bindings, the precedence of descriptor ' 'invocation depends\n' - 'on the which descriptor methods are defined. A descriptor ' - 'can define\n' - 'any combination of "__get__()", "__set__()" and ' - '"__delete__()". If it\n' + 'on which descriptor methods are defined. A descriptor can ' + 'define any\n' + 'combination of "__get__()", "__set__()" and "__delete__()". ' + 'If it\n' 'does not define "__get__()", then accessing the attribute ' 'will return\n' 'the descriptor object itself unless there is a value in the ' @@ -9826,6 +9965,38 @@ '\n' ' New in version 3.6.\n' '\n' + 'When a class is created, "type.__new__()" scans the class ' + 'variables\n' + 'and makes callbacks to those with a "__set_name__()" hook.\n' + '\n' + 'object.__set_name__(self, owner, name)\n' + '\n' + ' Automatically called at the time the owning class *owner* ' + 'is\n' + ' created. The object has been assigned to *name* in that ' + 'class:\n' + '\n' + ' class A:\n' + ' x = C() # Automatically calls: x.__set_name__(A, ' + "'x')\n" + '\n' + ' If the class variable is assigned after the class is ' + 'created,\n' + ' "__set_name__()" will not be called automatically. If ' + 'needed,\n' + ' "__set_name__()" can be called directly:\n' + '\n' + ' class A:\n' + ' pass\n' + '\n' + ' c = C()\n' + ' A.x = c # The hook is not called\n' + " c.__set_name__(A, 'x') # Manually invoke the hook\n" + '\n' + ' See Creating the class object for more details.\n' + '\n' + ' New in version 3.6.\n' + '\n' '\n' 'Metaclasses\n' '-----------\n' @@ -10021,22 +10192,21 @@ 'When using the default metaclass "type", or any metaclass ' 'that\n' 'ultimately calls "type.__new__", the following additional\n' - 'customisation steps are invoked after creating the class ' + 'customization steps are invoked after creating the class ' 'object:\n' '\n' - '* first, "type.__new__" collects all of the descriptors in ' - 'the class\n' - ' namespace that define a "__set_name__()" method;\n' + '1. The "type.__new__" method collects all of the attributes ' + 'in the\n' + ' class namespace that define a "__set_name__()" method;\n' '\n' - '* second, all of these "__set_name__" methods are called ' - 'with the\n' - ' class being defined and the assigned name of that ' - 'particular\n' - ' descriptor;\n' + '2. Those "__set_name__" methods are called with the class ' + 'being\n' + ' defined and the assigned name of that particular ' + 'attribute;\n' '\n' - '* finally, the "__init_subclass__()" hook is called on the ' - 'immediate\n' - ' parent of the new class in its method resolution order.\n' + '3. The "__init_subclass__()" hook is called on the immediate ' + 'parent of\n' + ' the new class in its method resolution order.\n' '\n' 'After the class object is created, it is passed to the ' 'class\n' @@ -10437,11 +10607,11 @@ 'to\n' ' evaluate the expression "x + y", where *x* is an instance ' 'of a\n' - ' class that has an "__add__()" method, "x.__add__(y)" is ' - 'called.\n' - ' The "__divmod__()" method should be the equivalent to ' - 'using\n' - ' "__floordiv__()" and "__mod__()"; it should not be ' + ' class that has an "__add__()" method, "type(x).__add__(x, ' + 'y)" is\n' + ' called. The "__divmod__()" method should be the ' + 'equivalent to\n' + ' using "__floordiv__()" and "__mod__()"; it should not be ' 'related to\n' ' "__truediv__()". Note that "__pow__()" should be defined ' 'to accept\n' @@ -10482,9 +10652,9 @@ 'expression "x -\n' ' y", where *y* is an instance of a class that has an ' '"__rsub__()"\n' - ' method, "y.__rsub__(x)" is called if "x.__sub__(y)" ' - 'returns\n' - ' *NotImplemented*.\n' + ' method, "type(y).__rsub__(y, x)" is called if ' + '"type(x).__sub__(x,\n' + ' y)" returns *NotImplemented*.\n' '\n' ' Note that ternary "pow()" will not try calling ' '"__rpow__()" (the\n' @@ -10677,17 +10847,16 @@ '\n' 'object.__match_args__\n' '\n' - ' This class variable can be assigned a tuple or list of ' - 'strings.\n' - ' When this class is used in a class pattern with ' - 'positional\n' - ' arguments, each positional argument will be converted ' - 'into a\n' - ' keyword argument, using the corresponding value in ' - '*__match_args__*\n' - ' as the keyword. The absence of this attribute is ' - 'equivalent to\n' - ' setting it to "()".\n' + ' This class variable can be assigned a tuple of strings. ' + 'When this\n' + ' class is used in a class pattern with positional ' + 'arguments, each\n' + ' positional argument will be converted into a keyword ' + 'argument,\n' + ' using the corresponding value in *__match_args__* as the ' + 'keyword.\n' + ' The absence of this attribute is equivalent to setting it ' + 'to "()".\n' '\n' 'For example, if "MyClass.__match_args__" is "("left", ' '"center",\n' @@ -12078,10 +12247,10 @@ 'exception. For an except clause with an expression, that expression\n' 'is evaluated, and the clause matches the exception if the resulting\n' 'object is “compatible” with the exception. An object is compatible\n' - 'with an exception if it is the class or a base class of the ' - 'exception\n' - 'object, or a tuple containing an item that is the class or a base\n' - 'class of the exception object.\n' + 'with an exception if the object is the class or a base class of the\n' + 'exception object, or a tuple containing an item that is the class or ' + 'a\n' + 'base class of the exception object.\n' '\n' 'If no except clause matches the exception, the search for an ' 'exception\n' @@ -12680,7 +12849,13 @@ '| |\n' ' | | and "\'return\'" for the ' 'return | |\n' - ' | | annotation, if provided. ' + ' | | annotation, if provided. For ' + '| |\n' + ' | | more information on working ' + '| |\n' + ' | | with this attribute, see ' + '| |\n' + ' | | Annotations Best Practices. ' '| |\n' ' ' '+---------------------------+---------------------------------+-------------+\n' @@ -12905,20 +13080,34 @@ ' Attribute assignment updates the module’s namespace dictionary,\n' ' e.g., "m.x = 1" is equivalent to "m.__dict__["x"] = 1".\n' '\n' - ' Predefined (writable) attributes: "__name__" is the module’s ' - 'name;\n' - ' "__doc__" is the module’s documentation string, or "None" if\n' - ' unavailable; "__annotations__" (optional) is a dictionary\n' - ' containing *variable annotations* collected during module body\n' - ' execution; "__file__" is the pathname of the file from which ' + ' Predefined (writable) attributes:\n' + '\n' + ' "__name__"\n' + ' The module’s name.\n' + '\n' + ' "__doc__"\n' + ' The module’s documentation string, or "None" if ' + 'unavailable.\n' + '\n' + ' "__file__"\n' + ' The pathname of the file from which the module was loaded, ' + 'if\n' + ' it was loaded from a file. The "__file__" attribute may ' + 'be\n' + ' missing for certain types of modules, such as C modules ' + 'that\n' + ' are statically linked into the interpreter. For ' + 'extension\n' + ' modules loaded dynamically from a shared library, it’s ' 'the\n' - ' module was loaded, if it was loaded from a file. The "__file__"\n' - ' attribute may be missing for certain types of modules, such as ' - 'C\n' - ' modules that are statically linked into the interpreter; for\n' - ' extension modules loaded dynamically from a shared library, it ' - 'is\n' - ' the pathname of the shared library file.\n' + ' pathname of the shared library file.\n' + '\n' + ' "__annotations__"\n' + ' A dictionary containing *variable annotations* collected\n' + ' during module body execution. For best practices on ' + 'working\n' + ' with "__annotations__", please see Annotations Best\n' + ' Practices.\n' '\n' ' Special read-only attribute: "__dict__" is the module’s ' 'namespace\n' @@ -12976,20 +13165,31 @@ 'instance\n' ' (see below).\n' '\n' - ' Special attributes: "__name__" is the class name; "__module__" ' - 'is\n' - ' the module name in which the class was defined; "__dict__" is ' - 'the\n' - ' dictionary containing the class’s namespace; "__bases__" is a ' - 'tuple\n' - ' containing the base classes, in the order of their occurrence ' - 'in\n' - ' the base class list; "__doc__" is the class’s documentation ' - 'string,\n' - ' or "None" if undefined; "__annotations__" (optional) is a\n' - ' dictionary containing *variable annotations* collected during ' - 'class\n' - ' body execution.\n' + ' Special attributes:\n' + '\n' + ' "__name__"\n' + ' The class name.\n' + '\n' + ' "__module__"\n' + ' The name of the module in which the class was defined.\n' + '\n' + ' "__dict__"\n' + ' The dictionary containing the class’s namespace.\n' + '\n' + ' "__bases__"\n' + ' A tuple containing the base classes, in the order of ' + 'their\n' + ' occurrence in the base class list.\n' + '\n' + ' "__doc__"\n' + ' The class’s documentation string, or "None" if undefined.\n' + '\n' + ' "__annotations__"\n' + ' A dictionary containing *variable annotations* collected\n' + ' during class body execution. For best practices on ' + 'working\n' + ' with "__annotations__", please see Annotations Best\n' + ' Practices.\n' '\n' 'Class instances\n' ' A class instance is created by calling a class object (see ' @@ -13072,6 +13272,7 @@ '\n' ' Special read-only attributes: "co_name" gives the function ' 'name;\n' + ' "co_qualname" gives the fully qualified function name;\n' ' "co_argcount" is the total number of positional arguments\n' ' (including positional-only arguments and arguments with ' 'default\n' @@ -13132,6 +13333,54 @@ ' "co_consts" is the documentation string of the function, or\n' ' "None" if undefined.\n' '\n' + ' codeobject.co_positions()\n' + '\n' + ' Returns an iterable over the source code positions of ' + 'each\n' + ' bytecode instruction in the code object.\n' + '\n' + ' The iterator returns tuples containing the "(start_line,\n' + ' end_line, start_column, end_column)". The *i-th* tuple\n' + ' corresponds to the position of the source code that ' + 'compiled\n' + ' to the *i-th* instruction. Column information is ' + '0-indexed\n' + ' utf-8 byte offsets on the given source line.\n' + '\n' + ' This positional information can be missing. A ' + 'non-exhaustive\n' + ' lists of cases where this may happen:\n' + '\n' + ' * Running the interpreter with "-X" "no_debug_ranges".\n' + '\n' + ' * Loading a pyc file compiled while using "-X"\n' + ' "no_debug_ranges".\n' + '\n' + ' * Position tuples corresponding to artificial ' + 'instructions.\n' + '\n' + ' * Line and column numbers that can’t be represented due ' + 'to\n' + ' implementation specific limitations.\n' + '\n' + ' When this occurs, some or all of the tuple elements can ' + 'be\n' + ' "None".\n' + '\n' + ' New in version 3.11.\n' + '\n' + ' Note:\n' + '\n' + ' This feature requires storing column positions in code\n' + ' objects which may result in a small increase of disk ' + 'usage\n' + ' of compiled Python files or interpreter memory usage. ' + 'To\n' + ' avoid storing the extra information and/or deactivate\n' + ' printing the extra traceback information, the "-X"\n' + ' "no_debug_ranges" command line flag or the\n' + ' "PYTHONNODEBUGRANGES" environment variable can be used.\n' + '\n' ' Frame objects\n' ' Frame objects represent execution frames. They may occur in\n' ' traceback objects (see below), and are also passed to ' @@ -13150,6 +13399,10 @@ ' gives the precise instruction (this is an index into the\n' ' bytecode string of the code object).\n' '\n' + ' Accessing "f_code" raises an auditing event ' + '"object.__getattr__"\n' + ' with arguments "obj" and ""f_code"".\n' + '\n' ' Special writable attributes: "f_trace", if not "None", is a\n' ' function called for various events during code execution ' '(this\n' @@ -13233,6 +13486,9 @@ ' the exception occurred in a "try" statement with no matching\n' ' except clause or with a finally clause.\n' '\n' + ' Accessing "tb_frame" raises an auditing event\n' + ' "object.__getattr__" with arguments "obj" and ""tb_frame"".\n' + '\n' ' Special writable attribute: "tb_next" is the next level in ' 'the\n' ' stack trace (towards the frame where the exception occurred), ' @@ -13283,9 +13539,8 @@ ' object actually returned is the wrapped object, which is not\n' ' subject to any further transformation. Static method objects ' 'are\n' - ' not themselves callable, although the objects they wrap ' - 'usually\n' - ' are. Static method objects are created by the built-in\n' + ' also callable. Static method objects are created by the ' + 'built-in\n' ' "staticmethod()" constructor.\n' '\n' ' Class method objects\n' @@ -14237,7 +14492,7 @@ '| | "s[i:i] = ' '[x]") | |\n' '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.pop([i])" | retrieves the item at *i* ' + '| "s.pop()" or "s.pop(i)" | retrieves the item at *i* ' 'and | (2) |\n' '| | also removes it from ' '*s* | |\n' @@ -14700,7 +14955,7 @@ '| | "s[i:i] = ' '[x]") | |\n' '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.pop([i])" | retrieves the item at ' + '| "s.pop()" or "s.pop(i)" | retrieves the item at ' '*i* and | (2) |\n' '| | also removes it from ' '*s* | |\n' @@ -14765,15 +15020,21 @@ ' u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr\n' '\n' 'The unary "-" (minus) operator yields the negation of its numeric\n' - 'argument.\n' + 'argument; the operation can be overridden with the "__neg__()" ' + 'special\n' + 'method.\n' '\n' 'The unary "+" (plus) operator yields its numeric argument ' - 'unchanged.\n' + 'unchanged;\n' + 'the operation can be overridden with the "__pos__()" special ' + 'method.\n' '\n' 'The unary "~" (invert) operator yields the bitwise inversion of ' 'its\n' 'integer argument. The bitwise inversion of "x" is defined as\n' - '"-(x+1)". It only applies to integral numbers.\n' + '"-(x+1)". It only applies to integral numbers or to custom ' + 'objects\n' + 'that override the "__invert__()" special method.\n' '\n' 'In all three cases, if the argument does not have the proper type, ' 'a\n' diff --git a/Misc/NEWS.d/3.11.0a1.rst b/Misc/NEWS.d/3.11.0a1.rst new file mode 100644 index 00000000000000..ba07ef95b48016 --- /dev/null +++ b/Misc/NEWS.d/3.11.0a1.rst @@ -0,0 +1,5098 @@ +.. bpo: 42278 +.. date: 2021-08-29-12-39-44 +.. nonce: jvmQz_ +.. release date: 2021-10-05 +.. section: Security + +Replaced usage of :func:`tempfile.mktemp` with +:class:`~tempfile.TemporaryDirectory` to avoid a potential race condition. + +.. + +.. bpo: 44600 +.. date: 2021-07-25-20-04-54 +.. nonce: 0WMldg +.. section: Security + +Fix incorrect line numbers while tracing some failed patterns in :ref:`match +` statements. Patch by Charles Burkland. + +.. + +.. bpo: 41180 +.. date: 2021-06-29-23-40-22 +.. nonce: uTWHv_ +.. section: Security + +Add auditing events to the :mod:`marshal` module, and stop raising +``code.__init__`` events for every unmarshalled code object. Directly +instantiated code objects will continue to raise an event, and audit event +handlers should inspect or collect the raw marshal data. This reduces a +significant performance overhead when loading from ``.pyc`` files. + +.. + +.. bpo: 44394 +.. date: 2021-06-29-02-45-53 +.. nonce: A220N1 +.. section: Security + +Update the vendored copy of libexpat to 2.4.1 (from 2.2.8) to get the fix +for the CVE-2013-0340 "Billion Laughs" vulnerability. This copy is most used +on Windows and macOS. + +.. + +.. bpo: 43124 +.. date: 2021-05-08-11-50-46 +.. nonce: 2CTM6M +.. section: Security + +Made the internal ``putcmd`` function in :mod:`smtplib` sanitize input for +presence of ``\r`` and ``\n`` characters to avoid (unlikely) command +injection. + +.. + +.. bpo: 44022 +.. date: 2021-05-05-17-37-04 +.. nonce: bS3XJ9 +.. section: Security + +:mod:`http.client` now avoids infinitely reading potential HTTP headers +after a ``100 Continue`` status response from the server. + +.. + +.. bpo: 43760 +.. date: 2021-10-04-16-11-50 +.. nonce: R9QoUv +.. section: Core and Builtins + +The number of hardware branches per instruction dispatch is reduced from two +to one by adding a special instruction for tracing. Patch by Mark Shannon. + +.. + +.. bpo: 45061 +.. date: 2021-09-21-22-27-25 +.. nonce: 5IOUf0 +.. section: Core and Builtins + +Add a deallocator to the bool type to detect refcount bugs in C extensions +which call Py_DECREF(Py_True) or Py_DECREF(Py_False) by mistake. Detect also +refcount bugs when the empty tuple singleton or the Unicode empty string +singleton is destroyed by mistake. Patch by Victor Stinner. + +.. + +.. bpo: 24076 +.. date: 2021-09-20-10-02-12 +.. nonce: ZFgFSj +.. section: Core and Builtins + +sum() was further optimised for summing up single digit integers. + +.. + +.. bpo: 45190 +.. date: 2021-09-14-10-02-12 +.. nonce: ZFRgSj +.. section: Core and Builtins + +Update Unicode databases to Unicode 14.0.0. + +.. + +.. bpo: 45167 +.. date: 2021-09-14-09-23-59 +.. nonce: CPSSoV +.. section: Core and Builtins + +Fix deepcopying of :class:`types.GenericAlias` objects. + +.. + +.. bpo: 45155 +.. date: 2021-09-09-15-05-17 +.. nonce: JRw9TG +.. section: Core and Builtins + +:meth:`int.to_bytes` and :meth:`int.from_bytes` now take a default value of +``"big"`` for the ``byteorder`` argument. :meth:`int.to_bytes` also takes a +default value of ``1`` for the ``length`` argument. + +.. + +.. bpo: 44219 +.. date: 2021-09-09-10-32-33 +.. nonce: WiYyjz +.. section: Core and Builtins + +Release the GIL while performing ``isatty`` system calls on arbitrary file +descriptors. In particular, this affects :func:`os.isatty`, +:func:`os.device_encoding` and :class:`io.TextIOWrapper`. By extension, +:func:`io.open` in text mode is also affected. This change solves a deadlock +in :func:`os.isatty`. Patch by Vincent Michel in :issue:`44219`. + +.. + +.. bpo: 44959 +.. date: 2021-09-08-08-29-41 +.. nonce: OSwwPf +.. section: Core and Builtins + +Added fallback to extension modules with '.sl' suffix on HP-UX + +.. + +.. bpo: 45121 +.. date: 2021-09-07-17-10-16 +.. nonce: iG-Hsf +.. section: Core and Builtins + +Fix issue where ``Protocol.__init__`` raises ``RecursionError`` when it's +called directly or via ``super()``. Patch provided by Yurii Karabas. + +.. + +.. bpo: 44348 +.. date: 2021-09-07-00-21-04 +.. nonce: f8w_Td +.. section: Core and Builtins + +The deallocator function of the :exc:`BaseException` type now uses the +trashcan mecanism to prevent stack overflow. For example, when a +:exc:`RecursionError` instance is raised, it can be linked to another +RecursionError through the ``__context__`` attribute or the +``__traceback__`` attribute, and then a chain of exceptions is created. When +the chain is destroyed, nested deallocator function calls can crash with a +stack overflow if the chain is too long compared to the available stack +memory. Patch by Victor Stinner. + +.. + +.. bpo: 45123 +.. date: 2021-09-06-21-52-45 +.. nonce: 8Eh9iI +.. section: Core and Builtins + +Fix PyAiter_Check to only check for the __anext__ presence (not for +__aiter__). Rename PyAiter_Check to PyAIter_Check, PyObject_GetAiter -> +PyObject_GetAIter. + +.. + +.. bpo: 1514420 +.. date: 2021-09-03-16-18-10 +.. nonce: 2Lumpj +.. section: Core and Builtins + +Interpreter no longer attempts to open files with names in angle brackets +(like "" or "") when formatting an exception. + +.. + +.. bpo: 41031 +.. date: 2021-09-03-12-35-17 +.. nonce: yPSJEs +.. section: Core and Builtins + +Match C and Python code formatting of unprintable exceptions and exceptions +in the :mod:`__main__` module. + +.. + +.. bpo: 37330 +.. date: 2021-09-02-01-28-01 +.. nonce: QDjM_l +.. section: Core and Builtins + +:func:`open`, :func:`io.open`, :func:`codecs.open` and +:class:`fileinput.FileInput` no longer accept ``'U'`` ("universal newline") +in the file mode. This flag was deprecated since Python 3.3. Patch by Victor +Stinner. + +.. + +.. bpo: 45083 +.. date: 2021-09-01-23-55-49 +.. nonce: cLi9G3 +.. section: Core and Builtins + +When the interpreter renders an exception, its name now has a complete +qualname. Previously only the class name was concatenated to the module +name, which sometimes resulted in an incorrect full name being displayed. + +(This issue impacted only the C code exception rendering, the +:mod:`traceback` module was using qualname already). + +.. + +.. bpo: 34561 +.. date: 2021-09-01-19-21-48 +.. nonce: uMAVA- +.. section: Core and Builtins + +List sorting now uses the merge-ordering strategy from Munro and Wild's +``powersort()``. Unlike the former strategy, this is provably near-optimal +in the entropy of the distribution of run lengths. Most uses of +``list.sort()`` probably won't see a significant time difference, but may +see significant improvements in cases where the former strategy was +exceptionally poor. However, as these are all fast linear-time +approximations to a problem that's inherently at best quadratic-time to +solve truly optimally, it's also possible to contrive cases where the former +strategy did better. + +.. + +.. bpo: 45056 +.. date: 2021-09-01-16-55-43 +.. nonce: 7AK2d9 +.. section: Core and Builtins + +Compiler now removes trailing unused constants from co_consts. + +.. + +.. bpo: 45020 +.. date: 2021-08-31-17-44-51 +.. nonce: ZPI_3L +.. section: Core and Builtins + +Add a new command line option, "-X frozen_modules=[on|off]" to opt out of +(or into) using optional frozen modules. This defaults to "on" (or "off" if +it's a debug build). + +.. + +.. bpo: 45012 +.. date: 2021-08-31-11-09-52 +.. nonce: ueeOcx +.. section: Core and Builtins + +In :mod:`posix`, release GIL during ``stat()``, ``lstat()``, and +``fstatat()`` syscalls made by :func:`os.DirEntry.stat`. Patch by Stanisław +Skonieczny. + +.. + +.. bpo: 45018 +.. date: 2021-08-26-18-44-03 +.. nonce: pu8H9L +.. section: Core and Builtins + +Fixed pickling of range iterators that iterated for over ``2**32`` times. + +.. + +.. bpo: 45000 +.. date: 2021-08-25-23-17-32 +.. nonce: XjmyLl +.. section: Core and Builtins + +A :exc:`SyntaxError` is now raised when trying to delete :const:`__debug__`. +Patch by Dong-hee Na. + +.. + +.. bpo: 44963 +.. date: 2021-08-25-23-07-10 +.. nonce: 5EET8y +.. section: Core and Builtins + +Implement ``send()`` and ``throw()`` methods for ``anext_awaitable`` +objects. Patch by Pablo Galindo. + +.. + +.. bpo: 44962 +.. date: 2021-08-23-19-55-08 +.. nonce: J00ftt +.. section: Core and Builtins + +Fix a race in WeakKeyDictionary, WeakValueDictionary and WeakSet when two +threads attempt to commit the last pending removal. This fixes +asyncio.create_task and fixes a data loss in asyncio.run where +shutdown_asyncgens is not run + +.. + +.. bpo: 24234 +.. date: 2021-08-23-10-36-55 +.. nonce: MGVUQi +.. section: Core and Builtins + +Implement the :meth:`__bytes__` special method on the :class:`bytes` type, +so a bytes object ``b`` passes an ``isinstance(b, typing.SupportsBytes)`` +check. + +.. + +.. bpo: 24234 +.. date: 2021-08-22-12-28-50 +.. nonce: n3oTdx +.. section: Core and Builtins + +Implement the :meth:`__complex__` special method on the :class:`complex` +type, so a complex number ``z`` passes an ``isinstance(z, +typing.SupportsComplex)`` check. + +.. + +.. bpo: 44954 +.. date: 2021-08-19-14-43-24 +.. nonce: dLn3lg +.. section: Core and Builtins + +Fixed a corner case bug where the result of ``float.fromhex('0x.8p-1074')`` +was rounded the wrong way. + +.. + +.. bpo: 44947 +.. date: 2021-08-18-19-09-28 +.. nonce: mcvGdS +.. section: Core and Builtins + +Refine the syntax error for trailing commas in import statements. Patch by +Pablo Galindo. + +.. + +.. bpo: 44945 +.. date: 2021-08-18-11-14-38 +.. nonce: CO3s77 +.. section: Core and Builtins + +Specialize the BINARY_ADD instruction using the PEP 659 machinery. Adds five +new instructions: + +* BINARY_ADD_ADAPTIVE +* BINARY_ADD_FLOAT +* BINARY_ADD_INT +* BINARY_ADD_UNICODE +* BINARY_ADD_UNICODE_INPLACE_FAST + +.. + +.. bpo: 44929 +.. date: 2021-08-16-23-16-17 +.. nonce: qpMEky +.. section: Core and Builtins + +Fix some edge cases of ``enum.Flag`` string representation in the REPL. +Patch by Pablo Galindo. + +.. + +.. bpo: 44914 +.. date: 2021-08-16-11-36-02 +.. nonce: 6Lgrx3 +.. section: Core and Builtins + +Class version tags are no longer recycled. + +This means that a version tag serves as a unique identifier for the state of +a class. We rely on this for effective specialization of the LOAD_ATTR and +other instructions. + +.. + +.. bpo: 44698 +.. date: 2021-08-15-10-39-06 +.. nonce: lITKNc +.. section: Core and Builtins + +Restore behaviour of complex exponentiation with integer-valued exponent of +type :class:`float` or :class:`complex`. + +.. + +.. bpo: 44895 +.. date: 2021-08-14-20-13-21 +.. nonce: Ic9m90 +.. section: Core and Builtins + +A debug variable :envvar:`PYTHONDUMPREFSFILE` is added for creating a dump +file which is generated by :option:`--with-trace-refs`. Patch by Dong-hee +Na. + +.. + +.. bpo: 44900 +.. date: 2021-08-12-14-00-57 +.. nonce: w2gpwy +.. section: Core and Builtins + +Add five superinstructions for PEP 659 quickening: + +* LOAD_FAST LOAD_FAST +* STORE_FAST LOAD_FAST +* LOAD_FAST LOAD_CONST +* LOAD_CONST LOAD_FAST +* STORE_FAST STORE_FAST + +.. + +.. bpo: 44889 +.. date: 2021-08-11-20-45-02 +.. nonce: 2T3nTn +.. section: Core and Builtins + +Initial implementation of adaptive specialization of ``LOAD_METHOD``. The +following specialized forms were added: + +* ``LOAD_METHOD_CACHED`` + +* ``LOAD_METHOD_MODULE`` + +* ``LOAD_METHOD_CLASS`` + +.. + +.. bpo: 44890 +.. date: 2021-08-11-16-46-27 +.. nonce: PwNg8N +.. section: Core and Builtins + +Specialization stats are always collected in debug builds. + +.. + +.. bpo: 44885 +.. date: 2021-08-11-15-39-57 +.. nonce: i4noUO +.. section: Core and Builtins + +Correct the ast locations of f-strings with format specs and repeated +expressions. Patch by Pablo Galindo + +.. + +.. bpo: 44878 +.. date: 2021-08-11-14-12-41 +.. nonce: pAbBfc +.. section: Core and Builtins + +Remove the loop from the bytecode interpreter. All instructions end with a +DISPATCH macro, so the loop is now redundant. + +.. + +.. bpo: 44878 +.. date: 2021-08-11-12-03-52 +.. nonce: nEhjLi +.. section: Core and Builtins + +Remove switch statement for interpreter loop when using computed gotos. This +makes sure that we only have one dispatch table in the interpreter. + +.. + +.. bpo: 44874 +.. date: 2021-08-09-19-05-20 +.. nonce: oOcfU4 +.. section: Core and Builtins + +Deprecate the old trashcan macros +(``Py_TRASHCAN_SAFE_BEGIN``/``Py_TRASHCAN_SAFE_END``). They should be +replaced by the new macros ``Py_TRASHCAN_BEGIN`` and ``Py_TRASHCAN_END``. + +.. + +.. bpo: 44872 +.. date: 2021-08-09-16-16-03 +.. nonce: OKRlhK +.. section: Core and Builtins + +Use new trashcan macros (Py_TRASHCAN_BEGIN/END) in frameobject.c instead of +the old ones (Py_TRASHCAN_SAFE_BEGIN/END). + +.. + +.. bpo: 33930 +.. date: 2021-08-09-14-29-52 +.. nonce: --5LQ- +.. section: Core and Builtins + +Fix segmentation fault with deep recursion when cleaning method objects. +Patch by Augusto Goulart and Pablo Galindo. + +.. + +.. bpo: 25782 +.. date: 2021-08-07-21-39-19 +.. nonce: B22lMx +.. section: Core and Builtins + +Fix bug where ``PyErr_SetObject`` hangs when the current exception has a +cycle in its context chain. + +.. + +.. bpo: 44856 +.. date: 2021-08-07-01-26-12 +.. nonce: 9rk3li +.. section: Core and Builtins + +Fix reference leaks in the error paths of ``update_bases()`` and +``__build_class__``. Patch by Pablo Galindo. + +.. + +.. bpo: 44826 +.. date: 2021-08-05-17-49-55 +.. nonce: zQsyK5 +.. section: Core and Builtins + +Initial implementation of adaptive specialization of STORE_ATTR + +Three specialized forms of STORE_ATTR are added: + +* STORE_ATTR_SLOT + +* STORE_ATTR_SPLIT_KEYS + +* STORE_ATTR_WITH_HINT + +.. + +.. bpo: 44838 +.. date: 2021-08-05-17-42-03 +.. nonce: r_Lkj_ +.. section: Core and Builtins + +Fixed a bug that was causing the parser to raise an incorrect custom +:exc:`SyntaxError` for invalid 'if' expressions. Patch by Pablo Galindo. + +.. + +.. bpo: 44821 +.. date: 2021-08-04-11-37-38 +.. nonce: 67YHGI +.. section: Core and Builtins + +Create instance dictionaries (__dict__) eagerly, to improve regularity of +object layout and assist specialization. + +.. + +.. bpo: 44792 +.. date: 2021-07-31-12-12-57 +.. nonce: mOReTW +.. section: Core and Builtins + +Improve syntax errors for if expressions. Patch by Miguel Brito + +.. + +.. bpo: 34013 +.. date: 2021-07-27-11-14-22 +.. nonce: SjLFe- +.. section: Core and Builtins + +Generalize the invalid legacy statement custom error message (like the one +generated when "print" is called without parentheses) to include more +generic expressions. Patch by Pablo Galindo + +.. + +.. bpo: 44732 +.. date: 2021-07-26-15-27-03 +.. nonce: IxObt3 +.. section: Core and Builtins + +Rename ``types.Union`` to ``types.UnionType``. + +.. + +.. bpo: 44725 +.. date: 2021-07-23-15-17-01 +.. nonce: qcuKaa +.. section: Core and Builtins + +Expose specialization stats in python via +:func:`_opcode.get_specialization_stats`. + +.. + +.. bpo: 44717 +.. date: 2021-07-23-01-52-13 +.. nonce: -vVmAh +.. section: Core and Builtins + +Improve AttributeError on circular imports of submodules. + +.. + +.. bpo: 44698 +.. date: 2021-07-21-15-26-56 +.. nonce: DA4_0o +.. section: Core and Builtins + +Fix undefined behaviour in complex object exponentiation. + +.. + +.. bpo: 44653 +.. date: 2021-07-19-20-49-06 +.. nonce: WcqGyI +.. section: Core and Builtins + +Support :mod:`typing` types in parameter substitution in the union type. + +.. + +.. bpo: 44676 +.. date: 2021-07-19-19-53-46 +.. nonce: WgIMvh +.. section: Core and Builtins + +Add ability to serialise ``types.Union`` objects. Patch provided by Yurii +Karabas. + +.. + +.. bpo: 44633 +.. date: 2021-07-17-21-04-04 +.. nonce: 5-zKeI +.. section: Core and Builtins + +Parameter substitution of the union type with wrong types now raises +``TypeError`` instead of returning ``NotImplemented``. + +.. + +.. bpo: 44661 +.. date: 2021-07-17-14-20-59 +.. nonce: BQbXiH +.. section: Core and Builtins + +Update ``property_descr_set`` to use vectorcall if possible. Patch by +Dong-hee Na. + +.. + +.. bpo: 44662 +.. date: 2021-07-17-13-41-58 +.. nonce: q22kWR +.. section: Core and Builtins + +Add ``__module__`` to ``types.Union``. This also fixes ``types.Union`` +issues with ``typing.Annotated``. Patch provided by Yurii Karabas. + +.. + +.. bpo: 44655 +.. date: 2021-07-16-21-35-14 +.. nonce: 95I7M6 +.. section: Core and Builtins + +Include the name of the type in unset __slots__ attribute errors. Patch by +Pablo Galindo + +.. + +.. bpo: 44655 +.. date: 2021-07-16-20-25-37 +.. nonce: I3wRjL +.. section: Core and Builtins + +Don't include a missing attribute with the same name as the failing one when +offering suggestions for missing attributes. Patch by Pablo Galindo + +.. + +.. bpo: 44646 +.. date: 2021-07-16-09-59-13 +.. nonce: Yb6s05 +.. section: Core and Builtins + +Fix the hash of the union type: it no longer depends on the order of +arguments. + +.. + +.. bpo: 44636 +.. date: 2021-07-16-09-36-12 +.. nonce: ZWebi8 +.. section: Core and Builtins + +Collapse union of equal types. E.g. the result of ``int | int`` is now +``int``. Fix comparison of the union type with non-hashable objects. E.g. +``int | str == {}`` no longer raises a TypeError. + +.. + +.. bpo: 44611 +.. date: 2021-07-16-01-01-11 +.. nonce: LcfHN- +.. section: Core and Builtins + +On Windows, :func:`os.urandom`: uses BCryptGenRandom API instead of +CryptGenRandom API which is deprecated from Microsoft Windows API. Patch by +Dong-hee Na. + +.. + +.. bpo: 44635 +.. date: 2021-07-14-13-54-07 +.. nonce: 7ZMAdB +.. section: Core and Builtins + +Convert ``None`` to ``type(None)`` in the union type constructor. + +.. + +.. bpo: 26280 +.. date: 2021-07-14-10-31-10 +.. nonce: cgpM4B +.. section: Core and Builtins + +Implement adaptive specialization for BINARY_SUBSCR + +Three specialized forms of BINARY_SUBSCR are added: + +* BINARY_SUBSCR_LIST_INT + +* BINARY_SUBSCR_TUPLE_INT + +* BINARY_SUBSCR_DICT + +.. + +.. bpo: 44589 +.. date: 2021-07-13-23-19-41 +.. nonce: 59OH8T +.. section: Core and Builtins + +Mapping patterns in ``match`` statements with two or more equal literal keys +will now raise a :exc:`SyntaxError` at compile-time. + +.. + +.. bpo: 44606 +.. date: 2021-07-13-20-22-12 +.. nonce: S3Bv2w +.. section: Core and Builtins + +Fix ``__instancecheck__`` and ``__subclasscheck__`` for the union type. + +.. + +.. bpo: 42073 +.. date: 2021-07-13-17-47-32 +.. nonce: 9wopiC +.. section: Core and Builtins + +The ``@classmethod`` decorator can now wrap other classmethod-like +descriptors. + +.. + +.. bpo: 41972 +.. date: 2021-07-12-04-06-57 +.. nonce: nDX5k_ +.. section: Core and Builtins + +Tuned the string-searching algorithm of fastsearch.h to have a shorter inner +loop for most cases. + +.. + +.. bpo: 44590 +.. date: 2021-07-09-12-08-17 +.. nonce: a2ntVX +.. section: Core and Builtins + +All necessary data for executing a Python function (local variables, stack, +etc) is now kept in a per-thread stack. Frame objects are lazily allocated +on demand. This increases performance by about 7% on the standard benchmark +suite. Introspection and debugging are unaffected as frame objects are +always available when needed. Patch by Mark Shannon. + +.. + +.. bpo: 44584 +.. date: 2021-07-08-12-18-56 +.. nonce: qKnSqV +.. section: Core and Builtins + +The threading debug (:envvar:`PYTHONTHREADDEBUG` environment variable) is +deprecated in Python 3.10 and will be removed in Python 3.12. This feature +requires a debug build of Python. Patch by Victor Stinner. + +.. + +.. bpo: 43895 +.. date: 2021-07-07-16-05-35 +.. nonce: JFjR0- +.. section: Core and Builtins + +An obsolete internal cache of shared object file handles added in 1995 that +attempted, but did not guarantee, that a .so would not be dlopen'ed twice to +work around flaws in mid-1990s posix-ish operating systems has been removed +from dynload_shlib.c. + +.. + +.. bpo: 44490 +.. date: 2021-07-06-22-22-15 +.. nonce: BJxPbZ +.. section: Core and Builtins + +:mod:`typing` now searches for type parameters in ``types.Union`` objects. +``get_type_hints`` will also properly resolve annotations with nested +``types.Union`` objects. Patch provided by Yurii Karabas. + +.. + +.. bpo: 43950 +.. date: 2021-07-06-15-27-11 +.. nonce: LhL2-q +.. section: Core and Builtins + +Code objects can now provide the column information for instructions when +available. This is levaraged during traceback printing to show the +expressions responsible for errors. + +Contributed by Pablo Galindo, Batuhan Taskaya and Ammar Askar as part of +:pep:`657`. + +.. + +.. bpo: 44562 +.. date: 2021-07-04-23-38-51 +.. nonce: QdeRQo +.. section: Core and Builtins + +Remove uses of :c:func:`PyObject_GC_Del` in error path when initializing +:class:`types.GenericAlias`. + +.. + +.. bpo: 41486 +.. date: 2021-07-04-17-41-47 +.. nonce: DiM24a +.. section: Core and Builtins + +Fix a memory consumption and copying performance regression in earlier 3.10 +beta releases if someone used an output buffer larger than 4GiB with +zlib.decompress on input data that expands that large. + +.. + +.. bpo: 43908 +.. date: 2021-07-03-00-20-39 +.. nonce: YHuV_s +.. section: Core and Builtins + +Heap types with the :const:`Py_TPFLAGS_IMMUTABLETYPE` flag can now inherit +the :pep:`590` vectorcall protocol. Previously, this was only possible for +:ref:`static types `. Patch by Erlend E. Aasland. + +.. + +.. bpo: 44553 +.. date: 2021-07-02-22-54-41 +.. nonce: l9YqGg +.. section: Core and Builtins + +Implement GC methods for ``types.Union`` to break reference cycles and +prevent memory leaks. + +.. + +.. bpo: 44490 +.. date: 2021-07-01-11-59-34 +.. nonce: xY80VR +.. section: Core and Builtins + +Add ``__parameters__`` attribute and ``__getitem__`` operator to +``types.Union``. Patch provided by Yurii Karabas. + +.. + +.. bpo: 44523 +.. date: 2021-06-29-11-49-29 +.. nonce: 67-ZIP +.. section: Core and Builtins + +Remove the pass-through for :func:`hash` of :class:`weakref.proxy` objects +to prevent unintended consequences when the original referred object dies +while the proxy is part of a hashable object. Patch by Pablo Galindo. + +.. + +.. bpo: 44483 +.. date: 2021-06-22-19-08-19 +.. nonce: eq2f7T +.. section: Core and Builtins + +Fix a crash in ``types.Union`` objects when creating a union of an object +with bad ``__module__`` field. + +.. + +.. bpo: 44486 +.. date: 2021-06-22-10-55-23 +.. nonce: wct-9X +.. section: Core and Builtins + +Modules will always have a dictionary, even when created by +``types.ModuleType.__new__()`` + +.. + +.. bpo: 44472 +.. date: 2021-06-21-11-19-54 +.. nonce: Vvm1yn +.. section: Core and Builtins + +Fix ltrace functionality when exceptions are raised. Patch by Pablo Galindo + +.. + +.. bpo: 12022 +.. date: 2021-06-20-10-53-21 +.. nonce: SW240M +.. section: Core and Builtins + +A :exc:`TypeError` is now raised instead of an :exc:`AttributeError` in +:keyword:`with` and :keyword:`async with` statements for objects which do +not support the :term:`context manager` or :term:`asynchronous context +manager` protocols correspondingly. + +.. + +.. bpo: 44297 +.. date: 2021-06-19-12-41-13 +.. nonce: F53vHj +.. section: Core and Builtins + +Make sure that the line number is set when entering a comprehension scope. +Ensures that backtraces inclusing generator expressions show the correct +line number. + +.. + +.. bpo: 44456 +.. date: 2021-06-18-22-08-25 +.. nonce: L0Rhko +.. section: Core and Builtins + +Improve the syntax error when mixing positional and keyword patterns. Patch +by Pablo Galindo. + +.. + +.. bpo: 44409 +.. date: 2021-06-13-23-12-18 +.. nonce: eW4LS- +.. section: Core and Builtins + +Fix error location information for tokenizer errors raised on initialization +of the tokenizer. Patch by Pablo Galindo. + +.. + +.. bpo: 44396 +.. date: 2021-06-11-18-17-42 +.. nonce: Z9EKim +.. section: Core and Builtins + +Fix a possible crash in the tokenizer when raising syntax errors for +unclosed strings. Patch by Pablo Galindo. + +.. + +.. bpo: 44376 +.. date: 2021-06-11-17-37-15 +.. nonce: zhM1UW +.. section: Core and Builtins + +Exact integer exponentiation (like ``i**2`` or ``pow(i, 2)``) with a small +exponent is much faster, due to reducing overhead in such cases. + +.. + +.. bpo: 44313 +.. date: 2021-06-10-16-10-39 +.. nonce: 34RjI8 +.. section: Core and Builtins + +Directly imported objects and modules (through import and from import +statements) don't generate ``LOAD_METHOD``/``CALL_METHOD`` for directly +accessed objects on their namespace. They now use the regular +``LOAD_ATTR``/``CALL_FUNCTION``. + +.. + +.. bpo: 44338 +.. date: 2021-06-10-10-06-18 +.. nonce: c4Myr4 +.. section: Core and Builtins + +Implement adaptive specialization for LOAD_GLOBAL + +Two specialized forms of LOAD_GLOBAL are added: + +* LOAD_GLOBAL_MODULE + +* LOAD_GLOBAL_BUILTIN + +.. + +.. bpo: 44368 +.. date: 2021-06-09-22-56-59 +.. nonce: vgT0Cx +.. section: Core and Builtins + +Improve syntax errors for invalid "as" targets. Patch by Pablo Galindo + +.. + +.. bpo: 44349 +.. date: 2021-06-08-22-49-06 +.. nonce: xgEgeA +.. section: Core and Builtins + +Fix an edge case when displaying text from files with encoding in syntax +errors. Patch by Pablo Galindo. + +.. + +.. bpo: 44337 +.. date: 2021-06-08-10-22-46 +.. nonce: RTjmIt +.. section: Core and Builtins + +Initial implementation of adaptive specialization of LOAD_ATTR + +Four specialized forms of LOAD_ATTR are added: + +* LOAD_ATTR_SLOT + +* LOAD_ATTR_SPLIT_KEYS + +* LOAD_ATTR_WITH_HINT + +* LOAD_ATTR_MODULE + +.. + +.. bpo: 44335 +.. date: 2021-06-08-01-13-47 +.. nonce: GQTTkl +.. section: Core and Builtins + +Fix a regression when identifying incorrect characters in syntax errors. +Patch by Pablo Galindo + +.. + +.. bpo: 43693 +.. date: 2021-06-07-15-13-44 +.. nonce: c_zDeY +.. section: Core and Builtins + +Computation of the offsets of cell variables is done in the compiler instead +of at runtime. This reduces the overhead of handling cell and free +variables, especially in the case where a variable is both an argument and +cell variable. + +.. + +.. bpo: 44317 +.. date: 2021-06-06-00-29-14 +.. nonce: xPPhcZ +.. section: Core and Builtins + +Improve tokenizer error with improved locations. Patch by Pablo Galindo. + +.. + +.. bpo: 44304 +.. date: 2021-06-05-02-34-57 +.. nonce: _MAoPc +.. section: Core and Builtins + +Fix a crash in the :mod:`sqlite3` module that happened when the garbage +collector clears :class:`sqlite.Statement` objects. Patch by Pablo Galindo + +.. + +.. bpo: 44305 +.. date: 2021-06-03-22-51-50 +.. nonce: 66dVDG +.. section: Core and Builtins + +Improve error message for ``try`` blocks without ``except`` or ``finally`` +blocks. Patch by Pablo Galindo. + +.. + +.. bpo: 43413 +.. date: 2021-05-30-16-37-47 +.. nonce: vYFPPC +.. section: Core and Builtins + +Constructors of subclasses of some buitin classes (e.g. :class:`tuple`, +:class:`list`, :class:`frozenset`) no longer accept arbitrary keyword +arguments. Subclass of :class:`set` can now define a ``__new__()`` method +with additional keyword parameters without overriding also ``__init__()``. + +.. + +.. bpo: 43667 +.. date: 2021-05-27-17-34-29 +.. nonce: ND9jP3 +.. section: Core and Builtins + +Improve Unicode support in non-UTF locales on Oracle Solaris. This issue +does not affect other Solaris systems. + +.. + +.. bpo: 43693 +.. date: 2021-05-26-19-10-47 +.. nonce: 1KSG9u +.. section: Core and Builtins + +A new opcode MAKE_CELL has been added that effectively moves some of the +work done on function entry into the compiler and into the eval loop. In +addition to creating the required cell objects, the new opcode converts +relevant arguments (and other locals) to cell variables on function entry. + +.. + +.. bpo: 44232 +.. date: 2021-05-25-18-20-10 +.. nonce: DMcCCf +.. section: Core and Builtins + +Fix a regression in :func:`type` when a metaclass raises an exception. The C +function :c:func:`type_new` must properly report the exception when a +metaclass constructor raises an exception and the winner class is not the +metaclass. Patch by Victor Stinner. + +.. + +.. bpo: 44201 +.. date: 2021-05-21-21-16-03 +.. nonce: bGaSjt +.. section: Core and Builtins + +Avoid side effects of checking for specialized syntax errors in the REPL +that was causing it to ask for extra tokens after a syntax error had been +detected. Patch by Pablo Galindo + +.. + +.. bpo: 43693 +.. date: 2021-05-21-20-53-49 +.. nonce: -NN3J_ +.. section: Core and Builtins + +``PyCodeObject`` gained ``co_fastlocalnames`` and ``co_fastlocalkinds`` as +the the authoritative source of fast locals info. Marshaled code objects +have changed accordingly. + +.. + +.. bpo: 44184 +.. date: 2021-05-21-01-42-45 +.. nonce: 9qOptC +.. section: Core and Builtins + +Fix a crash at Python exit when a deallocator function removes the last +strong reference to a heap type. Patch by Victor Stinner. + +.. + +.. bpo: 44187 +.. date: 2021-05-20-12-43-04 +.. nonce: 3lk0L1 +.. section: Core and Builtins + +Implement quickening in the interpreter. This offers no advantages as yet, +but is an enabler of future optimizations. See PEP 659 for full explanation. + +.. + +.. bpo: 44180 +.. date: 2021-05-19-20-33-36 +.. nonce: mQVaAs +.. section: Core and Builtins + +The parser doesn't report generic syntax errors that happen in a position +further away that the one it reached in the first pass. Patch by Pablo +Galindo + +.. + +.. bpo: 44168 +.. date: 2021-05-18-11-27-02 +.. nonce: mgB-rt +.. section: Core and Builtins + +Fix error message in the parser involving keyword arguments with invalid +expressions. Patch by Pablo Galindo + +.. + +.. bpo: 44156 +.. date: 2021-05-17-20-44-45 +.. nonce: 8KSp9l +.. section: Core and Builtins + +String caches in ``compile.c`` are now subinterpreter compatible. + +.. + +.. bpo: 44143 +.. date: 2021-05-15-17-30-57 +.. nonce: 7UTS6H +.. section: Core and Builtins + +Fixed a crash in the parser that manifest when raising tokenizer errors when +an existing exception was present. Patch by Pablo Galindo. + +.. + +.. bpo: 44032 +.. date: 2021-05-14-20-03-32 +.. nonce: OzT1ob +.. section: Core and Builtins + +Move 'fast' locals and other variables from the frame object to a per-thread +datastack. + +.. + +.. bpo: 44114 +.. date: 2021-05-12-14-26-16 +.. nonce: p-WfAE +.. section: Core and Builtins + +Fix incorrect dictkeys_reversed and dictitems_reversed function signatures +in C code, which broke webassembly builds. + +.. + +.. bpo: 44110 +.. date: 2021-05-11-21-52-44 +.. nonce: VqbAsB +.. section: Core and Builtins + +Improve :func:`str.__getitem__` error message + +.. + +.. bpo: 26110 +.. date: 2021-05-10-18-49-13 +.. nonce: EQzqqA +.. section: Core and Builtins + +Add ``CALL_METHOD_KW`` opcode to speed up method calls with keyword +arguments. Idea originated from PyPy. A side effect is executing +``CALL_METHOD`` is now branchless in the evaluation loop. + +.. + +.. bpo: 28307 +.. date: 2021-05-08-19-54-57 +.. nonce: 7ysaVW +.. section: Core and Builtins + +Compiler now optimizes simple C-style formatting with literal format +containing only format codes %s, %r and %a by converting them to f-string +expressions. + +.. + +.. bpo: 43149 +.. date: 2021-05-08-17-18-37 +.. nonce: Kp5FxD +.. section: Core and Builtins + +Corrent the syntax error message regarding multiple exception types to not +refer to "exception groups". Patch by Pablo Galindo + +.. + +.. bpo: 43822 +.. date: 2021-05-04-01-01-04 +.. nonce: 9VeCg0 +.. section: Core and Builtins + +The parser will prioritize tokenizer errors over custom syntax errors when +raising exceptions. Patch by Pablo Galindo. + +.. + +.. bpo: 40222 +.. date: 2021-04-30-15-48-36 +.. nonce: j3VxeX +.. section: Core and Builtins + +"Zero cost" exception handling. + +* Uses a lookup table to determine how to handle exceptions. +* Removes SETUP_FINALLY and POP_TOP block instructions, eliminating the runtime overhead of try statements. +* Reduces the size of the frame object by about 60%. + +Patch by Mark Shannon + +.. + +.. bpo: 43918 +.. date: 2021-04-23-03-46-45 +.. nonce: nNDY3S +.. section: Core and Builtins + +Document the signature and ``default`` argument in the docstring of the new +``anext`` builtin. + +.. + +.. bpo: 43833 +.. date: 2021-04-18-18-07-33 +.. nonce: oChkCi +.. section: Core and Builtins + +Emit a deprecation warning if the numeric literal is immediately followed by +one of keywords: and, else, for, if, in, is, or. Raise a syntax error with +more informative message if it is immediately followed by other keyword or +identifier. + +.. + +.. bpo: 43879 +.. date: 2021-04-17-16-08-00 +.. nonce: zkyJgh +.. section: Core and Builtins + +Add native_thread_id to PyThreadState. Patch by Gabriele N. Tornetta. + +.. + +.. bpo: 43693 +.. date: 2021-04-02-15-02-16 +.. nonce: l3Ureu +.. section: Core and Builtins + +Compute cell offsets relative to locals in compiler. Allows the interpreter +to treats locals and cells a single array, which is slightly more efficient. +Also make the LOAD_CLOSURE opcode an alias for LOAD_FAST. Preserving +LOAD_CLOSURE helps keep bytecode a bit more readable. + +.. + +.. bpo: 17792 +.. date: 2021-03-22-17-50-30 +.. nonce: _zssjS +.. section: Core and Builtins + +More accurate error messages for access of unbound locals or free vars. + +.. + +.. bpo: 28146 +.. date: 2021-01-13-19-34-41 +.. nonce: AZBBkH +.. section: Core and Builtins + +Fix a confusing error message in :func:`str.format`. + +.. + +.. bpo: 11105 +.. date: 2020-06-02-13-21-14 +.. nonce: wceryW +.. section: Core and Builtins + +When compiling :class:`ast.AST` objects with recursive references through +:func:`compile`, the interpreter doesn't crash anymore instead it raises a +:exc:`RecursionError`. + +.. + +.. bpo: 39091 +.. date: 2019-12-21-14-18-32 +.. nonce: dOexgQ +.. section: Core and Builtins + +Fix crash when using passing a non-exception to a generator's ``throw()`` +method. Patch by Noah Oxer + +.. + +.. bpo: 33346 +.. date: 2018-05-11-12-44-03 +.. nonce: ZgBkvB +.. section: Core and Builtins + +Asynchronous comprehensions are now allowed inside comprehensions in +asynchronous functions. Outer comprehensions implicitly become +asynchronous. + +.. + +.. bpo: 45371 +.. date: 2021-10-05-11-03-48 +.. nonce: NOwcDJ +.. section: Library + +Fix clang rpath issue in :mod:`distutils`. The UnixCCompiler now uses +correct clang option to add a runtime library directory (rpath) to a shared +library. + +.. + +.. bpo: 45329 +.. date: 2021-10-01-13-09-53 +.. nonce: 9iMYaO +.. section: Library + +Fix freed memory access in :class:`pyexpat.xmlparser` when building it with +an installed expat library <= 2.2.0. + +.. + +.. bpo: 41710 +.. date: 2021-09-30-23-00-18 +.. nonce: svuloZ +.. section: Library + +On Unix, if the ``sem_clockwait()`` function is available in the C library +(glibc 2.30 and newer), the :meth:`threading.Lock.acquire` method now uses +the monotonic clock (:data:`time.CLOCK_MONOTONIC`) for the timeout, rather +than using the system clock (:data:`time.CLOCK_REALTIME`), to not be +affected by system clock changes. Patch by Victor Stinner. + +.. + +.. bpo: 1596321 +.. date: 2021-09-24-17-20-23 +.. nonce: 3nhPUk +.. section: Library + +Fix the :func:`threading._shutdown` function when the :mod:`threading` +module was imported first from a thread different than the main thread: no +longer log an error at Python exit. + +.. + +.. bpo: 45274 +.. date: 2021-09-23-22-17-26 +.. nonce: gPpa4E +.. section: Library + +Fix a race condition in the :meth:`Thread.join() ` +method of the :mod:`threading` module. If the function is interrupted by a +signal and the signal handler raises an exception, make sure that the thread +remains in a consistent state to prevent a deadlock. Patch by Victor +Stinner. + +.. + +.. bpo: 21302 +.. date: 2021-09-22-23-56-15 +.. nonce: vvQ3Su +.. section: Library + +In Unix operating systems, :func:`time.sleep` now uses the ``nanosleep()`` +function, if ``clock_nanosleep()`` is not available but ``nanosleep()`` is +available. ``nanosleep()`` allows to sleep with nanosecond precision. + +.. + +.. bpo: 21302 +.. date: 2021-09-20-22-46-40 +.. nonce: h56430 +.. section: Library + +On Windows, :func:`time.sleep` now uses a waitable timer which has a +resolution of 100 nanoseconds (10\ :sup:`-7` seconds). Previously, it had a +resolution of 1 millisecond (10\ :sup:`-3` seconds). Patch by Livius and +Victor Stinner. + +.. + +.. bpo: 45238 +.. date: 2021-09-18-16-56-33 +.. nonce: Hng_9V +.. section: Library + +Fix :meth:`unittest.IsolatedAsyncioTestCase.debug`: it runs now asynchronous +methods and callbacks. + +.. + +.. bpo: 36674 +.. date: 2021-09-18-13-14-57 +.. nonce: a2k5Zb +.. section: Library + +:meth:`unittest.TestCase.debug` raises now a :class:`unittest.SkipTest` if +the class or the test method are decorated with the skipping decorator. + +.. + +.. bpo: 45235 +.. date: 2021-09-17-16-55-37 +.. nonce: sXnmPA +.. section: Library + +Fix an issue where argparse would not preserve values in a provided +namespace when using a subparser with defaults. + +.. + +.. bpo: 45183 +.. date: 2021-09-17-15-58-53 +.. nonce: Vv_vch +.. section: Library + +Have zipimport.zipimporter.find_spec() not raise an exception when the +underlying zip file has been deleted and the internal cache has been reset +via invalidate_cache(). + +.. + +.. bpo: 45234 +.. date: 2021-09-17-11-20-55 +.. nonce: qUcTVt +.. section: Library + +Fixed a regression in :func:`~shutil.copyfile`, :func:`~shutil.copy`, +:func:`~shutil.copy2` raising :exc:`FileNotFoundError` when source is a +directory, which should raise :exc:`IsADirectoryError` + +.. + +.. bpo: 45228 +.. date: 2021-09-17-09-59-33 +.. nonce: WV1dcT +.. section: Library + +Fix stack buffer overflow in parsing J1939 network address. + +.. + +.. bpo: 45225 +.. date: 2021-09-16-19-02-14 +.. nonce: xmKV4i +.. section: Library + +use map function instead of genexpr in capwords. + +.. + +.. bpo: 42135 +.. date: 2021-09-13-19-32-58 +.. nonce: 1ZAHqR +.. section: Library + +Fix typo: ``importlib.find_loader`` is really slated for removal in Python +3.12 not 3.10, like the others in GH-25169. + +Patch by Hugo van Kemenade. + +.. + +.. bpo: 20524 +.. date: 2021-09-13-14-59-01 +.. nonce: PMQ1Fh +.. section: Library + +Improves error messages on ``.format()`` operation for ``str``, ``float``, +``int``, and ``complex``. New format now shows the problematic pattern and +the object type. + +.. + +.. bpo: 45168 +.. date: 2021-09-13-14-28-49 +.. nonce: Z1mfW4 +.. section: Library + +Change :func:`dis.dis` output to omit op arg values that cannot be resolved +due to ``co_consts``, ``co_names`` etc not being provided. Previously the +oparg itself was repeated in the value field, which is not useful and can be +confusing. + +.. + +.. bpo: 21302 +.. date: 2021-09-11-18-44-40 +.. nonce: QxHRpR +.. section: Library + +In Unix operating systems, :func:`time.sleep` now uses the +``clock_nanosleep()`` function, if available, which allows to sleep for an +interval specified with nanosecond precision. + +.. + +.. bpo: 45173 +.. date: 2021-09-11-17-46-20 +.. nonce: UptGAn +.. section: Library + +Remove 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. + +Patch by Hugo van Kemenade. + +.. + +.. bpo: 44987 +.. date: 2021-09-11-14-41-02 +.. nonce: Mt8DiX +.. section: Library + +Pure ASCII strings are now normalized in constant time by +:func:`unicodedata.normalize`. Patch by Dong-hee Na. + +.. + +.. bpo: 35474 +.. date: 2021-09-11-10-45-12 +.. nonce: tEY3SD +.. section: Library + +Calling :func:`mimetypes.guess_all_extensions` with ``strict=False`` no +longer affects the result of the following call with ``strict=True``. Also, +mutating the returned list no longer affects the global state. + +.. + +.. bpo: 45166 +.. date: 2021-09-10-21-35-53 +.. nonce: UHipXF +.. section: Library + +:func:`typing.get_type_hints` now works with :data:`~typing.Final` wrapped +in :class:`~typing.ForwardRef`. + +.. + +.. bpo: 45162 +.. date: 2021-09-10-13-20-53 +.. nonce: 2Jh-lq +.. section: Library + +Remove many old deprecated :mod:`unittest` features: + +* "``fail*``" and "``assert*``" aliases of :class:`~unittest.TestCase` methods. +* Broken from start :class:`~unittest.TestCase` method ``assertDictContainsSubset()``. +* Ignored :meth:` TestLoader.loadTestsFromModule` parameter *use_load_tests*. +* Old alias ``_TextTestResult`` of :class:`~unittest.TextTestResult`. + +.. + +.. bpo: 38371 +.. date: 2021-09-08-13-19-29 +.. nonce: y1kEfP +.. section: Library + +Remove the deprecated ``split()`` method of :class:`_tkinter.TkappType`. +Patch by Erlend E. Aasland. + +.. + +.. bpo: 20499 +.. date: 2021-09-08-01-19-31 +.. nonce: tSxx8Y +.. section: Library + +Improve the speed and accuracy of statistics.pvariance(). + +.. + +.. bpo: 45132 +.. date: 2021-09-07-16-33-51 +.. nonce: WI9zQY +.. section: Library + +Remove :meth:`__getitem__` methods of +:class:`xml.dom.pulldom.DOMEventStream`, :class:`wsgiref.util.FileWrapper` +and :class:`fileinput.FileInput`, deprecated since Python 3.9. + +Patch by Hugo van Kemenade. + +.. + +.. bpo: 45129 +.. date: 2021-09-07-14-27-39 +.. nonce: vXH0gw +.. section: Library + +Due to significant security concerns, the *reuse_address* parameter of +:meth:`asyncio.loop.create_datagram_endpoint`, disabled in Python 3.9, is +now entirely removed. This is because of the behavior of the socket option +``SO_REUSEADDR`` in UDP. + +Patch by Hugo van Kemenade. + +.. + +.. bpo: 45124 +.. date: 2021-09-07-09-13-27 +.. nonce: Kw5AUs +.. section: Library + +The ``bdist_msi`` command, deprecated in Python 3.9, is now removed. + +Use ``bdist_wheel`` (wheel packages) instead. + +Patch by Hugo van Kemenade. + +.. + +.. bpo: 30856 +.. date: 2021-09-05-21-37-28 +.. nonce: jj86y0 +.. section: Library + +:class:`unittest.TestResult` methods +:meth:`~unittest.TestResult.addFailure`, +:meth:`~unittest.TestResult.addError`, :meth:`~unittest.TestResult.addSkip` +and :meth:`~unittest.TestResult.addSubTest` are now called immediately after +raising an exception in test or finishing a subtest. Previously they were +called only after finishing the test clean up. + +.. + +.. bpo: 45034 +.. date: 2021-09-05-20-33-25 +.. nonce: 62NLD5 +.. section: Library + +Changes how error is formatted for ``struct.pack`` with ``'H'`` and ``'h'`` +modes and too large / small numbers. Now it shows the actual numeric limits, +while previously it was showing arithmetic expressions. + +.. + +.. bpo: 25894 +.. date: 2021-09-05-13-15-08 +.. nonce: zjbi2f +.. section: Library + +:mod:`unittest` now always reports skipped and failed subtests separately: +separate characters in default mode and separate lines in verbose mode. Also +the test description is now output for errors in test method, class and +module cleanups. + +.. + +.. bpo: 45081 +.. date: 2021-09-02-12-42-25 +.. nonce: tOjJ1k +.. section: Library + +Fix issue when dataclasses that inherit from ``typing.Protocol`` subclasses +have wrong ``__init__``. Patch provided by Yurii Karabas. + +.. + +.. bpo: 45085 +.. date: 2021-09-02-00-47-14 +.. nonce: mMnaDv +.. section: Library + +The ``binhex`` module, deprecated in Python 3.9, is now removed. The +following :mod:`binascii` functions, deprecated in Python 3.9, are now also +removed: + +* ``a2b_hqx()``, ``b2a_hqx()``; +* ``rlecode_hqx()``, ``rledecode_hqx()``. + +The :func:`binascii.crc_hqx` function remains available. + +Patch by Victor Stinner. + +.. + +.. bpo: 40360 +.. date: 2021-09-02-00-18-32 +.. nonce: 9nmMtB +.. section: Library + +The :mod:`lib2to3` package is now deprecated and may not be able to parse +Python 3.10 or newer. See the :pep:`617` (New PEG parser for CPython). Patch +by Victor Stinner. + +.. + +.. bpo: 45075 +.. date: 2021-09-01-15-27-00 +.. nonce: 9xUpvt +.. section: Library + +Rename :meth:`traceback.StackSummary.format_frame` to +:meth:`traceback.StackSummary.format_frame_summary`. This method was added +for 3.11 so it was not released yet. + +Updated code and docs to better distinguish frame and FrameSummary. + +.. + +.. bpo: 31299 +.. date: 2021-08-30-13-55-09 +.. nonce: 9QzjZs +.. section: Library + +Add option to completely drop frames from a traceback by returning ``None`` +from a :meth:`~traceback.StackSummary.format_frame` override. + +.. + +.. bpo: 41620 +.. date: 2021-08-29-14-49-22 +.. nonce: WJ6PFL +.. section: Library + +:meth:`~unittest.TestCase.run` now always return a +:class:`~unittest.TestResult` instance. Previously it returned ``None`` if +the test class or method was decorated with a skipping decorator. + +.. + +.. bpo: 45021 +.. date: 2021-08-28-13-00-12 +.. nonce: rReeaj +.. section: Library + +Fix a potential deadlock at shutdown of forked children when using +:mod:`concurrent.futures` module + +.. + +.. bpo: 43913 +.. date: 2021-08-27-23-40-51 +.. nonce: Uo1Gt5 +.. section: Library + +Fix bugs in cleaning up classes and modules in :mod:`unittest`: + +* Functions registered with :func:`~unittest.addModuleCleanup` were not called unless the user defines ``tearDownModule()`` in their test module. +* Functions registered with :meth:`~unittest.TestCase.addClassCleanup` were not called if ``tearDownClass`` is set to ``None``. +* Buffering in :class:`~unittest.TestResult` did not work with functions registered with ``addClassCleanup()`` and ``addModuleCleanup()``. +* Errors in functions registered with ``addClassCleanup()`` and ``addModuleCleanup()`` were not handled correctly in buffered and debug modes. +* Errors in ``setUpModule()`` and functions registered with ``addModuleCleanup()`` were reported in wrong order. +* And several lesser bugs. + +.. + +.. bpo: 45030 +.. date: 2021-08-27-19-01-23 +.. nonce: tAmBbY +.. section: Library + +Fix integer overflow in pickling and copying the range iterator. + +.. + +.. bpo: 45001 +.. date: 2021-08-26-16-25-48 +.. nonce: tn_dKp +.. section: Library + +Made email date parsing more robust against malformed input, namely a +whitespace-only ``Date:`` header. Patch by Wouter Bolsterlee. + +.. + +.. bpo: 45010 +.. date: 2021-08-26-09-54-14 +.. nonce: Cn23bQ +.. section: Library + +Remove support of special method ``__div__`` in :mod:`unittest.mock`. It is +not used in Python 3. + +.. + +.. bpo: 39218 +.. date: 2021-08-25-20-18-31 +.. nonce: BlO6jW +.. section: Library + +Improve accuracy of variance calculations by using ``x*x`` instead of +``x**2``. + +.. + +.. bpo: 43613 +.. date: 2021-08-25-10-28-49 +.. nonce: WkYmI0 +.. section: Library + +Improve the speed of :func:`gzip.compress` and :func:`gzip.decompress` by +compressing and decompressing at once in memory instead of in a streamed +fashion. + +.. + +.. bpo: 37596 +.. date: 2021-08-23-21-39-59 +.. nonce: ojRcwB +.. section: Library + +Ensure that :class:`set` and :class:`frozenset` objects are always +:mod:`marshalled ` reproducibly. + +.. + +.. bpo: 44019 +.. date: 2021-08-22-13-25-17 +.. nonce: BN8HDy +.. section: Library + +A new function ``operator.call`` has been added, such that +``operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)``. + +.. + +.. bpo: 42255 +.. date: 2021-08-19-23-49-10 +.. nonce: ofe3ms +.. section: Library + +:class:`webbrowser.MacOSX` is deprecated and will be removed in Python 3.13. +It is untested and undocumented and also not used by webbrowser itself. +Patch by Dong-hee Na. + +.. + +.. bpo: 44955 +.. date: 2021-08-19-15-03-54 +.. nonce: 1mxFQS +.. section: Library + +Method :meth:`~unittest.TestResult.stopTestRun` is now always called in pair +with method :meth:`~unittest.TestResult.startTestRun` for +:class:`~unittest.TestResult` objects implicitly created in +:meth:`~unittest.TestCase.run`. Previously it was not called for test +methods and classes decorated with a skipping decorator. + +.. + +.. bpo: 39039 +.. date: 2021-08-18-10-36-14 +.. nonce: A63LYh +.. section: Library + +tarfile.open raises :exc:`~tarfile.ReadError` when a zlib error occurs +during file extraction. + +.. + +.. bpo: 44935 +.. date: 2021-08-17-16-01-44 +.. nonce: roUl0G +.. section: Library + +:mod:`subprocess` on Solaris now also uses :func:`os.posix_spawn()` for +better performance. + +.. + +.. bpo: 44911 +.. date: 2021-08-14-00-55-16 +.. nonce: uk3hYk +.. section: Library + +:class:`~unittest.IsolatedAsyncioTestCase` will no longer throw an exception +while cancelling leaked tasks. Patch by Bar Harel. + +.. + +.. bpo: 41322 +.. date: 2021-08-12-16-22-16 +.. nonce: utscTd +.. section: Library + +Added ``DeprecationWarning`` for tests and async tests that return a +value!=None (as this may indicate an improperly written test, for example a +test written as a generator function). + +.. + +.. bpo: 44524 +.. date: 2021-08-10-16-57-10 +.. nonce: dk9QX4 +.. section: Library + +Make exception message more useful when subclass from typing special form +alias. Patch provided by Yurii Karabas. + +.. + +.. bpo: 38956 +.. date: 2021-08-09-13-17-10 +.. nonce: owWLNv +.. section: Library + +:class:`argparse.BooleanOptionalAction`'s default value is no longer printed +twice when used with :class:`argparse.ArgumentDefaultsHelpFormatter`. + +.. + +.. bpo: 44860 +.. date: 2021-08-07-22-51-32 +.. nonce: PTvRrU +.. section: Library + +Fix the ``posix_user`` scheme in :mod:`sysconfig` to not depend on +:data:`sys.platlibdir`. + +.. + +.. bpo: 44859 +.. date: 2021-08-07-17-28-56 +.. nonce: CCopjk +.. section: Library + +Improve error handling in :mod:`sqlite3` and raise more accurate exceptions. + +* :exc:`MemoryError` is now raised instead of :exc:`sqlite3.Warning` when memory is not enough for encoding a statement to UTF-8 in ``Connection.__call__()`` and ``Cursor.execute()``. +* :exc:`UnicodEncodeError` is now raised instead of :exc:`sqlite3.Warning` when the statement contains surrogate characters in ``Connection.__call__()`` and ``Cursor.execute()``. +* :exc:`TypeError` is now raised instead of :exc:`ValueError` for non-string script argument in ``Cursor.executescript()``. +* :exc:`ValueError` is now raised for script containing the null character instead of truncating it in ``Cursor.executescript()``. +* Correctly handle exceptions raised when getting boolean value of the result of the progress handler. +* Add many tests covering different corner cases. + +.. + +.. bpo: 44581 +.. date: 2021-08-06-19-15-52 +.. nonce: oFDBTB +.. section: Library + +Upgrade bundled pip to 21.2.3 and setuptools to 57.4.0 + +.. + +.. bpo: 44849 +.. date: 2021-08-06-13-00-28 +.. nonce: O78F_f +.. section: Library + +Fix the :func:`os.set_inheritable` function on FreeBSD 14 for file +descriptor opened with the :data:`~os.O_PATH` flag: ignore the +:data:`~errno.EBADF` error on ``ioctl()``, fallback on the ``fcntl()`` +implementation. Patch by Victor Stinner. + +.. + +.. bpo: 44605 +.. date: 2021-08-06-09-43-50 +.. nonce: q4YSBZ +.. section: Library + +The @functools.total_ordering() decorator now works with metaclasses. + +.. + +.. bpo: 44524 +.. date: 2021-08-05-18-20-17 +.. nonce: 9T1tfe +.. section: Library + +Fixed an issue wherein the ``__name__`` and ``__qualname__`` attributes of +subscribed specialforms could be ``None``. + +.. + +.. bpo: 44839 +.. date: 2021-08-05-14-59-39 +.. nonce: MURNL9 +.. section: Library + +:class:`MemoryError` raised in user-defined functions will now produce a +``MemoryError`` in :mod:`sqlite3`. :class:`OverflowError` will now be +converted to :class:`~sqlite3.DataError`. Previously +:class:`~sqlite3.OperationalError` was produced in these cases. + +.. + +.. bpo: 44822 +.. date: 2021-08-04-12-29-00 +.. nonce: zePNXA +.. section: Library + +:mod:`sqlite3` user-defined functions and aggregators returning +:class:`strings ` with embedded NUL characters are no longer truncated. +Patch by Erlend E. Aasland. + +.. + +.. bpo: 44801 +.. date: 2021-08-03-20-37-45 +.. nonce: i49Aug +.. section: Library + +Ensure that the :class:`~typing.ParamSpec` variable in Callable can only be +substituted with a parameters expression (a list of types, an ellipsis, +ParamSpec or Concatenate). + +.. + +.. bpo: 44806 +.. date: 2021-08-02-14-37-32 +.. nonce: wOW_Qn +.. section: Library + +Non-protocol subclasses of :class:`typing.Protocol` ignore now the +``__init__`` method inherited from protocol base classes. + +.. + +.. bpo: 27275 +.. date: 2021-08-01-19-49-09 +.. nonce: QsvE0k +.. section: Library + +:meth:`collections.OrderedDict.popitem` and +:meth:`collections.OrderedDict.pop` no longer call ``__getitem__`` and +``__delitem__`` methods of the OrderedDict subclasses. + +.. + +.. bpo: 44793 +.. date: 2021-07-31-20-28-20 +.. nonce: woaQSg +.. section: Library + +Fix checking the number of arguments when subscribe a generic type with +``ParamSpec`` parameter. + +.. + +.. bpo: 44784 +.. date: 2021-07-31-08-45-31 +.. nonce: fIMIDS +.. section: Library + +In importlib.metadata tests, override warnings behavior under expected +DeprecationWarnings (importlib_metadata 4.6.3). + +.. + +.. bpo: 44667 +.. date: 2021-07-30-23-27-30 +.. nonce: tu0Xrv +.. section: Library + +The :func:`tokenize.tokenize` doesn't incorrectly generate a ``NEWLINE`` +token if the source doesn't end with a new line character but the last line +is a comment, as the function is already generating a ``NL`` token. Patch by +Pablo Galindo + +.. + +.. bpo: 44771 +.. date: 2021-07-28-22-53-18 +.. nonce: BvLdnU +.. section: Library + +Added ``importlib.simple`` module implementing adapters from a low-level +resources reader interface to a ``TraversableResources`` interface. Legacy +API (``path``, ``contents``, ...) is now supported entirely by the +``.files()`` API with a compatibility shim supplied for resource loaders +without that functionality. Feature parity with ``importlib_resources`` 5.2. + +.. + +.. bpo: 44752 +.. date: 2021-07-27-22-11-29 +.. nonce: _bvbrZ +.. section: Library + +:mod:`rcompleter` does not call :func:`getattr` on :class:`property` objects +to avoid the side-effect of evaluating the corresponding method. + +.. + +.. bpo: 44747 +.. date: 2021-07-27-12-06-19 +.. nonce: epUzZz +.. section: Library + +Refactor usage of ``sys._getframe`` in ``typing`` module. Patch provided by +Yurii Karabas. + +.. + +.. bpo: 42378 +.. date: 2021-07-25-08-17-55 +.. nonce: WIhUZK +.. section: Library + +Fixes the issue with log file being overwritten when +:class:`logging.FileHandler` is used in :mod:`atexit` with *filemode* set to +``'w'``. Note this will cause the message in *atexit* not being logged if +the log stream is already closed due to shutdown of logging. + +.. + +.. bpo: 44720 +.. date: 2021-07-24-02-17-59 +.. nonce: shU5Qm +.. section: Library + +``weakref.proxy`` objects referencing non-iterators now raise ``TypeError`` +rather than dereferencing the null ``tp_iternext`` slot and crashing. + +.. + +.. bpo: 44704 +.. date: 2021-07-21-23-16-30 +.. nonce: iqHLxQ +.. section: Library + +The implementation of ``collections.abc.Set._hash()`` now matches that of +``frozenset.__hash__()``. + +.. + +.. bpo: 44666 +.. date: 2021-07-21-10-43-22 +.. nonce: CEThkv +.. section: Library + +Fixed issue in :func:`compileall.compile_file` when ``sys.stdout`` is +redirected. Patch by Stefan Hölzl. + +.. + +.. bpo: 44688 +.. date: 2021-07-20-23-28-26 +.. nonce: buFgz3 +.. section: Library + +:meth:`sqlite3.Connection.create_collation` now accepts non-ASCII collation +names. Patch by Erlend E. Aasland. + +.. + +.. bpo: 44690 +.. date: 2021-07-20-22-03-24 +.. nonce: tV7Zjg +.. section: Library + +Adopt *binacii.a2b_base64*'s strict mode in *base64.b64decode*. + +.. + +.. bpo: 42854 +.. date: 2021-07-20-21-51-35 +.. nonce: ThuDMI +.. section: Library + +Fixed a bug in the :mod:`_ssl` module that was throwing :exc:`OverflowError` +when using :meth:`_ssl._SSLSocket.write` and :meth:`_ssl._SSLSocket.read` +for a big value of the ``len`` parameter. Patch by Pablo Galindo + +.. + +.. bpo: 44686 +.. date: 2021-07-20-19-35-49 +.. nonce: ucCGhu +.. section: Library + +Replace ``unittest.mock._importer`` with ``pkgutil.resolve_name``. + +.. + +.. bpo: 44353 +.. date: 2021-07-20-18-34-16 +.. nonce: ATuYq4 +.. section: Library + +Make ``NewType.__call__`` faster by implementing it in C. Patch provided by +Yurii Karabas. + +.. + +.. bpo: 44682 +.. date: 2021-07-20-00-11-47 +.. nonce: 3m2qVV +.. section: Library + +Change the :mod:`pdb` *commands* directive to disallow setting commands for +an invalid breakpoint and to display an appropriate error. + +.. + +.. bpo: 44353 +.. date: 2021-07-19-22-43-15 +.. nonce: HF81_Q +.. section: Library + +Refactor ``typing.NewType`` from function into callable class. Patch +provided by Yurii Karabas. + +.. + +.. bpo: 44678 +.. date: 2021-07-19-18-45-00 +.. nonce: YMEAu0 +.. section: Library + +Added a separate error message for discontinuous padding in +*binascii.a2b_base64* strict mode. + +.. + +.. bpo: 44524 +.. date: 2021-07-19-14-04-42 +.. nonce: Nbf2JC +.. section: Library + +Add missing ``__name__`` and ``__qualname__`` attributes to ``typing`` +module classes. Patch provided by Yurii Karabas. + +.. + +.. bpo: 40897 +.. date: 2021-07-16-13-40-31 +.. nonce: aveAre +.. section: Library + +Give priority to using the current class constructor in +:func:`inspect.signature`. Patch by Weipeng Hong. + +.. + +.. bpo: 44638 +.. date: 2021-07-16-08-57-27 +.. nonce: EwYKne +.. section: Library + +Add a reference to the zipp project and hint as to how to use it. + +.. + +.. bpo: 44648 +.. date: 2021-07-15-16-51-32 +.. nonce: 2o49TB +.. section: Library + +Fixed wrong error being thrown by :func:`inspect.getsource` when examining a +class in the interactive session. Instead of :exc:`TypeError`, it should be +:exc:`OSError` with appropriate error message. + +.. + +.. bpo: 44608 +.. date: 2021-07-13-09-01-33 +.. nonce: R3IcM1 +.. section: Library + +Fix memory leak in :func:`_tkinter._flatten` if it is called with a sequence +or set, but not list or tuple. + +.. + +.. bpo: 44594 +.. date: 2021-07-12-10-32-48 +.. nonce: eEa5zi +.. section: Library + +Fix an edge case of :class:`ExitStack` and :class:`AsyncExitStack` exception +chaining. They will now match ``with`` block behavior when ``__context__`` +is explicitly set to ``None`` when the exception is in flight. + +.. + +.. bpo: 42799 +.. date: 2021-07-10-19-55-13 +.. nonce: ad4tq8 +.. section: Library + +In :mod:`fnmatch`, the cache size for compiled regex patterns +(:func:`functools.lru_cache`) was bumped up from 256 to 32768, affecting +functions: :func:`fnmatch.fnmatch`, :func:`fnmatch.fnmatchcase`, +:func:`fnmatch.filter`. + +.. + +.. bpo: 41928 +.. date: 2021-07-09-07-14-37 +.. nonce: Q1jMrr +.. section: Library + +Update :func:`shutil.copyfile` to raise :exc:`FileNotFoundError` instead of +confusing :exc:`IsADirectoryError` when a path ending with a +:const:`os.path.sep` does not exist; :func:`shutil.copy` and +:func:`shutil.copy2` are also affected. + +.. + +.. bpo: 44569 +.. date: 2021-07-08-12-22-54 +.. nonce: KZ02v9 +.. section: Library + +Added the :func:`StackSummary.format_frame` function in :mod:`traceback`. +This allows users to customize the way individual lines are formatted in +tracebacks without re-implementing logic to handle recursive tracebacks. + +.. + +.. bpo: 44566 +.. date: 2021-07-05-18-13-25 +.. nonce: o51Bd1 +.. section: Library + +handle StopIteration subclass raised from @contextlib.contextmanager +generator + +.. + +.. bpo: 44558 +.. date: 2021-07-04-21-16-53 +.. nonce: cm7Slv +.. section: Library + +Make the implementation consistency of :func:`~operator.indexOf` between C +and Python versions. Patch by Dong-hee Na. + +.. + +.. bpo: 41249 +.. date: 2021-07-04-11-33-34 +.. nonce: sHdwBE +.. section: Library + +Fixes ``TypedDict`` to work with ``typing.get_type_hints()`` and postponed +evaluation of annotations across modules. + +.. + +.. bpo: 44554 +.. date: 2021-07-02-18-17-56 +.. nonce: aBUmJo +.. section: Library + +Refactor argument processing in :func:`pdb.main` to simplify detection of +errors in input loading and clarify behavior around module or script +invocation. + +.. + +.. bpo: 34798 +.. date: 2021-06-30-13-29-49 +.. nonce: t7FCa0 +.. section: Library + +Break up paragraph about :class:`pprint.PrettyPrinter` construction +parameters to make it easier to read. + +.. + +.. bpo: 44539 +.. date: 2021-06-30-11-34-35 +.. nonce: nP0Xi4 +.. section: Library + +Added support for recognizing JPEG files without JFIF or Exif markers. + +.. + +.. bpo: 44461 +.. date: 2021-06-29-21-17-17 +.. nonce: acqRnV +.. section: Library + +Fix bug with :mod:`pdb`'s handling of import error due to a package which +does not have a ``__main__`` module + +.. + +.. bpo: 43625 +.. date: 2021-06-29-07-27-08 +.. nonce: ZlAxhp +.. section: Library + +Fix a bug in the detection of CSV file headers by +:meth:`csv.Sniffer.has_header` and improve documentation of same. + +.. + +.. bpo: 44516 +.. date: 2021-06-26-12-27-14 +.. nonce: BVyX_y +.. section: Library + +Update vendored pip to 21.1.3 + +.. + +.. bpo: 42892 +.. date: 2021-06-24-19-16-20 +.. nonce: qvRNhI +.. section: Library + +Fixed an exception thrown while parsing a malformed multipart email by +:class:`email.message.EmailMessage`. + +.. + +.. bpo: 44468 +.. date: 2021-06-23-19-02-00 +.. nonce: -klV5- +.. section: Library + +:func:`typing.get_type_hints` now finds annotations in classes and base +classes with unexpected ``__module__``. Previously, it skipped those MRO +elements. + +.. + +.. bpo: 44491 +.. date: 2021-06-23-01-33-01 +.. nonce: tiOlr5 +.. section: Library + +Allow clearing the :mod:`sqlite3` authorizer callback by passing +:const:`None` to :meth:`~sqlite3.Connection.set_authorizer`. Patch by Erlend +E. Aasland. + +.. + +.. bpo: 43977 +.. date: 2021-06-22-16-45-48 +.. nonce: bamAGF +.. section: Library + +Set the proper :const:`Py_TPFLAGS_MAPPING` and :const:`Py_TPFLAGS_SEQUENCE` +flags for subclasses created before a parent has been registered as a +:class:`collections.abc.Mapping` or :class:`collections.abc.Sequence`. + +.. + +.. bpo: 44482 +.. date: 2021-06-22-08-43-04 +.. nonce: U9GznK +.. section: Library + +Fix very unlikely resource leak in :mod:`glob` in alternate Python +implementations. + +.. + +.. bpo: 44466 +.. date: 2021-06-21-12-43-04 +.. nonce: NSm6mv +.. section: Library + +The :mod:`faulthandler` module now detects if a fatal error occurs during a +garbage collector collection. Patch by Victor Stinner. + +.. + +.. bpo: 44471 +.. date: 2021-06-21-10-46-58 +.. nonce: 2QjXv_ +.. section: Library + +A :exc:`TypeError` is now raised instead of an :exc:`AttributeError` in +:meth:`contextlib.ExitStack.enter_context` and +:meth:`contextlib.AsyncExitStack.enter_async_context` for objects which do +not support the :term:`context manager` or :term:`asynchronous context +manager` protocols correspondingly. + +.. + +.. bpo: 44404 +.. date: 2021-06-20-19-01-11 +.. nonce: McfrYB +.. section: Library + +:mod:`tkinter`'s ``after()`` method now supports callables without the +``__name__`` attribute. + +.. + +.. bpo: 41546 +.. date: 2021-06-20-14-03-18 +.. nonce: lO1jXU +.. section: Library + +Make :mod:`pprint` (like the builtin ``print``) not attempt to write to +``stdout`` when it is ``None``. + +.. + +.. bpo: 44458 +.. date: 2021-06-20-07-14-46 +.. nonce: myqCQ0 +.. section: Library + +``BUFFER_BLOCK_SIZE`` is now declared static, to avoid linking collisions +when bz2, lmza or zlib are statically linked. + +.. + +.. bpo: 44464 +.. date: 2021-06-19-21-52-27 +.. nonce: U2oa-a +.. section: Library + +Remove exception for flake8 in deprecated importlib.metadata interfaces. +Sync with importlib_metadata 4.6. + +.. + +.. bpo: 44446 +.. date: 2021-06-17-22-39-34 +.. nonce: qwdRic +.. section: Library + +Take into account that ``lineno`` might be ``None`` in +:class:`traceback.FrameSummary`. + +.. + +.. bpo: 44439 +.. date: 2021-06-17-15-01-51 +.. nonce: 1S7QhT +.. section: Library + +Fix in :meth:`bz2.BZ2File.write` / :meth:`lzma.LZMAFile.write` methods, when +the input data is an object that supports the buffer protocol, the file +length may be wrong. + +.. + +.. bpo: 44434 +.. date: 2021-06-16-16-52-14 +.. nonce: SQS4Pg +.. section: Library + +_thread.start_new_thread() no longer calls PyThread_exit_thread() explicitly +at the thread exit, the call was redundant. On Linux with the glibc, +pthread_exit() aborts the whole process if dlopen() fails to open +libgcc_s.so file (ex: EMFILE error). Patch by Victor Stinner. + +.. + +.. bpo: 42972 +.. date: 2021-06-15-13-51-25 +.. nonce: UnyYo1 +.. section: Library + +The _thread.RLock type now fully implement the GC protocol: add a traverse +function and the :const:`Py_TPFLAGS_HAVE_GC` flag. Patch by Victor Stinner. + +.. + +.. bpo: 44422 +.. date: 2021-06-14-23-28-17 +.. nonce: BlWOgv +.. section: Library + +The :func:`threading.enumerate` function now uses a reentrant lock to +prevent a hang on reentrant call. Patch by Victor Stinner. + +.. + +.. bpo: 38291 +.. date: 2021-06-14-14-19-11 +.. nonce: ee4cSX +.. section: Library + +Importing typing.io or typing.re now prints a ``DeprecationWarning``. + +.. + +.. bpo: 37880 +.. date: 2021-06-13-00-16-56 +.. nonce: 5bTrkw +.. section: Library + +argparse actions store_const and append_const each receive a default value +of None when the ``const`` kwarg is not provided. Previously, this raised a +:exc:`TypeError`. + +.. + +.. bpo: 44389 +.. date: 2021-06-12-22-58-20 +.. nonce: WTRnoC +.. section: Library + +Fix deprecation of :data:`ssl.OP_NO_TLSv1_3` + +.. + +.. bpo: 27827 +.. date: 2021-06-12-21-25-35 +.. nonce: TMWh1i +.. section: Library + +:meth:`pathlib.PureWindowsPath.is_reserved` now identifies a greater range +of reserved filenames, including those with trailing spaces or colons. + +.. + +.. bpo: 44395 +.. date: 2021-06-12-10-08-14 +.. nonce: PcW6Sx +.. section: Library + +Fix :meth:`~email.message.MIMEPart.as_string` to pass unixfrom properly. +Patch by Dong-hee Na. + +.. + +.. bpo: 34266 +.. date: 2021-06-10-21-53-46 +.. nonce: k3fxnm +.. section: Library + +Handle exceptions from parsing the arg of :mod:`pdb`'s run/restart command. + +.. + +.. bpo: 44362 +.. date: 2021-06-10-20-07-32 +.. nonce: oVOMfd +.. section: Library + +Improve :mod:`ssl` module's deprecation messages, error reporting, and +documentation for deprecations. + +.. + +.. bpo: 44342 +.. date: 2021-06-10-15-06-47 +.. nonce: qqkGlj +.. section: Library + +[Enum] Change pickling from by-value to by-name. + +.. + +.. bpo: 44356 +.. date: 2021-06-10-08-35-38 +.. nonce: 6oDFhO +.. section: Library + +[Enum] Allow multiple data-type mixins if they are all the same. + +.. + +.. bpo: 44351 +.. date: 2021-06-10-07-26-12 +.. nonce: rvyf2v +.. section: Library + +Restore back :func:`parse_makefile` in :mod:`distutils.sysconfig` because it +behaves differently than the similar implementation in :mod:`sysconfig`. + +.. + +.. bpo: 35800 +.. date: 2021-06-09-10-08-32 +.. nonce: 3hmkWw +.. section: Library + +:class:`smtpd.MailmanProxy` is now removed as it is unusable without an +external module, ``mailman``. Patch by Dong-hee Na. + +.. + +.. bpo: 44357 +.. date: 2021-06-09-08-32-39 +.. nonce: 70Futb +.. section: Library + +Added a function that returns cube root of the given number +:func:`math.cbrt` + +.. + +.. bpo: 44339 +.. date: 2021-06-08-17-47-38 +.. nonce: 9JwMSc +.. section: Library + +Change ``math.pow(±0.0, -math.inf)`` to return ``inf`` instead of raising +``ValueError``. This brings the special-case handling of ``math.pow`` into +compliance with the IEEE 754 standard. + +.. + +.. bpo: 44242 +.. date: 2021-06-07-10-26-14 +.. nonce: MKeMCQ +.. section: Library + +Remove missing flag check from Enum creation and move into a ``verify`` +decorator. + +.. + +.. bpo: 44246 +.. date: 2021-05-31-11-34-56 +.. nonce: yHAkF0 +.. section: Library + +In ``importlib.metadata``, restore compatibility in the result from +``Distribution.entry_points`` (``EntryPoints``) to honor expectations in +older implementations and issuing deprecation warnings for these cases: A. +``EntryPoints`` objects are once again mutable, allowing for ``sort()`` +and other list-based mutation operations. Avoid deprecation warnings by +casting to a mutable sequence (e.g. ``list(dist.entry_points).sort()``). +B. ``EntryPoints`` results once again allow for access by index. To avoid +deprecation warnings, cast the result to a Sequence first (e.g. +``tuple(dist.entry_points)[0]``). + +.. + +.. bpo: 44246 +.. date: 2021-05-31-11-28-03 +.. nonce: nhmt-v +.. section: Library + +In importlib.metadata.entry_points, de-duplication of distributions no +longer requires loading the full metadata for PathDistribution objects, +improving entry point loading performance by ~10x. + +.. + +.. bpo: 43858 +.. date: 2021-05-31-04-51-02 +.. nonce: r7LOu6 +.. section: Library + +Added a function that returns a copy of a dict of logging levels: +:func:`logging.getLevelNamesMapping` + +.. + +.. bpo: 44260 +.. date: 2021-05-30-13-32-09 +.. nonce: ROEbVd +.. section: Library + +The :class:`random.Random` constructor no longer reads system entropy +without need. + +.. + +.. bpo: 44254 +.. date: 2021-05-29-01-05-43 +.. nonce: f06xDm +.. section: Library + +On Mac, give turtledemo button text a color that works on both light or dark +background. Programmers cannot control the latter. + +.. + +.. bpo: 44258 +.. date: 2021-05-28-09-43-33 +.. nonce: nh5F7R +.. section: Library + +Support PEP 515 for Fraction's initialization from string. + +.. + +.. bpo: 44235 +.. date: 2021-05-26-22-04-40 +.. nonce: qFBYpp +.. section: Library + +Remove deprecated functions in the :mod:`gettext`. Patch by Dong-hee Na. + +.. + +.. bpo: 38693 +.. date: 2021-05-26-14-50-06 +.. nonce: NkMacJ +.. section: Library + +Prefer f-strings to ``.format`` in importlib.resources. + +.. + +.. bpo: 33693 +.. date: 2021-05-26-13-34-37 +.. nonce: 3okzdo +.. section: Library + +Importlib.metadata now prefers f-strings to .format. + +.. + +.. bpo: 44241 +.. date: 2021-05-26-13-15-51 +.. nonce: TBqej8 +.. section: Library + +Incorporate minor tweaks from importlib_metadata 4.1: SimplePath protocol, +support for Metadata 2.2. + +.. + +.. bpo: 43216 +.. date: 2021-05-25-23-26-38 +.. nonce: xTUyyX +.. section: Library + +Remove the :func:`@asyncio.coroutine ` :term:`decorator` +enabling legacy generator-based coroutines to be compatible with async/await +code; remove :class:`asyncio.coroutines.CoroWrapper` used for wrapping +legacy coroutine objects in the debug mode. The decorator has been +deprecated since Python 3.8 and the removal was initially scheduled for +Python 3.10. Patch by Illia Volochii. + +.. + +.. bpo: 44210 +.. date: 2021-05-21-21-23-43 +.. nonce: 5afQ3K +.. section: Library + +Make importlib.metadata._meta.PackageMetadata public. + +.. + +.. bpo: 43643 +.. date: 2021-05-21-12-12-35 +.. nonce: GWnmcF +.. section: Library + +Declare readers.MultiplexedPath.name as a property per the spec. + +.. + +.. bpo: 27334 +.. date: 2021-05-18-00-17-21 +.. nonce: 32EJZi +.. section: Library + +The :mod:`sqlite3` context manager now performs a rollback (thus releasing +the database lock) if commit failed. Patch by Luca Citi and Erlend E. +Aasland. + +.. + +.. bpo: 4928 +.. date: 2021-05-17-21-05-06 +.. nonce: Ot2yjO +.. section: Library + +Documented existing behavior on POSIX: NamedTemporaryFiles are not deleted +when creating process is killed with SIGKILL + +.. + +.. bpo: 44154 +.. date: 2021-05-17-07-24-24 +.. nonce: GRI5bf +.. section: Library + +Optimize :class:`fractions.Fraction` pickling for large components. + +.. + +.. bpo: 33433 +.. date: 2021-05-16-17-48-24 +.. nonce: MyzO71 +.. section: Library + +For IPv4 mapped IPv6 addresses (:rfc:`4291` Section 2.5.5.2), the +:mod:`ipaddress.IPv6Address.is_private` check is deferred to the mapped IPv4 +address. This solves a bug where public mapped IPv4 addresses were +considered private by the IPv6 check. + +.. + +.. bpo: 44150 +.. date: 2021-05-16-11-57-38 +.. nonce: xAhhik +.. section: Library + +Add optional *weights* argument to statistics.fmean(). + +.. + +.. bpo: 44142 +.. date: 2021-05-16-02-24-23 +.. nonce: t-XU8k +.. section: Library + +:func:`ast.unparse` will now drop the redundant parentheses when tuples used +as assignment targets (e.g in for loops). + +.. + +.. bpo: 44145 +.. date: 2021-05-16-00-00-38 +.. nonce: ko5SJ7 +.. section: Library + +:mod:`hmac` computations were not releasing the GIL while calling the +OpenSSL ``HMAC_Update`` C API (a new feature in 3.9). This unintentionally +prevented parallel computation as other :mod:`hashlib` algorithms support. + +.. + +.. bpo: 44095 +.. date: 2021-05-14-16-06-02 +.. nonce: v_pLwY +.. section: Library + +:class:`zipfile.Path` now supports :attr:`zipfile.Path.stem`, +:attr:`zipfile.Path.suffixes`, and :attr:`zipfile.Path.suffix` attributes. + +.. + +.. bpo: 44077 +.. date: 2021-05-13-19-44-38 +.. nonce: 04b2a4 +.. section: Library + +It's now possible to receive the type of service (ToS), a.k.a. +differentiated services (DS), a.k.a. differenciated services code point +(DSCP) and excplicit congestion notification (ECN) IP header fields with +``socket.IP_RECVTOS``. + +.. + +.. bpo: 37788 +.. date: 2021-05-13-19-07-28 +.. nonce: adeFcf +.. section: Library + +Fix a reference leak when a Thread object is never joined. + +.. + +.. bpo: 38908 +.. date: 2021-05-12-16-43-21 +.. nonce: nM2_rO +.. section: Library + +Subclasses of ``typing.Protocol`` which only have data variables declared +will now raise a ``TypeError`` when checked with ``isinstance`` unless they +are decorated with :func:`runtime_checkable`. Previously, these checks +passed silently. Patch provided by Yurii Karabas. + +.. + +.. bpo: 44098 +.. date: 2021-05-10-17-45-00 +.. nonce: _MoxuZ +.. section: Library + +``typing.ParamSpec`` will no longer be found in the ``__parameters__`` of +most :mod:`typing` generics except in valid use locations specified by +:pep:`612`. This prevents incorrect usage like ``typing.List[P][int]``. This +change means incorrect usage which may have passed silently in 3.10 beta 1 +and earlier will now error. + +.. + +.. bpo: 44089 +.. date: 2021-05-09-22-52-34 +.. nonce: IoANsN +.. section: Library + +Allow subclassing ``csv.Error`` in 3.10 (it was allowed in 3.9 and earlier +but was disallowed in early versions of 3.10). + +.. + +.. bpo: 44081 +.. date: 2021-05-09-03-26-31 +.. nonce: A-Mrto +.. section: Library + +:func:`ast.unparse` now doesn't use redundant spaces to separate ``lambda`` +and the ``:`` if there are no parameters. + +.. + +.. bpo: 44061 +.. date: 2021-05-07-08-39-23 +.. nonce: MvElG6 +.. section: Library + +Fix regression in previous release when calling :func:`pkgutil.iter_modules` +with a list of :class:`pathlib.Path` objects + +.. + +.. bpo: 44059 +.. date: 2021-05-06-16-01-55 +.. nonce: GF5r6O +.. section: Library + +Register the SerenityOS Browser in the :mod:`webbrowser` module. + +.. + +.. bpo: 36515 +.. date: 2021-05-05-11-44-49 +.. nonce: uOSa3q +.. section: Library + +The :mod:`hashlib` module no longer does unaligned memory accesses when +compiled for ARM platforms. + +.. + +.. bpo: 40465 +.. date: 2021-05-03-19-59-14 +.. nonce: 1tB4Y0 +.. section: Library + +Remove random module features deprecated in Python 3.9. + +.. + +.. bpo: 44018 +.. date: 2021-05-03-10-07-43 +.. nonce: VDyW8f +.. section: Library + +random.seed() no longer mutates bytearray inputs. + +.. + +.. bpo: 38352 +.. date: 2021-05-02-13-54-25 +.. nonce: N9MlhV +.. section: Library + +Add ``IO``, ``BinaryIO``, ``TextIO``, ``Match``, and ``Pattern`` to +``typing.__all__``. Patch by Jelle Zijlstra. + +.. + +.. bpo: 44002 +.. date: 2021-05-01-15-43-37 +.. nonce: KLT_wd +.. section: Library + +:mod:`urllib.parse` now uses :func:`functool.lru_cache` for its internal URL +splitting and quoting caches instead of rolling its own like its the '90s. + +The undocumented internal :mod:`urllib.parse` ``Quoted`` class API is now +deprecated, for removal in 3.14. + +.. + +.. bpo: 43972 +.. date: 2021-04-30-16-58-24 +.. nonce: Y2r9lg +.. section: Library + +When :class:`http.server.SimpleHTTPRequestHandler` sends a ``301 (Moved +Permanently)`` for a directory path not ending with `/`, add a +``Content-Length: 0`` header. This improves the behavior for certain +clients. + +.. + +.. bpo: 28528 +.. date: 2021-04-29-00-48-00 +.. nonce: JLAVWj +.. section: Library + +Fix a bug in :mod:`pdb` where :meth:`~pdb.Pdb.checkline` raises +:exc:`AttributeError` if it is called after :meth:`~pdb.Pdb.reset`. + +.. + +.. bpo: 43853 +.. date: 2021-04-15-12-02-17 +.. nonce: XXCVAp +.. section: Library + +Improved string handling for :mod:`sqlite3` user-defined functions and +aggregates: + +* It is now possible to pass strings with embedded null characters to UDFs +* Conversion failures now correctly raise :exc:`MemoryError` + +Patch by Erlend E. Aasland. + +.. + +.. bpo: 43666 +.. date: 2021-03-30-08-39-08 +.. nonce: m72tlH +.. section: Library + +AIX: `Lib/_aix_support.get_platform()` may fail in an AIX WPAR. The fileset +bos.rte appears to have a builddate in both LPAR and WPAR so this fileset is +queried rather than bos.mp64. To prevent a similiar situation (no builddate +in ODM) a value (9988) sufficient for completing a build is provided. Patch +by M Felt. + +.. + +.. bpo: 43650 +.. date: 2021-03-29-00-23-30 +.. nonce: v01tic +.. section: Library + +Fix :exc:`MemoryError` in :func:`shutil.unpack_archive` which fails inside +:func:`shutil._unpack_zipfile` on large files. Patch by Igor Bolshakov. + +.. + +.. bpo: 43612 +.. date: 2021-03-24-09-40-02 +.. nonce: vMGZ4y +.. section: Library + +:func:`zlib.compress` now accepts a wbits parameter which allows users to +compress data as a raw deflate block without zlib headers and trailers in +one go. Previously this required instantiating a ``zlib.compressobj``. It +also provides a faster alternative to ``gzip.compress`` when wbits=31 is +used. + +.. + +.. bpo: 43392 +.. date: 2021-03-03-13-32-37 +.. nonce: QQumou +.. section: Library + +:func:`importlib._bootstrap._find_and_load` now implements a two-step check +to avoid locking when modules have been already imported and are ready. This +improves performance of repeated calls to :func:`importlib.import_module` +and :func:`importlib.__import__`. + +.. + +.. bpo: 43318 +.. date: 2021-02-25-08-32-06 +.. nonce: bZJw6V +.. section: Library + +Fix a bug where :mod:`pdb` does not always echo cleared breakpoints. + +.. + +.. bpo: 43234 +.. date: 2021-02-15-22-14-31 +.. nonce: F-vKAT +.. section: Library + +Prohibit passing non-:class:`concurrent.futures.ThreadPoolExecutor` +executors to :meth:`loop.set_default_executor` following a deprecation in +Python 3.8. Patch by Illia Volochii. + +.. + +.. bpo: 43232 +.. date: 2021-02-15-21-17-46 +.. nonce: awc4yZ +.. section: Library + +Prohibit previously deprecated potentially disruptive operations on +:class:`asyncio.trsock.TransportSocket`. Patch by Illia Volochii. + +.. + +.. bpo: 30077 +.. date: 2021-02-04-23-16-03 +.. nonce: v6TqAi +.. section: Library + +Added support for Apple's aifc/sowt pseudo-compression + +.. + +.. bpo: 42971 +.. date: 2021-02-02-20-11-14 +.. nonce: OpVoFu +.. section: Library + +Add definition of ``errno.EQFULL`` for platforms that define this constant +(such as macOS). + +.. + +.. bpo: 43086 +.. date: 2021-01-31-18-24-54 +.. nonce: 2_P-SH +.. section: Library + +Added a new optional :code:`strict_mode` parameter to *binascii.a2b_base64*. +When :code:`scrict_mode` is set to :code:`True`, the *a2b_base64* function +will accept only valid base64 content. More details about what "valid base64 +content" is, can be found in the function's documentation. + +.. + +.. bpo: 43024 +.. date: 2021-01-25-21-24-55 +.. nonce: vAUrIi +.. section: Library + +Improve the help signature of :func:`traceback.print_exception`, +:func:`traceback.format_exception` and +:func:`traceback.format_exception_only`. + +.. + +.. bpo: 33809 +.. date: 2021-01-16-18-36-00 +.. nonce: BiMK6V +.. section: Library + +Add the :meth:`traceback.TracebackException.print` method which prints the +formatted exception information. + +.. + +.. bpo: 42862 +.. date: 2021-01-13-00-02-44 +.. nonce: Z6ACLN +.. section: Library + +:mod:`sqlite3` now utilizes :meth:`functools.lru_cache` to implement the +connection statement cache. As a small optimisation, the default statement +cache size has been increased from 100 to 128. Patch by Erlend E. Aasland. + +.. + +.. bpo: 41818 +.. date: 2020-12-08-01-08-58 +.. nonce: zO8vV7 +.. section: Library + +Soumendra Ganguly: add termios.tcgetwinsize(), termios.tcsetwinsize(). + +.. + +.. bpo: 40497 +.. date: 2020-10-18-09-42-53 +.. nonce: CRz2sG +.. section: Library + +:meth:`subprocess.check_output` now raises :exc:`ValueError` when the +invalid keyword argument *check* is passed by user code. Previously such use +would fail later with a :exc:`TypeError`. Patch by Rémi Lapeyre. + +.. + +.. bpo: 37449 +.. date: 2020-10-11-20-23-48 +.. nonce: f-t3V6 +.. section: Library + +``ensurepip`` now uses ``importlib.resources.files()`` traversable APIs + +.. + +.. bpo: 40956 +.. date: 2020-10-01-21-46-34 +.. nonce: _tvsZ7 +.. section: Library + +Use Argument Clinic in :mod:`sqlite3`. Patches by Erlend E. Aasland. + +.. + +.. bpo: 41730 +.. date: 2020-09-10-07-23-24 +.. nonce: DyKFi9 +.. section: Library + +``DeprecationWarning`` is now raised when importing :mod:`tkinter.tix`, +which has been deprecated in documentation since Python 3.6. + +.. + +.. bpo: 20684 +.. date: 2020-07-30-14-37-15 +.. nonce: qV35GU +.. section: Library + +Remove unused ``_signature_get_bound_param`` function from :mod:`inspect` - +by Anthony Sottile. + +.. + +.. bpo: 41402 +.. date: 2020-07-26-18-17-30 +.. nonce: YRkVkp +.. section: Library + +Fix :meth:`email.message.EmailMessage.set_content` when called with binary +data and ``7bit`` content transfer encoding. + +.. + +.. bpo: 32695 +.. date: 2020-07-13-23-46-59 +.. nonce: tTqqXe +.. section: Library + +The *compresslevel* and *preset* keyword arguments of :func:`tarfile.open` +are now both documented and tested. + +.. + +.. bpo: 41137 +.. date: 2020-07-01-17-42-41 +.. nonce: AnqbP- +.. section: Library + +Use utf-8 encoding while reading .pdbrc files. Patch by Srinivas Reddy +Thatiparthy + +.. + +.. bpo: 24391 +.. date: 2020-05-30-10-48-04 +.. nonce: ZCTnhX +.. section: Library + +Improved reprs of :mod:`threading` synchronization objects: +:class:`~threading.Semaphore`, :class:`~threading.BoundedSemaphore`, +:class:`~threading.Event` and :class:`~threading.Barrier`. + +.. + +.. bpo: 5846 +.. date: 2020-05-25-23-58-29 +.. nonce: O9BIfm +.. section: Library + +Deprecated the following :mod:`unittest` functions, scheduled for removal in +Python 3.13: + +* :func:`~unittest.findTestCases` +* :func:`~unittest.makeSuite` +* :func:`~unittest.getTestCaseNames` + +Use :class:`~unittest.TestLoader` methods instead: + +* :meth:`unittest.TestLoader.loadTestsFromModule` +* :meth:`unittest.TestLoader.loadTestsFromTestCase` +* :meth:`unittest.TestLoader.getTestCaseNames` + +Patch by Erlend E. Aasland. + +.. + +.. bpo: 40563 +.. date: 2020-05-21-01-42-32 +.. nonce: fDn5bP +.. section: Library + +Support pathlike objects on dbm/shelve. Patch by Hakan Çelik and +Henry-Joseph Audéoud. + +.. + +.. bpo: 34990 +.. date: 2020-04-24-20-39-38 +.. nonce: 3SmL9M +.. section: Library + +Fixed a Y2k38 bug in the compileall module where it would fail to compile +files with a modification time after the year 2038. + +.. + +.. bpo: 39549 +.. date: 2020-02-03-21-18-31 +.. nonce: l4a8uH +.. section: Library + +Whereas the code for reprlib.Repr had previously used a hardcoded string +value of '...', this PR updates it to use of a “fillvalue” attribute, whose +value defaults to '...' and can be reset in either individual reprlib.Repr +instances or in subclasses thereof. + +.. + +.. bpo: 37022 +.. date: 2020-01-25-12-58-20 +.. nonce: FUZI25 +.. section: Library + +:mod:`pdb` now displays exceptions from ``repr()`` with its ``p`` and ``pp`` +commands. + +.. + +.. bpo: 38840 +.. date: 2020-01-16-23-41-16 +.. nonce: VzzYZz +.. section: Library + +Fix ``test___all__`` on platforms lacking a shared memory implementation. + +.. + +.. bpo: 39359 +.. date: 2020-01-16-13-54-28 +.. nonce: hzTu0h +.. section: Library + +Add one missing check that the password is a bytes object for an encrypted +zipfile. + +.. + +.. bpo: 38741 +.. date: 2019-11-12-18-59-33 +.. nonce: W7IYkq +.. section: Library + +:mod:`configparser`: using ']' inside a section header will no longer cut +the section name short at the ']' + +.. + +.. bpo: 38415 +.. date: 2019-10-08-14-08-59 +.. nonce: N1bUw6 +.. section: Library + +Added missing behavior to :func:`contextlib.asynccontextmanager` to match +:func:`contextlib.contextmanager` so decorated functions can themselves be +decorators. + +.. + +.. bpo: 30256 +.. date: 2019-09-25-13-54-41 +.. nonce: wBkzox +.. section: Library + +Pass multiprocessing BaseProxy argument ``manager_owned`` through AutoProxy. + +.. + +.. bpo: 27513 +.. date: 2019-06-03-23-53-25 +.. nonce: qITN7d +.. section: Library + +:func:`email.utils.getaddresses` now accepts :class:`email.header.Header` +objects along with string values. Patch by Zackery Spytz. + +.. + +.. bpo: 16379 +.. date: 2019-05-08-15-14-32 +.. nonce: rN5JVe +.. section: Library + +Add SQLite error code and name to :mod:`sqlite3` exceptions. Patch by Aviv +Palivoda, Daniel Shahaf, and Erlend E. Aasland. + +.. + +.. bpo: 26228 +.. date: 2019-02-26-09-31-59 +.. nonce: wyrHKc +.. section: Library + +pty.spawn no longer hangs on FreeBSD, macOS, and Solaris. + +.. + +.. bpo: 33349 +.. date: 2018-04-24-14-25-07 +.. nonce: Y_0LIr +.. section: Library + +lib2to3 now recognizes async generators everywhere. + +.. + +.. bpo: 29298 +.. date: 2017-09-20-14-43-03 +.. nonce: _78CSN +.. section: Library + +Fix ``TypeError`` when required subparsers without ``dest`` do not receive +arguments. Patch by Anthony Sottile. + +.. + +.. bpo: 45216 +.. date: 2021-09-18-13-45-19 +.. nonce: o56nyt +.. section: Documentation + +Remove extra documentation listing methods in ``difflib``. It was rendering +twice in pydoc and was outdated in some places. + +.. + +.. bpo: 45024 +.. date: 2021-09-08-17-20-19 +.. nonce: dkNPNi +.. section: Documentation + +:mod:`collections.abc` documentation has been expanded to explicitly cover +how instance and subclass checks work, with additional doctest examples and +an exhaustive list of ABCs which test membership purely by presence of the +right :term:`special method`\s. Patch by Raymond Hettinger. + +.. + +.. bpo: 44957 +.. date: 2021-08-19-15-53-08 +.. nonce: imqrh3 +.. section: Documentation + +Promote PEP 604 union syntax by using it where possible. Also, mention ``X | +Y`` more prominently in section about ``Union`` and mention ``X | None`` at +all in section about ``Optional``. + +.. + +.. bpo: 16580 +.. date: 2021-08-13-20-17-59 +.. nonce: MZ_iK9 +.. section: Documentation + +Added code equivalents for the :meth:`int.to_bytes` and +:meth:`int.from_bytes` methods, as well as tests ensuring that these code +equivalents are valid. + +.. + +.. bpo: 44903 +.. date: 2021-08-13-19-08-03 +.. nonce: aJuvQF +.. section: Documentation + +Removed the othergui.rst file, any references to it, and the list of GUI +frameworks in the FAQ. In their place I've added links to the Python Wiki +`page on GUI frameworks `. + +.. + +.. bpo: 33479 +.. date: 2021-08-11-18-02-06 +.. nonce: rCe4c5 +.. section: Documentation + +Tkinter documentation has been greatly expanded with new "Architecture" and +"Threading model" sections. + +.. + +.. bpo: 36700 +.. date: 2021-08-09-19-58-45 +.. nonce: WPNW5f +.. section: Documentation + +:mod:`base64` RFC references were updated to point to :rfc:`4648`; a section +was added to point users to the new "security considerations" section of the +RFC. + +.. + +.. bpo: 44740 +.. date: 2021-07-26-23-48-31 +.. nonce: zMFGMV +.. section: Documentation + +Replaced occurences of uppercase "Web" and "Internet" with lowercase +versions per the 2016 revised Associated Press Style Book. + +.. + +.. bpo: 44693 +.. date: 2021-07-25-23-04-15 +.. nonce: JuCbNq +.. section: Documentation + +Update the definition of __future__ in the glossary by replacing the +confusing word "pseudo-module" with a more accurate description. + +.. + +.. bpo: 35183 +.. date: 2021-07-22-08-28-03 +.. nonce: p9BWTB +.. section: Documentation + +Add typical examples to os.path.splitext docs + +.. + +.. bpo: 30511 +.. date: 2021-07-20-21-03-18 +.. nonce: eMFkRi +.. section: Documentation + +Clarify that :func:`shutil.make_archive` is not thread-safe due to reliance +on changing the current working directory. + +.. + +.. bpo: 44561 +.. date: 2021-07-18-22-43-14 +.. nonce: T7HpWm +.. section: Documentation + +Update of three expired hyperlinks in Doc/distributing/index.rst: "Project +structure", "Building and packaging the project", and "Uploading the project +to the Python Packaging Index". + +.. + +.. bpo: 44651 +.. date: 2021-07-18-22-26-02 +.. nonce: SjT9iY +.. section: Documentation + +Delete entry "coercion" in Doc/glossary.rst for its outdated definition. + +.. + +.. bpo: 42958 +.. date: 2021-07-15-11-19-03 +.. nonce: gC5IHM +.. section: Documentation + +Updated the docstring and docs of :func:`filecmp.cmp` to be more accurate +and less confusing especially in respect to *shallow* arg. + +.. + +.. bpo: 44631 +.. date: 2021-07-13-22-25-13 +.. nonce: qkGwe4 +.. section: Documentation + +Refactored the ``repr()`` code of the ``_Environ`` (os module). + +.. + +.. bpo: 44613 +.. date: 2021-07-12-11-39-20 +.. nonce: DIXNzc +.. section: Documentation + +importlib.metadata is no longer provisional. + +.. + +.. bpo: 44558 +.. date: 2021-07-03-18-25-17 +.. nonce: 0pTknl +.. section: Documentation + +Match the docstring and python implementation of :func:`~operator.countOf` +to the behavior of its c implementation. + +.. + +.. bpo: 44544 +.. date: 2021-07-02-14-02-29 +.. nonce: _5_aCz +.. section: Documentation + +List all kwargs for :func:`textwrap.wrap`, :func:`textwrap.fill`, and +:func:`textwrap.shorten`. Now, there are nav links to attributes of +:class:`TextWrap`, which makes navigation much easier while minimizing +duplication in the documentation. + +.. + +.. bpo: 38062 +.. date: 2021-06-28-12-13-48 +.. nonce: 9Ehp9O +.. section: Documentation + +Clarify that atexit uses equality comparisons internally. + +.. + +.. bpo: 40620 +.. date: 2021-06-26-17-41-06 +.. nonce: PAYDrB +.. section: Documentation + +Convert examples in tutorial controlflow.rst section 4.3 to be +interpreter-demo style. + +.. + +.. bpo: 43066 +.. date: 2021-06-24-14-37-16 +.. nonce: Ti7ahX +.. section: Documentation + +Added a warning to :mod:`zipfile` docs: filename arg with a leading slash +may cause archive to be un-openable on Windows systems. + +.. + +.. bpo: 39452 +.. date: 2021-06-23-15-21-36 +.. nonce: o_I-6d +.. section: Documentation + +Rewrote ``Doc/library/__main__.rst``. Broadened scope of the document to +explicitly discuss and differentiate between ``__main__.py`` in packages +versus the ``__name__ == '__main__'`` expression (and the idioms that +surround it). + +.. + +.. bpo: 13814 +.. date: 2021-06-21-15-46-32 +.. nonce: LDcslu +.. section: Documentation + +In the Design FAQ, answer "Why don't generators support the with statement?" + +.. + +.. bpo: 27752 +.. date: 2021-06-18-18-04-53 +.. nonce: NEByNk +.. section: Documentation + +Documentation of csv.Dialect is more descriptive. + +.. + +.. bpo: 44453 +.. date: 2021-06-18-06-44-45 +.. nonce: 3PIkj2 +.. section: Documentation + +Fix documentation for the return type of :func:`sysconfig.get_path`. + +.. + +.. bpo: 44392 +.. date: 2021-06-16-18-09-49 +.. nonce: 6RF1Sc +.. section: Documentation + +Added a new section in the C API documentation for types used in type +hinting. Documented ``Py_GenericAlias`` and ``Py_GenericAliasType``. + +.. + +.. bpo: 38291 +.. date: 2021-06-14-09-20-37 +.. nonce: VMYa_Q +.. section: Documentation + +Mark ``typing.io`` and ``typing.re`` as deprecated since Python 3.8 in the +documentation. They were never properly supported by type checkers. + +.. + +.. bpo: 44322 +.. date: 2021-06-06-14-12-00 +.. nonce: K0PHfE +.. section: Documentation + +Document that SyntaxError args have a details tuple and that details are +adjusted for errors in f-string field replacement expressions. + +.. + +.. bpo: 42392 +.. date: 2021-05-26-11-16-33 +.. nonce: oxRx6E +.. section: Documentation + +Document the deprecation and removal of the ``loop`` parameter for many +functions and classes in :mod:`asyncio`. + +.. + +.. bpo: 44195 +.. date: 2021-05-23-09-11-28 +.. nonce: 1bqkOs +.. section: Documentation + +Corrected references to ``TraversableResources`` in docs. There is no +``TraversableReader``. + +.. + +.. bpo: 41963 +.. date: 2021-05-17-20-03-47 +.. nonce: eUz9_o +.. section: Documentation + +Document that ``ConfigParser`` strips off comments when reading +configuration files. + +.. + +.. bpo: 44072 +.. date: 2021-05-08-09-48-05 +.. nonce: fb2x5I +.. section: Documentation + +Correct where in the numeric ABC hierarchy ``**`` support is added, i.e., in +numbers.Complex, not numbers.Integral. + +.. + +.. bpo: 43558 +.. date: 2021-05-07-12-27-09 +.. nonce: UGhA8R +.. section: Documentation + +Add the remark to :mod:`dataclasses` documentation that the :meth:`__init__` +of any base class has to be called in :meth:`__post_init__`, along with a +code example. + +.. + +.. bpo: 44025 +.. date: 2021-05-03-22-08-08 +.. nonce: gcB7iP +.. section: Documentation + +Clarify when '_' in match statements is a keyword, and when not. + +.. + +.. bpo: 41706 +.. date: 2020-09-03-13-37-19 +.. nonce: _zXWOR +.. section: Documentation + +Fix docs about how methods like ``__add__`` are invoked when evaluating +operator expressions. + +.. + +.. bpo: 41621 +.. date: 2020-08-24-13-35-04 +.. nonce: nqaw9G +.. section: Documentation + +Document that :class:`collections.defaultdict` parameter ``default_factory`` +defaults to None and is positional-only. + +.. + +.. bpo: 41576 +.. date: 2020-08-21-22-59-37 +.. nonce: 7a6CQR +.. section: Documentation + +document BaseException in favor of bare except + +.. + +.. bpo: 21760 +.. date: 2020-03-21-01-19-28 +.. nonce: CqofIc +.. section: Documentation + +The description for __file__ fixed. Patch by Furkan Onder + +.. + +.. bpo: 39498 +.. date: 2020-01-30-05-18-48 +.. nonce: Nu3sFL +.. section: Documentation + +Add a "Security Considerations" index which links to standard library +modules that have explicitly documented security considerations. + +.. + +.. bpo: 33479 +.. date: 2018-05-19-15-59-29 +.. nonce: 4cLlxo +.. section: Documentation + +Remove the unqualified claim that tkinter is threadsafe. It has not been +true for several years and likely never was. An explanation of what is true +may be added later, after more discussion, and possibly after patching +_tkinter.c, + +.. + +.. bpo: 40173 +.. date: 2021-09-30-16-54-39 +.. nonce: J_slCw +.. section: Tests + +Fix :func:`test.support.import_helper.import_fresh_module`. + +.. + +.. bpo: 45280 +.. date: 2021-09-25-11-05-31 +.. nonce: 3MA6lC +.. section: Tests + +Add a test case for empty :class:`typing.NamedTuple`. + +.. + +.. bpo: 45269 +.. date: 2021-09-24-10-41-49 +.. nonce: 8jKEr8 +.. section: Tests + +Cover case when invalid ``markers`` type is supplied to ``c_make_encoder``. + +.. + +.. bpo: 45128 +.. date: 2021-09-16-17-22-35 +.. nonce: Jz6fl2 +.. section: Tests + +Fix ``test_multiprocessing_fork`` failure due to ``test_logging`` and +``sys.modules`` manipulation. + +.. + +.. bpo: 45209 +.. date: 2021-09-15-23-32-39 +.. nonce: 55ntL5 +.. section: Tests + +Fix ``UserWarning: resource_tracker`` warning in +``_test_multiprocessing._TestSharedMemory.test_shared_memory_cleaned_after_process_termination`` + +.. + +.. bpo: 45185 +.. date: 2021-09-14-14-54-04 +.. nonce: qFx5I6 +.. section: Tests + +Enables ``TestEnumerations`` test cases in ``test_ssl`` suite. + +.. + +.. bpo: 45195 +.. date: 2021-09-14-13-16-18 +.. nonce: EyQR1G +.. section: Tests + +Fix test_readline.test_nonascii(): sometimes, the newline character is not +written at the end, so don't expect it in the output. Patch by Victor +Stinner. + +.. + +.. bpo: 45156 +.. date: 2021-09-13-00-28-17 +.. nonce: 8oomV3 +.. section: Tests + +Fixes infinite loop on :func:`unittest.mock.seal` of mocks created by +:func:`~unittest.create_autospec`. + +.. + +.. bpo: 45125 +.. date: 2021-09-11-22-08-18 +.. nonce: FVSzs2 +.. section: Tests + +Improves pickling tests and docs of ``SharedMemory`` and ``SharableList`` +objects. + +.. + +.. bpo: 44860 +.. date: 2021-09-08-13-01-37 +.. nonce: qXd0kx +.. section: Tests + +Update ``test_sysconfig.test_user_similar()`` for the posix_user scheme: +``platlib`` doesn't use :data:`sys.platlibdir`. Patch by Victor Stinner. + +.. + +.. bpo: 45052 +.. date: 2021-09-06-19-00-29 +.. nonce: yrOK3J +.. section: Tests + +``WithProcessesTestSharedMemory.test_shared_memory_basics`` test was +ignored, because ``self.assertEqual(sms.size, sms2.size)`` line was failing. +It is now removed and test is unskipped. + +The main motivation for this line to be removed from the test is that the +``size`` of ``SharedMemory`` is not ever guaranteed to be the same. It is +decided by the platform. + +.. + +.. bpo: 44895 +.. date: 2021-09-01-17-17-44 +.. nonce: kV7H77 +.. section: Tests + +libregrtest now clears the type cache later to reduce the risk of false +alarm when checking for reference leaks. Previously, the type cache was +cleared too early and libregrtest raised a false alarm about reference leaks +under very specific conditions. Patch by Irit Katriel and Victor Stinner. + +.. + +.. bpo: 45042 +.. date: 2021-08-30-11-54-14 +.. nonce: QMz3X8 +.. section: Tests + +Fixes that test classes decorated with +``@hashlib_helper.requires_hashdigest`` were skipped all the time. + +.. + +.. bpo: 25130 +.. date: 2021-08-27-22-37-19 +.. nonce: ig4oJe +.. section: Tests + +Add calls of :func:`gc.collect` in tests to support PyPy. + +.. + +.. bpo: 45011 +.. date: 2021-08-26-14-20-44 +.. nonce: mQZdXU +.. section: Tests + +Made tests relying on the :mod:`_asyncio` C extension module optional to +allow running on alternative Python implementations. Patch by Serhiy +Storchaka. + +.. + +.. bpo: 44949 +.. date: 2021-08-18-18-30-12 +.. nonce: VE5ENv +.. section: Tests + +Fix auto history tests of test_readline: sometimes, the newline character is +not written at the end, so don't expect it in the output. + +.. + +.. bpo: 44891 +.. date: 2021-08-13-12-11-06 +.. nonce: T9_mBT +.. section: Tests + +Tests were added to clarify :func:`id` is preserved when ``obj * 1`` is used +on :class:`str` and :class:`bytes` objects. Patch by Nikita Sobolev. + +.. + +.. bpo: 44852 +.. date: 2021-08-06-18-36-04 +.. nonce: sUL8YX +.. section: Tests + +Add ability to wholesale silence DeprecationWarnings while running the +regression test suite. + +.. + +.. bpo: 40928 +.. date: 2021-08-06-00-07-15 +.. nonce: aIwb6G +.. section: Tests + +Notify users running test_decimal regression tests on macOS of potential +harmless "malloc can't allocate region" messages spewed by test_decimal. + +.. + +.. bpo: 44734 +.. date: 2021-07-24-20-09-15 +.. nonce: KKsNOV +.. section: Tests + +Fixed floating point precision issue in turtle tests. + +.. + +.. bpo: 44708 +.. date: 2021-07-22-16-38-39 +.. nonce: SYNaac +.. section: Tests + +Regression tests, when run with -w, are now re-running only the affected +test methods instead of re-running the entire test file. + +.. + +.. bpo: 42095 +.. date: 2021-07-17-11-41-20 +.. nonce: kCB7oj +.. section: Tests + +Added interop tests for Apple plists: generate plist files with Python +plistlib and parse with Apple plutil; and the other way round. + +.. + +.. bpo: 44647 +.. date: 2021-07-16-14-02-33 +.. nonce: 5LzqIy +.. section: Tests + +Added a permanent Unicode-valued environment variable to regression tests to +ensure they handle this use case in the future. If your test environment +breaks because of that, report a bug to us, and temporarily set +PYTHONREGRTEST_UNICODE_GUARD=0 in your test environment. + +.. + +.. bpo: 44515 +.. date: 2021-06-26-18-37-36 +.. nonce: e9fO6f +.. section: Tests + +Adjust recently added contextlib tests to avoid assuming the use of a +refcounted GC + +.. + +.. bpo: 44287 +.. date: 2021-06-21-17-53-41 +.. nonce: YON57s +.. section: Tests + +Fix asyncio test_popen() of test_windows_utils by using a longer timeout. +Use military grade battle-tested :data:`test.support.SHORT_TIMEOUT` timeout +rather than a hardcoded timeout of 10 seconds: it's 30 seconds by default, +but it is made longer on slow buildbots. Patch by Victor Stinner. + +.. + +.. bpo: 44451 +.. date: 2021-06-18-15-19-35 +.. nonce: aj5pqE +.. section: Tests + +Reset ``DeprecationWarning`` filters in +``test.test_importlib.test_metadata_api.APITests.test_entry_points_by_index`` +to avoid ``StopIteration`` error if ``DeprecationWarnings`` are ignored. + +.. + +.. bpo: 44363 +.. date: 2021-06-10-11-19-43 +.. nonce: -K9jD0 +.. section: Tests + +Account for address sanitizer in test_capi. test_capi now passes when run +GCC address sanitizer. + +.. + +.. bpo: 44364 +.. date: 2021-06-09-15-32-05 +.. nonce: zu9Zee +.. section: Tests + +Add non integral tests for :func:`math.sqrt` function. + +.. + +.. bpo: 43921 +.. date: 2021-06-03-03-29-34 +.. nonce: nwH1FS +.. section: Tests + +Fix test_ssl.test_wrong_cert_tls13(): use ``suppress_ragged_eofs=False``, +since ``read()`` can raise :exc:`ssl.SSLEOFError` on Windows. Patch by +Victor Stinner. + +.. + +.. bpo: 43921 +.. date: 2021-06-02-17-41-42 +.. nonce: xP7yZ4 +.. section: Tests + +Fix test_pha_required_nocert() of test_ssl: catch two more EOF cases (when +the ``recv()`` method returns an empty string). Patch by Victor Stinner. + +.. + +.. bpo: 44131 +.. date: 2021-05-14-14-13-44 +.. nonce: YPizoC +.. section: Tests + +Add test_frozenmain to test_embed to test the :c:func:`Py_FrozenMain` C +function. Patch by Victor Stinner. + +.. + +.. bpo: 31904 +.. date: 2021-05-07-15-46-04 +.. nonce: 8dk3la +.. section: Tests + +Ignore error string case in test_file_not_exists(). + +.. + +.. bpo: 42083 +.. date: 2021-05-04-18-10-57 +.. nonce: EMS2TK +.. section: Tests + +Add test to check that ``PyStructSequence_NewType`` accepts a +``PyStructSequence_Desc`` with ``doc`` field set to ``NULL``. + +.. + +.. bpo: 35753 +.. date: 2020-10-25-19-20-26 +.. nonce: 2LT-hO +.. section: Tests + +Fix crash in doctest when doctest parses modules that include unwrappable +functions by skipping those functions. + +.. + +.. bpo: 30256 +.. date: 2019-09-25-18-10-10 +.. nonce: A5i76Q +.. section: Tests + +Add test for nested queues when using ``multiprocessing`` shared objects +``AutoProxy[Queue]`` inside ``ListProxy`` and ``DictProxy`` + +.. + +.. bpo: 45220 +.. date: 2021-09-16-18-00-43 +.. nonce: TgbkvW +.. section: Build + +Avoid building with the Windows 11 SDK previews automatically. This may be +overridden by setting the ``DefaultWindowsSDKVersion`` environment variable +before building. + +.. + +.. bpo: 45020 +.. date: 2021-09-14-10-07-23 +.. nonce: _VGGPv +.. section: Build + +Freeze stdlib modules that are imported during startup. This provides +significant performance improvements to startup. If necessary, use the +previously added "-X frozen_modules=off" commandline option to force +importing the source modules. + +.. + +.. bpo: 45188 +.. date: 2021-09-14-00-47-57 +.. nonce: MNbo_T +.. section: Build + +Windows builds now regenerate frozen modules as the first part of the build. +Previously the regeneration was later in the build, which would require it +to be restarted if any modules had changed. + +.. + +.. bpo: 45163 +.. date: 2021-09-11-06-05-23 +.. nonce: q7xT93 +.. section: Build + +Fixes Haiku platform build. + +.. + +.. bpo: 45067 +.. date: 2021-09-09-16-45-26 +.. nonce: mFmY92 +.. section: Build + +The ncurses function extended_color_content was introduced in 2017 + +(https://invisible-island.net/ncurses/NEWS.html#index-t20170401). The + +ncurses-devel package in CentOS 7 had a older version ncurses resulted in +compilation error. For compiling ncurses with extended color support, we +verify the version of the ncurses library >= 20170401. + +.. + +.. bpo: 45019 +.. date: 2021-08-26-13-10-46 +.. nonce: e0mo49 +.. section: Build + +Generate lines in relevant files for frozen modules. Up until now each of +the files had to be edited manually. This change makes it easier to add to +and modify the frozen modules. + +.. + +.. bpo: 44340 +.. date: 2021-07-19-01-09-56 +.. nonce: JNeOf4 +.. section: Build + +Add support for building with clang thin lto via --with-lto=thin/full. Patch +by Dong-hee Na and Brett Holman. + +.. + +.. bpo: 44535 +.. date: 2021-06-30-02-32-46 +.. nonce: M9iN4- +.. section: Build + +Enable building using a Visual Studio 2022 install on Windows. + +.. + +.. bpo: 43298 +.. date: 2021-06-19-11-50-03 +.. nonce: 9ircMb +.. section: Build + +Improved error message when building without a Windows SDK installed. + +.. + +.. bpo: 44381 +.. date: 2021-06-10-18-08-44 +.. nonce: Xpc1iX +.. section: Build + +The Windows build now accepts :envvar:`EnableControlFlowGuard` set to +``guard`` to enable CFG. + +.. + +.. bpo: 41282 +.. date: 2021-05-24-03-31-17 +.. nonce: L8nP44 +.. section: Build + +Fix broken ``make install`` that caused standard library extension modules +to be unnecessarily and incorrectly rebuilt during the install phase of +cpython. + +.. + +.. bpo: 45375 +.. date: 2021-10-05-12-41-53 +.. nonce: CohPP- +.. section: Windows + +Fixes an assertion failure due to searching for the standard library in +unnormalised paths. + +.. + +.. bpo: 45022 +.. date: 2021-09-03-18-05-21 +.. nonce: bgpD_r +.. section: Windows + +Update Windows release to include libffi 3.4.2 + +.. + +.. bpo: 45007 +.. date: 2021-08-27-23-50-02 +.. nonce: NIBlVG +.. section: Windows + +Update to OpenSSL 1.1.1l in Windows build + +.. + +.. bpo: 44848 +.. date: 2021-08-06-10-11-07 +.. nonce: ib3Jcz +.. section: Windows + +Upgrade Windows installer to use SQLite 3.36.0. + +.. + +.. bpo: 44572 +.. date: 2021-07-13-15-32-49 +.. nonce: gXvhDc +.. section: Windows + +Avoid consuming standard input in the :mod:`platform` module + +.. + +.. bpo: 44582 +.. date: 2021-07-07-21-07-18 +.. nonce: 4Mm6Hh +.. section: Windows + +Accelerate speed of :mod:`mimetypes` initialization using a native +implementation of the registry scan. + +.. + +.. bpo: 41299 +.. date: 2021-06-06-16-36-13 +.. nonce: Rg-vb_ +.. section: Windows + +Fix 16 milliseconds jitter when using timeouts in :mod:`threading`, such as +with :meth:`threading.Lock.acquire` or :meth:`threading.Condition.wait`. + +.. + +.. bpo: 42686 +.. date: 2021-01-01-21-21-03 +.. nonce: G_f-TC +.. section: Windows + +Build :mod:`sqlite3` with math functions enabled. Patch by Erlend E. +Aasland. + +.. + +.. bpo: 40263 +.. date: 2020-04-13-15-20-28 +.. nonce: 1KKEbu +.. section: Windows + +This is a follow-on bug from https://bugs.python.org/issue26903. Once that +is applied we run into an off-by-one assertion problem. The assert was not +correct. + +.. + +.. bpo: 45007 +.. date: 2021-08-30-00-04-10 +.. nonce: pixqUB +.. section: macOS + +Update macOS installer builds to use OpenSSL 1.1.1l. + +.. + +.. bpo: 34602 +.. date: 2021-08-27-16-55-10 +.. nonce: ZjHsYJ +.. section: macOS + +When building CPython on macOS with ``./configure +--with-undefined-behavior-sanitizer --with-pydebug``, the stack size is now +quadrupled to allow for the entire test suite to pass. + +.. + +.. bpo: 44848 +.. date: 2021-08-06-10-08-41 +.. nonce: 0uYXsE +.. section: macOS + +Update macOS installer to use SQLite 3.36.0. + +.. + +.. bpo: 44689 +.. date: 2021-07-20-22-27-01 +.. nonce: mmT_xH +.. section: macOS + +:meth:`ctypes.util.find_library` now works correctly on macOS 11 Big Sur +even if Python is built on an older version of macOS. Previously, when +built on older macOS systems, ``find_library`` was not able to find macOS +system libraries when running on Big Sur due to changes in how system +libraries are stored. + +.. + +.. bpo: 41972 +.. date: 2021-07-12-15-42-02 +.. nonce: yUjE8j +.. section: macOS + +The framework build's user header path in sysconfig is changed to add a +'pythonX.Y' component to match distutils's behavior. + +.. + +.. bpo: 43109 +.. date: 2021-05-24-21-15-41 +.. nonce: npKJ9c +.. section: macOS + +Allow --with-lto configure option to work with Apple-supplied Xcode or +Command Line Tools. + +.. + +.. bpo: 34932 +.. date: 2021-03-29-21-11-23 +.. nonce: f3Hdyd +.. section: macOS + +Add socket.TCP_KEEPALIVE support for macOS. Patch by Shane Harvey. + +.. + +.. bpo: 45296 +.. date: 2021-09-27-01-21-59 +.. nonce: 9H8rdY +.. section: IDLE + +On Windows, change exit/quit message to suggest Ctrl-D, which works, instead +of , which does not work in IDLE. + +.. + +.. bpo: 45193 +.. date: 2021-09-15-03-20-06 +.. nonce: G61_GV +.. section: IDLE + +Make completion boxes appear on Ubuntu again. + +.. + +.. bpo: 40128 +.. date: 2021-06-11-17-43-39 +.. nonce: 7vDN3U +.. section: IDLE + +Mostly fix completions on macOS when not using tcl/tk 8.6.11 (as with 3.9). +The added update_idletask call should be harmless and possibly helpful +otherwise. + +.. + +.. bpo: 33962 +.. date: 2021-06-10-00-50-02 +.. nonce: ikAUNg +.. section: IDLE + +Move the indent space setting from the Font tab to the new Windows tab. +Patch by Mark Roseman and Terry Jan Reedy. + +.. + +.. bpo: 40468 +.. date: 2021-06-08-03-04-51 +.. nonce: tUCGUb +.. section: IDLE + +Split the settings dialog General tab into Windows and Shell/ED tabs. Move +help sources, which extend the Help menu, to the Extensions tab. Make space +for new options and shorten the dialog. The latter makes the dialog better +fit small screens. + +.. + +.. bpo: 41611 +.. date: 2021-05-27-18-22-46 +.. nonce: jOKpfc +.. section: IDLE + +Avoid uncaught exceptions in ``AutoCompleteWindow.winconfig_event()``. + +.. + +.. bpo: 41611 +.. date: 2021-05-27-13-39-43 +.. nonce: liNQqj +.. section: IDLE + +Fix IDLE sometimes freezing upon tab-completion on macOS. + +.. + +.. bpo: 44010 +.. date: 2021-05-09-09-02-09 +.. nonce: TaLe9x +.. section: IDLE + +Highlight the new :ref:`match ` statement's :ref:`soft keywords +`: :keyword:`match`, :keyword:`case `, and :keyword:`_ +`. However, this highlighting is not perfect and will be +incorrect in some rare cases, including some ``_``-s in ``case`` patterns. + +.. + +.. bpo: 44026 +.. date: 2021-05-05-09-45-24 +.. nonce: m2Z0zR +.. section: IDLE + +Include interpreter's typo fix suggestions in message line for NameErrors +and AttributeErrors. Patch by E. Paine. + +.. + +.. bpo: 44786 +.. date: 2021-09-14-11-44-26 +.. nonce: DU0LC0 +.. section: Tools/Demos + +Fix a warning in regular expression in the c-analyzer script. + +.. + +.. bpo: 44967 +.. date: 2021-08-26-11-57-31 +.. nonce: UT1RMV +.. section: Tools/Demos + +pydoc now returns a non-zero status code when a module cannot be found. + +.. + +.. bpo: 44978 +.. date: 2021-08-22-11-45-31 +.. nonce: QupKV3 +.. section: Tools/Demos + +Allow the Argument Clinic tool to handle ``__complex__`` special methods. + +.. + +.. bpo: 43425 +.. date: 2021-07-01-22-21-25 +.. nonce: t65len +.. section: Tools/Demos + +Removed the 'test2to3' demo project that demonstrated using lib2to3 to +support Python 2.x and Python 3.x from a single source in a distutils +package. Patch by Dong-hee Na + +.. + +.. bpo: 44074 +.. date: 2021-05-08-13-57-00 +.. nonce: F09kCK +.. section: Tools/Demos + +Make patchcheck automatically detect the correct base branch name +(previously it was hardcoded to 'master') + +.. + +.. bpo: 20291 +.. date: 2020-02-25-18-22-09 +.. nonce: AyrDiZ +.. section: Tools/Demos + +Added support for variadic positional parameters in Argument Clinic. + +.. + +.. bpo: 41710 +.. date: 2021-09-30-03-14-35 +.. nonce: DDWJKx +.. section: C API + +The PyThread_acquire_lock_timed() function now clamps the timeout if it is +too large, rather than aborting the process. Patch by Victor Stinner. + +.. + +.. bpo: 44687 +.. date: 2021-09-19-17-18-25 +.. nonce: 3fqDRC +.. section: C API + +:meth:`BufferedReader.peek` no longer raises :exc:`ValueError` when the +entire file has already been buffered. + +.. + +.. bpo: 45116 +.. date: 2021-09-16-18-05-20 +.. nonce: WxXewl +.. section: C API + +Add the :c:macro:`Py_ALWAYS_INLINE` macro to ask the compiler to always +inline a static inline function. The compiler can ignore it and decides to +not inline the function. Patch by Victor Stinner. + +.. + +.. bpo: 45094 +.. date: 2021-09-03-15-53-43 +.. nonce: tinXwL +.. section: C API + +Add the :c:macro:`Py_NO_INLINE` macro to disable inlining on a function. +Patch by Victor Stinner. + +.. + +.. bpo: 45061 +.. date: 2021-08-31-15-21-36 +.. nonce: ZH0HVe +.. section: C API + +Add a deallocator to the :class:`bool` type to detect refcount bugs in C +extensions which call ``Py_DECREF(Py_True);`` or ``Py_DECREF(Py_False);`` by +mistake. Patch by Victor Stinner. + +.. + +.. bpo: 42035 +.. date: 2021-08-02-20-49-36 +.. nonce: HTBcZt +.. section: C API + +Add a new :c:func:`PyType_GetQualName` function to get type's qualified +name. + +.. + +.. bpo: 41103 +.. date: 2021-07-29-16-04-28 +.. nonce: hiKKcF +.. section: C API + +Reverts removal of the old buffer protocol because they are part of stable +ABI. + +.. + +.. bpo: 44751 +.. date: 2021-07-27-17-29-12 +.. nonce: 4qmbDG +.. section: C API + +Remove ``crypt.h`` include from the public ``Python.h`` header. + +.. + +.. bpo: 42747 +.. date: 2021-07-20-16-21-06 +.. nonce: rRxjUY +.. section: C API + +The ``Py_TPFLAGS_HAVE_VERSION_TAG`` type flag now does nothing. The +``Py_TPFLAGS_HAVE_AM_SEND`` flag (which was added in 3.10) is removed. Both +were unnecessary because it is not possible to have type objects with the +relevant fields missing. + +.. + +.. bpo: 44530 +.. date: 2021-06-28-23-44-47 +.. nonce: qij7YC +.. section: C API + +Added the ``co_qualname`` to the ``PyCodeObject`` structure to propagate the +qualified name from the compiler to code objects. + +Patch by Gabriele N. Tornetta + +.. + +.. bpo: 44441 +.. date: 2021-06-23-12-12-04 +.. nonce: 3p14JB +.. section: C API + +:c:func:`Py_RunMain` now resets :c:data:`PyImport_Inittab` to its initial +value at exit. It must be possible to call :c:func:`PyImport_AppendInittab` +or :c:func:`PyImport_ExtendInittab` at each Python initialization. Patch by +Victor Stinner. + +.. + +.. bpo: 39947 +.. date: 2021-06-23-10-31-45 +.. nonce: je_HMo +.. section: C API + +Remove 4 private trashcan C API functions which were only kept for the +backward compatibility of the stable ABI with Python 3.8 and older, since +the trashcan API was not usable with the limited C API on Python 3.8 and +older. The trashcan API was excluded from the limited C API in Python 3.9. + +Removed functions: + +* _PyTrash_deposit_object() +* _PyTrash_destroy_chain() +* _PyTrash_thread_deposit_object() +* _PyTrash_thread_destroy_chain() + +The trashcan C API was never usable with the limited C API, since old +trashcan macros accessed directly :c:type:`PyThreadState` members like +``_tstate->trash_delete_nesting``, whereas the :c:type:`PyThreadState` +structure is opaque in the limited C API. + +Exclude also the the ``PyTrash_UNWIND_LEVEL`` constant from the C API. + +Patch by Victor Stinner. + +.. + +.. bpo: 40939 +.. date: 2021-06-22-17-00-06 +.. nonce: CGB0I5 +.. section: C API + +Removed documentation for the removed ``PyParser_*`` C API. + +.. + +.. bpo: 43795 +.. date: 2021-06-15-16-28-18 +.. nonce: fy0AXK +.. section: C API + +The list in :ref:`stable-abi-list` now shows the public name +:c:struct:`PyFrameObject` rather than ``_frame``. The non-existing entry +``_node`` no longer appears in the list. + +.. + +.. bpo: 44378 +.. date: 2021-06-10-15-22-31 +.. nonce: jGYakF +.. section: C API + +:c:func:`Py_IS_TYPE` no longer uses :c:func:`Py_TYPE` to avoid a compiler +warning: no longer cast ``const PyObject*`` to ``PyObject*``. Patch by +Victor Stinner. + +.. + +.. bpo: 39573 +.. date: 2021-06-03-00-59-48 +.. nonce: -elHTJ +.. section: C API + +Convert the :c:func:`Py_TYPE` and :c:func:`Py_SIZE` macros to static inline +functions. The :c:func:`Py_SET_TYPE` and :c:func:`Py_SET_SIZE` functions +must now be used to set an object type and size. Patch by Victor Stinner. + +.. + +.. bpo: 44263 +.. date: 2021-05-31-11-31-13 +.. nonce: 8mIOfV +.. section: C API + +The :c:func:`PyType_Ready` function now raises an error if a type is defined +with the :const:`Py_TPFLAGS_HAVE_GC` flag set but has no traverse function +(:c:member:`PyTypeObject.tp_traverse`). Patch by Victor Stinner. + +.. + +.. bpo: 43795 +.. date: 2021-05-19-15-09-47 +.. nonce: WAHRxt +.. section: C API + +The undocumented function :c:func:`Py_FrozenMain` is removed from the +Limited API. + +.. + +.. bpo: 44113 +.. date: 2021-05-12-12-24-45 +.. nonce: DcgOqE +.. section: C API + +Deprecate the following functions to configure the Python initialization: + +* :c:func:`PySys_AddWarnOptionUnicode` +* :c:func:`PySys_AddWarnOption` +* :c:func:`PySys_AddXOption` +* :c:func:`PySys_HasWarnOptions` +* :c:func:`Py_SetPath` +* :c:func:`Py_SetProgramName` +* :c:func:`Py_SetPythonHome` +* :c:func:`Py_SetStandardStreamEncoding` +* :c:func:`_Py_SetProgramFullPath` + +Use the new :c:type:`PyConfig` API of the :ref:`Python Initialization +Configuration ` instead (:pep:`587`). + +.. + +.. bpo: 44094 +.. date: 2021-05-10-14-34-22 +.. nonce: HayXZO +.. section: C API + +Remove ``PyErr_SetFromErrnoWithUnicodeFilename()``, +``PyErr_SetFromWindowsErrWithUnicodeFilename()``, and +``PyErr_SetExcFromWindowsErrWithUnicodeFilename()``. They are not documented +and have been deprecated since Python 3.3. + +.. + +.. bpo: 43795 +.. date: 2021-05-05-19-04-50 +.. nonce: 9Ojj73 +.. section: C API + +:c:func:`PyCodec_Unregister` is now properly exported as a function in the +Windows Stable ABI DLL. + +.. + +.. bpo: 44029 +.. date: 2021-05-04-17-43-39 +.. nonce: ayX4PR +.. section: C API + +Remove deprecated ``Py_UNICODE`` APIs: ``PyUnicode_Encode``, +``PyUnicode_EncodeUTF7``, ``PyUnicode_EncodeUTF8``, +``PyUnicode_EncodeUTF16``, ``PyUnicode_EncodeUTF32``, +``PyUnicode_EncodeLatin1``, ``PyUnicode_EncodeMBCS``, +``PyUnicode_EncodeDecimal``, ``PyUnicode_EncodeRawUnicodeEscape``, +``PyUnicode_EncodeCharmap``, ``PyUnicode_EncodeUnicodeEscape``, +``PyUnicode_TransformDecimalToASCII``, ``PyUnicode_TranslateCharmap``, +``PyUnicodeEncodeError_Create``, ``PyUnicodeTranslateError_Create``. See +:pep:`393` and :pep:`624` for reference. + +.. + +.. bpo: 42035 +.. date: 2020-12-23-01-28-50 +.. nonce: S9eUm0 +.. section: C API + +Add a new :c:func:`PyType_GetName` function to get type's short name. diff --git a/Misc/NEWS.d/next/Build/2021-05-24-03-31-17.bpo-41282.L8nP44.rst b/Misc/NEWS.d/next/Build/2021-05-24-03-31-17.bpo-41282.L8nP44.rst deleted file mode 100644 index cc6eadefc6cba7..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-05-24-03-31-17.bpo-41282.L8nP44.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix broken ``make install`` that caused standard library extension modules -to be unnecessarily and incorrectly rebuilt during the install phase of -cpython. diff --git a/Misc/NEWS.d/next/Build/2021-06-10-18-08-44.bpo-44381.Xpc1iX.rst b/Misc/NEWS.d/next/Build/2021-06-10-18-08-44.bpo-44381.Xpc1iX.rst deleted file mode 100644 index 002112c4b55674..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-06-10-18-08-44.bpo-44381.Xpc1iX.rst +++ /dev/null @@ -1,2 +0,0 @@ -The Windows build now accepts :envvar:`EnableControlFlowGuard` set to -``guard`` to enable CFG. diff --git a/Misc/NEWS.d/next/Build/2021-06-19-11-50-03.bpo-43298.9ircMb.rst b/Misc/NEWS.d/next/Build/2021-06-19-11-50-03.bpo-43298.9ircMb.rst deleted file mode 100644 index 3bdc24b147a3ef..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-06-19-11-50-03.bpo-43298.9ircMb.rst +++ /dev/null @@ -1 +0,0 @@ -Improved error message when building without a Windows SDK installed. diff --git a/Misc/NEWS.d/next/Build/2021-06-30-02-32-46.bpo-44535.M9iN4-.rst b/Misc/NEWS.d/next/Build/2021-06-30-02-32-46.bpo-44535.M9iN4-.rst deleted file mode 100644 index e06d0d304852f3..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-06-30-02-32-46.bpo-44535.M9iN4-.rst +++ /dev/null @@ -1 +0,0 @@ -Enable building using a Visual Studio 2022 install on Windows. diff --git a/Misc/NEWS.d/next/Build/2021-07-19-01-09-56.bpo-44340.JNeOf4.rst b/Misc/NEWS.d/next/Build/2021-07-19-01-09-56.bpo-44340.JNeOf4.rst deleted file mode 100644 index cf19eb6052e8db..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-07-19-01-09-56.bpo-44340.JNeOf4.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add support for building with clang thin lto via --with-lto=thin/full. Patch -by Dong-hee Na and Brett Holman. diff --git a/Misc/NEWS.d/next/Build/2021-08-26-13-10-46.bpo-45019.e0mo49.rst b/Misc/NEWS.d/next/Build/2021-08-26-13-10-46.bpo-45019.e0mo49.rst deleted file mode 100644 index d11c6451462bd5..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-08-26-13-10-46.bpo-45019.e0mo49.rst +++ /dev/null @@ -1,3 +0,0 @@ -Generate lines in relevant files for frozen modules. Up until now each of -the files had to be edited manually. This change makes it easier to add to -and modify the frozen modules. diff --git a/Misc/NEWS.d/next/Build/2021-09-09-16-45-26.bpo-45067.mFmY92.rst b/Misc/NEWS.d/next/Build/2021-09-09-16-45-26.bpo-45067.mFmY92.rst deleted file mode 100644 index a89736eb33e82b..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-09-09-16-45-26.bpo-45067.mFmY92.rst +++ /dev/null @@ -1,7 +0,0 @@ -The ncurses function extended_color_content was introduced in 2017 - -(https://invisible-island.net/ncurses/NEWS.html#index-t20170401). The - -ncurses-devel package in CentOS 7 had a older version ncurses resulted in -compilation error. For compiling ncurses with extended color support, we -verify the version of the ncurses library >= 20170401. diff --git a/Misc/NEWS.d/next/Build/2021-09-11-06-05-23.bpo-45163.q7xT93.rst b/Misc/NEWS.d/next/Build/2021-09-11-06-05-23.bpo-45163.q7xT93.rst deleted file mode 100644 index 2b656bcbc230bc..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-09-11-06-05-23.bpo-45163.q7xT93.rst +++ /dev/null @@ -1 +0,0 @@ -Fixes Haiku platform build. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Build/2021-09-14-00-47-57.bpo-45188.MNbo_T.rst b/Misc/NEWS.d/next/Build/2021-09-14-00-47-57.bpo-45188.MNbo_T.rst deleted file mode 100644 index df470e8eeb30c0..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-09-14-00-47-57.bpo-45188.MNbo_T.rst +++ /dev/null @@ -1,3 +0,0 @@ -Windows builds now regenerate frozen modules as the first part of the build. -Previously the regeneration was later in the build, which would require it -to be restarted if any modules had changed. diff --git a/Misc/NEWS.d/next/Build/2021-09-14-10-07-23.bpo-45020._VGGPv.rst b/Misc/NEWS.d/next/Build/2021-09-14-10-07-23.bpo-45020._VGGPv.rst deleted file mode 100644 index 67d61c3f880403..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-09-14-10-07-23.bpo-45020._VGGPv.rst +++ /dev/null @@ -1,4 +0,0 @@ -Freeze stdlib modules that are imported during startup. This provides -significant performance improvements to startup. If necessary, use the -previously added "-X frozen_modules=off" commandline option to force -importing the source modules. diff --git a/Misc/NEWS.d/next/Build/2021-09-16-18-00-43.bpo-45220.TgbkvW.rst b/Misc/NEWS.d/next/Build/2021-09-16-18-00-43.bpo-45220.TgbkvW.rst deleted file mode 100644 index 8bbd634fa61a37..00000000000000 --- a/Misc/NEWS.d/next/Build/2021-09-16-18-00-43.bpo-45220.TgbkvW.rst +++ /dev/null @@ -1,3 +0,0 @@ -Avoid building with the Windows 11 SDK previews automatically. This may be -overridden by setting the ``DefaultWindowsSDKVersion`` environment variable -before building. diff --git a/Misc/NEWS.d/next/C API/2020-12-23-01-28-50.bpo-42035.S9eUm0.rst b/Misc/NEWS.d/next/C API/2020-12-23-01-28-50.bpo-42035.S9eUm0.rst deleted file mode 100644 index 8adb20e62d1c46..00000000000000 --- a/Misc/NEWS.d/next/C API/2020-12-23-01-28-50.bpo-42035.S9eUm0.rst +++ /dev/null @@ -1 +0,0 @@ -Add a new :c:func:`PyType_GetName` function to get type's short name. diff --git a/Misc/NEWS.d/next/C API/2021-05-04-17-43-39.bpo-44029.ayX4PR.rst b/Misc/NEWS.d/next/C API/2021-05-04-17-43-39.bpo-44029.ayX4PR.rst deleted file mode 100644 index cf55e41bf332c7..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-05-04-17-43-39.bpo-44029.ayX4PR.rst +++ /dev/null @@ -1,9 +0,0 @@ -Remove deprecated ``Py_UNICODE`` APIs: ``PyUnicode_Encode``, -``PyUnicode_EncodeUTF7``, ``PyUnicode_EncodeUTF8``, -``PyUnicode_EncodeUTF16``, ``PyUnicode_EncodeUTF32``, -``PyUnicode_EncodeLatin1``, ``PyUnicode_EncodeMBCS``, -``PyUnicode_EncodeDecimal``, ``PyUnicode_EncodeRawUnicodeEscape``, -``PyUnicode_EncodeCharmap``, ``PyUnicode_EncodeUnicodeEscape``, -``PyUnicode_TransformDecimalToASCII``, ``PyUnicode_TranslateCharmap``, -``PyUnicodeEncodeError_Create``, ``PyUnicodeTranslateError_Create``. See -:pep:`393` and :pep:`624` for reference. diff --git a/Misc/NEWS.d/next/C API/2021-05-05-19-04-50.bpo-43795.9Ojj73.rst b/Misc/NEWS.d/next/C API/2021-05-05-19-04-50.bpo-43795.9Ojj73.rst deleted file mode 100644 index 20a3823f1f01c0..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-05-05-19-04-50.bpo-43795.9Ojj73.rst +++ /dev/null @@ -1,2 +0,0 @@ -:c:func:`PyCodec_Unregister` is now properly exported as a function in the -Windows Stable ABI DLL. diff --git a/Misc/NEWS.d/next/C API/2021-05-10-14-34-22.bpo-44094.HayXZO.rst b/Misc/NEWS.d/next/C API/2021-05-10-14-34-22.bpo-44094.HayXZO.rst deleted file mode 100644 index eea9e0bf282081..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-05-10-14-34-22.bpo-44094.HayXZO.rst +++ /dev/null @@ -1,4 +0,0 @@ -Remove ``PyErr_SetFromErrnoWithUnicodeFilename()``, -``PyErr_SetFromWindowsErrWithUnicodeFilename()``, and -``PyErr_SetExcFromWindowsErrWithUnicodeFilename()``. They are not documented -and have been deprecated since Python 3.3. diff --git a/Misc/NEWS.d/next/C API/2021-05-12-12-24-45.bpo-44113.DcgOqE.rst b/Misc/NEWS.d/next/C API/2021-05-12-12-24-45.bpo-44113.DcgOqE.rst deleted file mode 100644 index 45f67efa10573b..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-05-12-12-24-45.bpo-44113.DcgOqE.rst +++ /dev/null @@ -1,14 +0,0 @@ -Deprecate the following functions to configure the Python initialization: - -* :c:func:`PySys_AddWarnOptionUnicode` -* :c:func:`PySys_AddWarnOption` -* :c:func:`PySys_AddXOption` -* :c:func:`PySys_HasWarnOptions` -* :c:func:`Py_SetPath` -* :c:func:`Py_SetProgramName` -* :c:func:`Py_SetPythonHome` -* :c:func:`Py_SetStandardStreamEncoding` -* :c:func:`_Py_SetProgramFullPath` - -Use the new :c:type:`PyConfig` API of the :ref:`Python Initialization -Configuration ` instead (:pep:`587`). diff --git a/Misc/NEWS.d/next/C API/2021-05-19-15-09-47.bpo-43795.WAHRxt.rst b/Misc/NEWS.d/next/C API/2021-05-19-15-09-47.bpo-43795.WAHRxt.rst deleted file mode 100644 index 23db2330ac3960..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-05-19-15-09-47.bpo-43795.WAHRxt.rst +++ /dev/null @@ -1 +0,0 @@ -The undocumented function :c:func:`Py_FrozenMain` is removed from the Limited API. diff --git a/Misc/NEWS.d/next/C API/2021-05-31-11-31-13.bpo-44263.8mIOfV.rst b/Misc/NEWS.d/next/C API/2021-05-31-11-31-13.bpo-44263.8mIOfV.rst deleted file mode 100644 index aa831a2083c48f..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-05-31-11-31-13.bpo-44263.8mIOfV.rst +++ /dev/null @@ -1,4 +0,0 @@ -The :c:func:`PyType_Ready` function now raises an error if a type is defined -with the :const:`Py_TPFLAGS_HAVE_GC` flag set but has no traverse function -(:c:member:`PyTypeObject.tp_traverse`). -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2021-06-03-00-59-48.bpo-39573.-elHTJ.rst b/Misc/NEWS.d/next/C API/2021-06-03-00-59-48.bpo-39573.-elHTJ.rst deleted file mode 100644 index d9641ed97e170d..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-06-03-00-59-48.bpo-39573.-elHTJ.rst +++ /dev/null @@ -1,3 +0,0 @@ -Convert the :c:func:`Py_TYPE` and :c:func:`Py_SIZE` macros to static inline -functions. The :c:func:`Py_SET_TYPE` and :c:func:`Py_SET_SIZE` functions -must now be used to set an object type and size. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2021-06-10-15-22-31.bpo-44378.jGYakF.rst b/Misc/NEWS.d/next/C API/2021-06-10-15-22-31.bpo-44378.jGYakF.rst deleted file mode 100644 index b620b499f23512..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-06-10-15-22-31.bpo-44378.jGYakF.rst +++ /dev/null @@ -1,3 +0,0 @@ -:c:func:`Py_IS_TYPE` no longer uses :c:func:`Py_TYPE` to avoid a compiler -warning: no longer cast ``const PyObject*`` to ``PyObject*``. -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2021-06-15-16-28-18.bpo-43795.fy0AXK.rst b/Misc/NEWS.d/next/C API/2021-06-15-16-28-18.bpo-43795.fy0AXK.rst deleted file mode 100644 index 8d029a04579086..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-06-15-16-28-18.bpo-43795.fy0AXK.rst +++ /dev/null @@ -1,3 +0,0 @@ -The list in :ref:`stable-abi-list` now shows the public name -:c:struct:`PyFrameObject` rather than ``_frame``. The non-existing -entry ``_node`` no longer appears in the list. diff --git a/Misc/NEWS.d/next/C API/2021-06-22-17-00-06.bpo-40939.CGB0I5.rst b/Misc/NEWS.d/next/C API/2021-06-22-17-00-06.bpo-40939.CGB0I5.rst deleted file mode 100644 index 2531ac1ba3c12c..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-06-22-17-00-06.bpo-40939.CGB0I5.rst +++ /dev/null @@ -1 +0,0 @@ -Removed documentation for the removed ``PyParser_*`` C API. diff --git a/Misc/NEWS.d/next/C API/2021-06-23-10-31-45.bpo-39947.je_HMo.rst b/Misc/NEWS.d/next/C API/2021-06-23-10-31-45.bpo-39947.je_HMo.rst deleted file mode 100644 index 43adbffc7cce24..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-06-23-10-31-45.bpo-39947.je_HMo.rst +++ /dev/null @@ -1,20 +0,0 @@ -Remove 4 private trashcan C API functions which were only kept for the backward -compatibility of the stable ABI with Python 3.8 and older, since the trashcan -API was not usable with the limited C API on Python 3.8 and older. The -trashcan API was excluded from the limited C API in Python 3.9. - -Removed functions: - -* _PyTrash_deposit_object() -* _PyTrash_destroy_chain() -* _PyTrash_thread_deposit_object() -* _PyTrash_thread_destroy_chain() - -The trashcan C API was never usable with the limited C API, since old trashcan -macros accessed directly :c:type:`PyThreadState` members like -``_tstate->trash_delete_nesting``, whereas the :c:type:`PyThreadState` -structure is opaque in the limited C API. - -Exclude also the the ``PyTrash_UNWIND_LEVEL`` constant from the C API. - -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2021-06-23-12-12-04.bpo-44441.3p14JB.rst b/Misc/NEWS.d/next/C API/2021-06-23-12-12-04.bpo-44441.3p14JB.rst deleted file mode 100644 index 80c4282c18ea64..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-06-23-12-12-04.bpo-44441.3p14JB.rst +++ /dev/null @@ -1,4 +0,0 @@ -:c:func:`Py_RunMain` now resets :c:data:`PyImport_Inittab` to its initial value -at exit. It must be possible to call :c:func:`PyImport_AppendInittab` or -:c:func:`PyImport_ExtendInittab` at each Python initialization. -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2021-06-28-23-44-47.bpo-44530.qij7YC.rst b/Misc/NEWS.d/next/C API/2021-06-28-23-44-47.bpo-44530.qij7YC.rst deleted file mode 100644 index 6200f9b97d7fcd..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-06-28-23-44-47.bpo-44530.qij7YC.rst +++ /dev/null @@ -1,4 +0,0 @@ -Added the ``co_qualname`` to the ``PyCodeObject`` structure to propagate the -qualified name from the compiler to code objects. - -Patch by Gabriele N. Tornetta diff --git a/Misc/NEWS.d/next/C API/2021-07-20-16-21-06.bpo-42747.rRxjUY.rst b/Misc/NEWS.d/next/C API/2021-07-20-16-21-06.bpo-42747.rRxjUY.rst deleted file mode 100644 index c7ac5a776e2ed9..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-07-20-16-21-06.bpo-42747.rRxjUY.rst +++ /dev/null @@ -1,4 +0,0 @@ -The ``Py_TPFLAGS_HAVE_VERSION_TAG`` type flag now does nothing. The -``Py_TPFLAGS_HAVE_AM_SEND`` flag (which was added in 3.10) is removed. Both -were unnecessary because it is not possible to have type objects with the -relevant fields missing. diff --git a/Misc/NEWS.d/next/C API/2021-07-27-17-29-12.bpo-44751.4qmbDG.rst b/Misc/NEWS.d/next/C API/2021-07-27-17-29-12.bpo-44751.4qmbDG.rst deleted file mode 100644 index d7b9f098196694..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-07-27-17-29-12.bpo-44751.4qmbDG.rst +++ /dev/null @@ -1 +0,0 @@ -Remove ``crypt.h`` include from the public ``Python.h`` header. diff --git a/Misc/NEWS.d/next/C API/2021-07-29-16-04-28.bpo-41103.hiKKcF.rst b/Misc/NEWS.d/next/C API/2021-07-29-16-04-28.bpo-41103.hiKKcF.rst deleted file mode 100644 index af06654ba20409..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-07-29-16-04-28.bpo-41103.hiKKcF.rst +++ /dev/null @@ -1,2 +0,0 @@ -Reverts removal of the old buffer protocol because they are part of stable -ABI. diff --git a/Misc/NEWS.d/next/C API/2021-08-02-20-49-36.bpo-42035.HTBcZt.rst b/Misc/NEWS.d/next/C API/2021-08-02-20-49-36.bpo-42035.HTBcZt.rst deleted file mode 100644 index 4631c43fdd5312..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-08-02-20-49-36.bpo-42035.HTBcZt.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add a new :c:func:`PyType_GetQualName` function to get type's qualified -name. diff --git a/Misc/NEWS.d/next/C API/2021-08-31-15-21-36.bpo-45061.ZH0HVe.rst b/Misc/NEWS.d/next/C API/2021-08-31-15-21-36.bpo-45061.ZH0HVe.rst deleted file mode 100644 index 58bd534601fb9d..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-08-31-15-21-36.bpo-45061.ZH0HVe.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add a deallocator to the :class:`bool` type to detect refcount bugs in C -extensions which call ``Py_DECREF(Py_True);`` or ``Py_DECREF(Py_False);`` by -mistake. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2021-09-03-15-53-43.bpo-45094.tinXwL.rst b/Misc/NEWS.d/next/C API/2021-09-03-15-53-43.bpo-45094.tinXwL.rst deleted file mode 100644 index 84b01b23b435fb..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-09-03-15-53-43.bpo-45094.tinXwL.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add the :c:macro:`Py_NO_INLINE` macro to disable inlining on a function. -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2021-09-16-18-05-20.bpo-45116.WxXewl.rst b/Misc/NEWS.d/next/C API/2021-09-16-18-05-20.bpo-45116.WxXewl.rst deleted file mode 100644 index cf3db5ca2a0236..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-09-16-18-05-20.bpo-45116.WxXewl.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add the :c:macro:`Py_ALWAYS_INLINE` macro to ask the compiler to always -inline a static inline function. The compiler can ignore it and decides to -not inline the function. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2021-09-19-17-18-25.bpo-44687.3fqDRC.rst b/Misc/NEWS.d/next/C API/2021-09-19-17-18-25.bpo-44687.3fqDRC.rst deleted file mode 100644 index d38fa6057f6f99..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-09-19-17-18-25.bpo-44687.3fqDRC.rst +++ /dev/null @@ -1 +0,0 @@ -:meth:`BufferedReader.peek` no longer raises :exc:`ValueError` when the entire file has already been buffered. diff --git a/Misc/NEWS.d/next/C API/2021-09-30-03-14-35.bpo-41710.DDWJKx.rst b/Misc/NEWS.d/next/C API/2021-09-30-03-14-35.bpo-41710.DDWJKx.rst deleted file mode 100644 index 902c7cc8f2b99f..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-09-30-03-14-35.bpo-41710.DDWJKx.rst +++ /dev/null @@ -1,2 +0,0 @@ -The PyThread_acquire_lock_timed() function now clamps the timeout if it is -too large, rather than aborting the process. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-05-11-12-44-03.bpo-33346.ZgBkvB.rst b/Misc/NEWS.d/next/Core and Builtins/2018-05-11-12-44-03.bpo-33346.ZgBkvB.rst deleted file mode 100644 index 9c91a8c0bf9ee4..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-05-11-12-44-03.bpo-33346.ZgBkvB.rst +++ /dev/null @@ -1,3 +0,0 @@ -Asynchronous comprehensions are now allowed inside comprehensions in -asynchronous functions. Outer comprehensions implicitly become -asynchronous. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-21-14-18-32.bpo-39091.dOexgQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-21-14-18-32.bpo-39091.dOexgQ.rst deleted file mode 100644 index c3b4e810d658b2..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-12-21-14-18-32.bpo-39091.dOexgQ.rst +++ /dev/null @@ -1 +0,0 @@ -Fix crash when using passing a non-exception to a generator's ``throw()`` method. Patch by Noah Oxer diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-02-13-21-14.bpo-11105.wceryW.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-02-13-21-14.bpo-11105.wceryW.rst deleted file mode 100644 index 8891936cd88716..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-06-02-13-21-14.bpo-11105.wceryW.rst +++ /dev/null @@ -1,3 +0,0 @@ -When compiling :class:`ast.AST` objects with recursive references -through :func:`compile`, the interpreter doesn't crash anymore instead -it raises a :exc:`RecursionError`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-13-19-34-41.bpo-28146.AZBBkH.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-13-19-34-41.bpo-28146.AZBBkH.rst deleted file mode 100644 index e6198819389532..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-13-19-34-41.bpo-28146.AZBBkH.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a confusing error message in :func:`str.format`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-03-22-17-50-30.bpo-17792._zssjS.rst b/Misc/NEWS.d/next/Core and Builtins/2021-03-22-17-50-30.bpo-17792._zssjS.rst deleted file mode 100644 index 768cbf14efad9c..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-03-22-17-50-30.bpo-17792._zssjS.rst +++ /dev/null @@ -1 +0,0 @@ -More accurate error messages for access of unbound locals or free vars. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-04-02-15-02-16.bpo-43693.l3Ureu.rst b/Misc/NEWS.d/next/Core and Builtins/2021-04-02-15-02-16.bpo-43693.l3Ureu.rst deleted file mode 100644 index 948c4d52482dc0..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-04-02-15-02-16.bpo-43693.l3Ureu.rst +++ /dev/null @@ -1,4 +0,0 @@ -Compute cell offsets relative to locals in compiler. Allows the interpreter -to treats locals and cells a single array, which is slightly more efficient. -Also make the LOAD_CLOSURE opcode an alias for LOAD_FAST. Preserving -LOAD_CLOSURE helps keep bytecode a bit more readable. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-04-17-16-08-00.bpo-43879.zkyJgh.rst b/Misc/NEWS.d/next/Core and Builtins/2021-04-17-16-08-00.bpo-43879.zkyJgh.rst deleted file mode 100644 index 98b51736904a00..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-04-17-16-08-00.bpo-43879.zkyJgh.rst +++ /dev/null @@ -1 +0,0 @@ -Add native_thread_id to PyThreadState. Patch by Gabriele N. Tornetta. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-04-18-18-07-33.bpo-43833.oChkCi.rst b/Misc/NEWS.d/next/Core and Builtins/2021-04-18-18-07-33.bpo-43833.oChkCi.rst deleted file mode 100644 index 2adbdba651b831..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-04-18-18-07-33.bpo-43833.oChkCi.rst +++ /dev/null @@ -1,4 +0,0 @@ -Emit a deprecation warning if the numeric literal is immediately followed by -one of keywords: and, else, for, if, in, is, or. Raise a syntax error with -more informative message if it is immediately followed by other keyword or -identifier. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-04-23-03-46-45.bpo-43918.nNDY3S.rst b/Misc/NEWS.d/next/Core and Builtins/2021-04-23-03-46-45.bpo-43918.nNDY3S.rst deleted file mode 100644 index f2f33f02abbd99..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-04-23-03-46-45.bpo-43918.nNDY3S.rst +++ /dev/null @@ -1 +0,0 @@ -Document the signature and ``default`` argument in the docstring of the new ``anext`` builtin. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-04-30-15-48-36.bpo-40222.j3VxeX.rst b/Misc/NEWS.d/next/Core and Builtins/2021-04-30-15-48-36.bpo-40222.j3VxeX.rst deleted file mode 100644 index b7744755122783..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-04-30-15-48-36.bpo-40222.j3VxeX.rst +++ /dev/null @@ -1,7 +0,0 @@ -"Zero cost" exception handling. - -* Uses a lookup table to determine how to handle exceptions. -* Removes SETUP_FINALLY and POP_TOP block instructions, eliminating the runtime overhead of try statements. -* Reduces the size of the frame object by about 60%. - -Patch by Mark Shannon diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-04-01-01-04.bpo-43822.9VeCg0.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-04-01-01-04.bpo-43822.9VeCg0.rst deleted file mode 100644 index b8815cddf4e2c1..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-04-01-01-04.bpo-43822.9VeCg0.rst +++ /dev/null @@ -1,2 +0,0 @@ -The parser will prioritize tokenizer errors over custom syntax errors when -raising exceptions. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-08-17-18-37.bpo-43149.Kp5FxD.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-08-17-18-37.bpo-43149.Kp5FxD.rst deleted file mode 100644 index cc1983ec3d4648..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-08-17-18-37.bpo-43149.Kp5FxD.rst +++ /dev/null @@ -1,2 +0,0 @@ -Corrent the syntax error message regarding multiple exception types to not -refer to "exception groups". Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-08-19-54-57.bpo-28307.7ysaVW.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-08-19-54-57.bpo-28307.7ysaVW.rst deleted file mode 100644 index 86ac3254eaea87..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-08-19-54-57.bpo-28307.7ysaVW.rst +++ /dev/null @@ -1,3 +0,0 @@ -Compiler now optimizes simple C-style formatting with literal format -containing only format codes %s, %r and %a by converting them to f-string -expressions. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-10-18-49-13.bpo-26110.EQzqqA.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-10-18-49-13.bpo-26110.EQzqqA.rst deleted file mode 100644 index b5d9159000bad6..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-10-18-49-13.bpo-26110.EQzqqA.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add ``CALL_METHOD_KW`` opcode to speed up method calls with keyword -arguments. Idea originated from PyPy. A side effect is executing -``CALL_METHOD`` is now branchless in the evaluation loop. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-11-21-52-44.bpo-44110.VqbAsB.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-11-21-52-44.bpo-44110.VqbAsB.rst deleted file mode 100644 index 3b82e425ab4a74..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-11-21-52-44.bpo-44110.VqbAsB.rst +++ /dev/null @@ -1 +0,0 @@ -Improve :func:`str.__getitem__` error message diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-12-14-26-16.bpo-44114.p-WfAE.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-12-14-26-16.bpo-44114.p-WfAE.rst deleted file mode 100644 index c50b1594cae356..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-12-14-26-16.bpo-44114.p-WfAE.rst +++ /dev/null @@ -1 +0,0 @@ -Fix incorrect dictkeys_reversed and dictitems_reversed function signatures in C code, which broke webassembly builds. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-14-20-03-32.bpo-44032.OzT1ob.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-14-20-03-32.bpo-44032.OzT1ob.rst deleted file mode 100644 index fd2dec80cddf10..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-14-20-03-32.bpo-44032.OzT1ob.rst +++ /dev/null @@ -1,2 +0,0 @@ -Move 'fast' locals and other variables from the frame object to a per-thread -datastack. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-15-17-30-57.bpo-44143.7UTS6H.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-15-17-30-57.bpo-44143.7UTS6H.rst deleted file mode 100644 index a4e88e55723e4d..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-15-17-30-57.bpo-44143.7UTS6H.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a crash in the parser that manifest when raising tokenizer errors when -an existing exception was present. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-17-20-44-45.bpo-44156.8KSp9l.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-17-20-44-45.bpo-44156.8KSp9l.rst deleted file mode 100644 index 31e63c2b613161..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-17-20-44-45.bpo-44156.8KSp9l.rst +++ /dev/null @@ -1 +0,0 @@ -String caches in ``compile.c`` are now subinterpreter compatible. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-18-11-27-02.bpo-44168.mgB-rt.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-18-11-27-02.bpo-44168.mgB-rt.rst deleted file mode 100644 index ace01e49b508a2..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-18-11-27-02.bpo-44168.mgB-rt.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix error message in the parser involving keyword arguments with invalid -expressions. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-19-20-33-36.bpo-44180.mQVaAs.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-19-20-33-36.bpo-44180.mQVaAs.rst deleted file mode 100644 index c67eb70b5823a2..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-19-20-33-36.bpo-44180.mQVaAs.rst +++ /dev/null @@ -1,3 +0,0 @@ -The parser doesn't report generic syntax errors that happen in a position -further away that the one it reached in the first pass. Patch by Pablo -Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-20-12-43-04.bpo-44187.3lk0L1.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-20-12-43-04.bpo-44187.3lk0L1.rst deleted file mode 100644 index 067dedd0f7dda3..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-20-12-43-04.bpo-44187.3lk0L1.rst +++ /dev/null @@ -1,3 +0,0 @@ -Implement quickening in the interpreter. This offers no advantages as -yet, but is an enabler of future optimizations. See PEP 659 for full -explanation. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-21-01-42-45.bpo-44184.9qOptC.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-21-01-42-45.bpo-44184.9qOptC.rst deleted file mode 100644 index 3aba9a58475c61..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-21-01-42-45.bpo-44184.9qOptC.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix a crash at Python exit when a deallocator function removes the last strong -reference to a heap type. -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-21-20-53-49.bpo-43693.-NN3J_.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-21-20-53-49.bpo-43693.-NN3J_.rst deleted file mode 100644 index 83b7ba260e6a22..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-21-20-53-49.bpo-43693.-NN3J_.rst +++ /dev/null @@ -1,3 +0,0 @@ -``PyCodeObject`` gained ``co_fastlocalnames`` and ``co_fastlocalkinds`` as -the the authoritative source of fast locals info. Marshaled code objects -have changed accordingly. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-21-21-16-03.bpo-44201.bGaSjt.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-21-21-16-03.bpo-44201.bGaSjt.rst deleted file mode 100644 index 6f61aac7817b2b..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-21-21-16-03.bpo-44201.bGaSjt.rst +++ /dev/null @@ -1,3 +0,0 @@ -Avoid side effects of checking for specialized syntax errors in the REPL -that was causing it to ask for extra tokens after a syntax error had been -detected. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-25-18-20-10.bpo-44232.DMcCCf.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-25-18-20-10.bpo-44232.DMcCCf.rst deleted file mode 100644 index fcd124d51442a5..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-25-18-20-10.bpo-44232.DMcCCf.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix a regression in :func:`type` when a metaclass raises an exception. The C -function :c:func:`type_new` must properly report the exception when a metaclass -constructor raises an exception and the winner class is not the metaclass. -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-26-19-10-47.bpo-43693.1KSG9u.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-26-19-10-47.bpo-43693.1KSG9u.rst deleted file mode 100644 index c5fb29ba462e7d..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-26-19-10-47.bpo-43693.1KSG9u.rst +++ /dev/null @@ -1,5 +0,0 @@ -A new opcode MAKE_CELL has been added that effectively moves some of -the work done on function entry into the compiler and into the eval -loop. In addition to creating the required cell objects, the new -opcode converts relevant arguments (and other locals) to cell -variables on function entry. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-27-17-34-29.bpo-43667.ND9jP3.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-27-17-34-29.bpo-43667.ND9jP3.rst deleted file mode 100644 index 53130cce7180a7..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-27-17-34-29.bpo-43667.ND9jP3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve Unicode support in non-UTF locales on Oracle Solaris. This issue -does not affect other Solaris systems. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-30-16-37-47.bpo-43413.vYFPPC.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-30-16-37-47.bpo-43413.vYFPPC.rst deleted file mode 100644 index 579b57ee2d4333..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-30-16-37-47.bpo-43413.vYFPPC.rst +++ /dev/null @@ -1,4 +0,0 @@ -Constructors of subclasses of some buitin classes (e.g. :class:`tuple`, -:class:`list`, :class:`frozenset`) no longer accept arbitrary keyword -arguments. Subclass of :class:`set` can now define a ``__new__()`` method -with additional keyword parameters without overriding also ``__init__()``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-03-22-51-50.bpo-44305.66dVDG.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-03-22-51-50.bpo-44305.66dVDG.rst deleted file mode 100644 index eebc26f1cc777a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-03-22-51-50.bpo-44305.66dVDG.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve error message for ``try`` blocks without ``except`` or ``finally`` -blocks. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-05-02-34-57.bpo-44304._MAoPc.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-05-02-34-57.bpo-44304._MAoPc.rst deleted file mode 100644 index 89104e8e387ed1..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-05-02-34-57.bpo-44304._MAoPc.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a crash in the :mod:`sqlite3` module that happened when the garbage -collector clears :class:`sqlite.Statement` objects. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-06-00-29-14.bpo-44317.xPPhcZ.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-06-00-29-14.bpo-44317.xPPhcZ.rst deleted file mode 100644 index 8ac32adf8b5535..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-06-00-29-14.bpo-44317.xPPhcZ.rst +++ /dev/null @@ -1 +0,0 @@ -Improve tokenizer error with improved locations. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-07-15-13-44.bpo-43693.c_zDeY.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-07-15-13-44.bpo-43693.c_zDeY.rst deleted file mode 100644 index c3db81072254b8..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-07-15-13-44.bpo-43693.c_zDeY.rst +++ /dev/null @@ -1,4 +0,0 @@ -Computation of the offsets of cell variables is done in the compiler instead -of at runtime. This reduces the overhead of handling cell and free -variables, especially in the case where a variable is both an argument and -cell variable. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-08-01-13-47.bpo-44335.GQTTkl.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-08-01-13-47.bpo-44335.GQTTkl.rst deleted file mode 100644 index b57904e5da607f..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-08-01-13-47.bpo-44335.GQTTkl.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a regression when identifying incorrect characters in syntax errors. -Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-08-10-22-46.bpo-44337.RTjmIt.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-08-10-22-46.bpo-44337.RTjmIt.rst deleted file mode 100644 index 2df082a078e309..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-08-10-22-46.bpo-44337.RTjmIt.rst +++ /dev/null @@ -1,11 +0,0 @@ -Initial implementation of adaptive specialization of LOAD_ATTR - -Four specialized forms of LOAD_ATTR are added: - -* LOAD_ATTR_SLOT - -* LOAD_ATTR_SPLIT_KEYS - -* LOAD_ATTR_WITH_HINT - -* LOAD_ATTR_MODULE diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-08-22-49-06.bpo-44349.xgEgeA.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-08-22-49-06.bpo-44349.xgEgeA.rst deleted file mode 100644 index b386a8ed2c846d..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-08-22-49-06.bpo-44349.xgEgeA.rst +++ /dev/null @@ -1 +0,0 @@ -Fix an edge case when displaying text from files with encoding in syntax errors. Patch by Pablo Galindo. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-09-22-56-59.bpo-44368.vgT0Cx.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-09-22-56-59.bpo-44368.vgT0Cx.rst deleted file mode 100644 index e0d19134510eeb..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-09-22-56-59.bpo-44368.vgT0Cx.rst +++ /dev/null @@ -1 +0,0 @@ -Improve syntax errors for invalid "as" targets. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-10-10-06-18.bpo-44338.c4Myr4.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-10-10-06-18.bpo-44338.c4Myr4.rst deleted file mode 100644 index beaa3e56334ba9..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-10-10-06-18.bpo-44338.c4Myr4.rst +++ /dev/null @@ -1,7 +0,0 @@ -Implement adaptive specialization for LOAD_GLOBAL - -Two specialized forms of LOAD_GLOBAL are added: - -* LOAD_GLOBAL_MODULE - -* LOAD_GLOBAL_BUILTIN diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-10-16-10-39.bpo-44313.34RjI8.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-10-16-10-39.bpo-44313.34RjI8.rst deleted file mode 100644 index e48d4a471f802f..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-10-16-10-39.bpo-44313.34RjI8.rst +++ /dev/null @@ -1,4 +0,0 @@ -Directly imported objects and modules (through import and from import -statements) don't generate ``LOAD_METHOD``/``CALL_METHOD`` for directly -accessed objects on their namespace. They now use the regular -``LOAD_ATTR``/``CALL_FUNCTION``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-11-17-37-15.bpo-44376.zhM1UW.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-11-17-37-15.bpo-44376.zhM1UW.rst deleted file mode 100644 index f854d56b3c8419..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-11-17-37-15.bpo-44376.zhM1UW.rst +++ /dev/null @@ -1 +0,0 @@ -Exact integer exponentiation (like ``i**2`` or ``pow(i, 2)``) with a small exponent is much faster, due to reducing overhead in such cases. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-11-18-17-42.bpo-44396.Z9EKim.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-11-18-17-42.bpo-44396.Z9EKim.rst deleted file mode 100644 index be72a7111dc8ae..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-11-18-17-42.bpo-44396.Z9EKim.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a possible crash in the tokenizer when raising syntax errors for -unclosed strings. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-13-23-12-18.bpo-44409.eW4LS-.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-13-23-12-18.bpo-44409.eW4LS-.rst deleted file mode 100644 index 0f204ed812b27a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-13-23-12-18.bpo-44409.eW4LS-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix error location information for tokenizer errors raised on initialization -of the tokenizer. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-18-22-08-25.bpo-44456.L0Rhko.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-18-22-08-25.bpo-44456.L0Rhko.rst deleted file mode 100644 index 86a8c03ce561e7..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-18-22-08-25.bpo-44456.L0Rhko.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve the syntax error when mixing positional and keyword patterns. Patch -by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-19-12-41-13.bpo-44297.F53vHj.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-19-12-41-13.bpo-44297.F53vHj.rst deleted file mode 100644 index bdcb5b2db39e09..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-19-12-41-13.bpo-44297.F53vHj.rst +++ /dev/null @@ -1,3 +0,0 @@ -Make sure that the line number is set when entering a comprehension scope. -Ensures that backtraces inclusing generator expressions show the correct -line number. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-20-10-53-21.bpo-12022.SW240M.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-20-10-53-21.bpo-12022.SW240M.rst deleted file mode 100644 index 98c42283169d8e..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-20-10-53-21.bpo-12022.SW240M.rst +++ /dev/null @@ -1,4 +0,0 @@ -A :exc:`TypeError` is now raised instead of an :exc:`AttributeError` in -:keyword:`with` and :keyword:`async with` statements for objects which do -not support the :term:`context manager` or :term:`asynchronous context -manager` protocols correspondingly. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-21-11-19-54.bpo-44472.Vvm1yn.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-21-11-19-54.bpo-44472.Vvm1yn.rst deleted file mode 100644 index 34fa2a9e8615fa..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-21-11-19-54.bpo-44472.Vvm1yn.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ltrace functionality when exceptions are raised. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-22-10-55-23.bpo-44486.wct-9X.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-22-10-55-23.bpo-44486.wct-9X.rst deleted file mode 100644 index cc419602541b74..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-22-10-55-23.bpo-44486.wct-9X.rst +++ /dev/null @@ -1,2 +0,0 @@ -Modules will always have a dictionary, even when created by -``types.ModuleType.__new__()`` diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-22-19-08-19.bpo-44483.eq2f7T.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-22-19-08-19.bpo-44483.eq2f7T.rst deleted file mode 100644 index ea54e79acfd9d8..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-22-19-08-19.bpo-44483.eq2f7T.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a crash in ``types.Union`` objects when creating a union of an object -with bad ``__module__`` field. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-06-29-11-49-29.bpo-44523.67-ZIP.rst b/Misc/NEWS.d/next/Core and Builtins/2021-06-29-11-49-29.bpo-44523.67-ZIP.rst deleted file mode 100644 index aa51a7478583b1..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-06-29-11-49-29.bpo-44523.67-ZIP.rst +++ /dev/null @@ -1,3 +0,0 @@ -Remove the pass-through for :func:`hash` of :class:`weakref.proxy` objects -to prevent unintended consequences when the original referred object -dies while the proxy is part of a hashable object. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-01-11-59-34.bpo-44490.xY80VR.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-01-11-59-34.bpo-44490.xY80VR.rst deleted file mode 100644 index 4912bca837bb10..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-01-11-59-34.bpo-44490.xY80VR.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add ``__parameters__`` attribute and ``__getitem__`` -operator to ``types.Union``. Patch provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-02-22-54-41.bpo-44553.l9YqGg.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-02-22-54-41.bpo-44553.l9YqGg.rst deleted file mode 100644 index e97df02994806a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-02-22-54-41.bpo-44553.l9YqGg.rst +++ /dev/null @@ -1,2 +0,0 @@ -Implement GC methods for ``types.Union`` to break reference cycles and -prevent memory leaks. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-03-00-20-39.bpo-43908.YHuV_s.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-03-00-20-39.bpo-43908.YHuV_s.rst deleted file mode 100644 index 6113d0f912a5ac..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-03-00-20-39.bpo-43908.YHuV_s.rst +++ /dev/null @@ -1,3 +0,0 @@ -Heap types with the :const:`Py_TPFLAGS_IMMUTABLETYPE` flag can now inherit the -:pep:`590` vectorcall protocol. Previously, this was only possible for -:ref:`static types `. Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-04-17-41-47.bpo-41486.DiM24a.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-04-17-41-47.bpo-41486.DiM24a.rst deleted file mode 100644 index 6a373f67f62f92..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-04-17-41-47.bpo-41486.DiM24a.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix a memory consumption and copying performance regression in earlier 3.10 -beta releases if someone used an output buffer larger than 4GiB with -zlib.decompress on input data that expands that large. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-04-23-38-51.bpo-44562.QdeRQo.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-04-23-38-51.bpo-44562.QdeRQo.rst deleted file mode 100644 index 2fc65bcfdeef43..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-04-23-38-51.bpo-44562.QdeRQo.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove uses of :c:func:`PyObject_GC_Del` in error path when initializing -:class:`types.GenericAlias`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-06-15-27-11.bpo-43950.LhL2-q.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-06-15-27-11.bpo-43950.LhL2-q.rst deleted file mode 100644 index dde5399626b7ef..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-06-15-27-11.bpo-43950.LhL2-q.rst +++ /dev/null @@ -1,6 +0,0 @@ -Code objects can now provide the column information for instructions when -available. This is levaraged during traceback printing to show the -expressions responsible for errors. - -Contributed by Pablo Galindo, Batuhan Taskaya and Ammar Askar as part of -:pep:`657`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-06-22-22-15.bpo-44490.BJxPbZ.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-06-22-22-15.bpo-44490.BJxPbZ.rst deleted file mode 100644 index d49181cd82c818..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-06-22-22-15.bpo-44490.BJxPbZ.rst +++ /dev/null @@ -1,3 +0,0 @@ -:mod:`typing` now searches for type parameters in ``types.Union`` objects. -``get_type_hints`` will also properly resolve annotations with nested -``types.Union`` objects. Patch provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-07-16-05-35.bpo-43895.JFjR0-.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-07-16-05-35.bpo-43895.JFjR0-.rst deleted file mode 100644 index 49deb48fa43582..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-07-16-05-35.bpo-43895.JFjR0-.rst +++ /dev/null @@ -1,4 +0,0 @@ -An obsolete internal cache of shared object file handles added in 1995 that -attempted, but did not guarantee, that a .so would not be dlopen'ed twice to -work around flaws in mid-1990s posix-ish operating systems has been removed -from dynload_shlib.c. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-08-12-18-56.bpo-44584.qKnSqV.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-08-12-18-56.bpo-44584.qKnSqV.rst deleted file mode 100644 index 4afb33b047d4be..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-08-12-18-56.bpo-44584.qKnSqV.rst +++ /dev/null @@ -1,3 +0,0 @@ -The threading debug (:envvar:`PYTHONTHREADDEBUG` environment variable) is -deprecated in Python 3.10 and will be removed in Python 3.12. This feature -requires a debug build of Python. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-09-12-08-17.bpo-44590.a2ntVX.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-09-12-08-17.bpo-44590.a2ntVX.rst deleted file mode 100644 index ed4d969a11ab43..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-09-12-08-17.bpo-44590.a2ntVX.rst +++ /dev/null @@ -1,5 +0,0 @@ -All necessary data for executing a Python function (local variables, stack, -etc) is now kept in a per-thread stack. Frame objects are lazily allocated -on demand. This increases performance by about 7% on the standard benchmark -suite. Introspection and debugging are unaffected as frame objects are -always available when needed. Patch by Mark Shannon. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-12-04-06-57.bpo-41972.nDX5k_.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-12-04-06-57.bpo-41972.nDX5k_.rst deleted file mode 100644 index 3daffb9c0e1dff..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-12-04-06-57.bpo-41972.nDX5k_.rst +++ /dev/null @@ -1 +0,0 @@ -Tuned the string-searching algorithm of fastsearch.h to have a shorter inner loop for most cases. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-13-17-47-32.bpo-42073.9wopiC.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-13-17-47-32.bpo-42073.9wopiC.rst deleted file mode 100644 index 988fe67b99dc96..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-13-17-47-32.bpo-42073.9wopiC.rst +++ /dev/null @@ -1,2 +0,0 @@ -The ``@classmethod`` decorator can now wrap other classmethod-like -descriptors. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-13-20-22-12.bpo-44606.S3Bv2w.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-13-20-22-12.bpo-44606.S3Bv2w.rst deleted file mode 100644 index 3c7ef3b21fe092..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-13-20-22-12.bpo-44606.S3Bv2w.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``__instancecheck__`` and ``__subclasscheck__`` for the union type. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-13-23-19-41.bpo-44589.59OH8T.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-13-23-19-41.bpo-44589.59OH8T.rst deleted file mode 100644 index 23b2472b00e40f..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-13-23-19-41.bpo-44589.59OH8T.rst +++ /dev/null @@ -1,2 +0,0 @@ -Mapping patterns in ``match`` statements with two or more equal literal -keys will now raise a :exc:`SyntaxError` at compile-time. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-14-10-31-10.bpo-26280.cgpM4B.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-14-10-31-10.bpo-26280.cgpM4B.rst deleted file mode 100644 index cb561e79c78cee..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-14-10-31-10.bpo-26280.cgpM4B.rst +++ /dev/null @@ -1,9 +0,0 @@ -Implement adaptive specialization for BINARY_SUBSCR - - Three specialized forms of BINARY_SUBSCR are added: - - * BINARY_SUBSCR_LIST_INT - - * BINARY_SUBSCR_TUPLE_INT - - * BINARY_SUBSCR_DICT \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-14-13-54-07.bpo-44635.7ZMAdB.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-14-13-54-07.bpo-44635.7ZMAdB.rst deleted file mode 100644 index ea00554aeeda66..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-14-13-54-07.bpo-44635.7ZMAdB.rst +++ /dev/null @@ -1 +0,0 @@ -Convert ``None`` to ``type(None)`` in the union type constructor. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-16-01-01-11.bpo-44611.LcfHN-.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-16-01-01-11.bpo-44611.LcfHN-.rst deleted file mode 100644 index 1cc8b127382390..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-16-01-01-11.bpo-44611.LcfHN-.rst +++ /dev/null @@ -1,2 +0,0 @@ -On Windows, :func:`os.urandom`: uses BCryptGenRandom API instead of CryptGenRandom API -which is deprecated from Microsoft Windows API. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-16-09-36-12.bpo-44636.ZWebi8.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-16-09-36-12.bpo-44636.ZWebi8.rst deleted file mode 100644 index 1a053ae69e97e0..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-16-09-36-12.bpo-44636.ZWebi8.rst +++ /dev/null @@ -1 +0,0 @@ -Collapse union of equal types. E.g. the result of ``int | int`` is now ``int``. Fix comparison of the union type with non-hashable objects. E.g. ``int | str == {}`` no longer raises a TypeError. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-16-09-59-13.bpo-44646.Yb6s05.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-16-09-59-13.bpo-44646.Yb6s05.rst deleted file mode 100644 index 0e28eac54fe987..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-16-09-59-13.bpo-44646.Yb6s05.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix the hash of the union type: it no longer depends on the order of -arguments. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-16-20-25-37.bpo-44655.I3wRjL.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-16-20-25-37.bpo-44655.I3wRjL.rst deleted file mode 100644 index 4ea4a6d0859799..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-16-20-25-37.bpo-44655.I3wRjL.rst +++ /dev/null @@ -1,2 +0,0 @@ -Don't include a missing attribute with the same name as the failing one when -offering suggestions for missing attributes. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-16-21-35-14.bpo-44655.95I7M6.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-16-21-35-14.bpo-44655.95I7M6.rst deleted file mode 100644 index 17733b3619a8f3..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-16-21-35-14.bpo-44655.95I7M6.rst +++ /dev/null @@ -1,2 +0,0 @@ -Include the name of the type in unset __slots__ attribute errors. Patch by -Pablo Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-17-13-41-58.bpo-44662.q22kWR.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-17-13-41-58.bpo-44662.q22kWR.rst deleted file mode 100644 index c165774a4cacfb..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-17-13-41-58.bpo-44662.q22kWR.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add ``__module__`` to ``types.Union``. This also fixes -``types.Union`` issues with ``typing.Annotated``. Patch provided by -Yurii Karabas. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-17-14-20-59.bpo-44661.BQbXiH.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-17-14-20-59.bpo-44661.BQbXiH.rst deleted file mode 100644 index bafa98e5826cd4..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-17-14-20-59.bpo-44661.BQbXiH.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update ``property_descr_set`` to use vectorcall if possible. Patch by Dong-hee -Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-17-21-04-04.bpo-44633.5-zKeI.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-17-21-04-04.bpo-44633.5-zKeI.rst deleted file mode 100644 index 507a68b65d4c37..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-17-21-04-04.bpo-44633.5-zKeI.rst +++ /dev/null @@ -1,2 +0,0 @@ -Parameter substitution of the union type with wrong types now raises -``TypeError`` instead of returning ``NotImplemented``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-19-19-53-46.bpo-44676.WgIMvh.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-19-19-53-46.bpo-44676.WgIMvh.rst deleted file mode 100644 index 4a1815e041dcc2..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-19-19-53-46.bpo-44676.WgIMvh.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add ability to serialise ``types.Union`` objects. Patch provided by Yurii -Karabas. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-19-20-49-06.bpo-44653.WcqGyI.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-19-20-49-06.bpo-44653.WcqGyI.rst deleted file mode 100644 index 8254d9bbad4a6e..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-19-20-49-06.bpo-44653.WcqGyI.rst +++ /dev/null @@ -1 +0,0 @@ -Support :mod:`typing` types in parameter substitution in the union type. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-21-15-26-56.bpo-44698.DA4_0o.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-21-15-26-56.bpo-44698.DA4_0o.rst deleted file mode 100644 index ed389630c8ba11..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-21-15-26-56.bpo-44698.DA4_0o.rst +++ /dev/null @@ -1 +0,0 @@ -Fix undefined behaviour in complex object exponentiation. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-23-01-52-13.bpo-44717.-vVmAh.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-23-01-52-13.bpo-44717.-vVmAh.rst deleted file mode 100644 index 7a4d77f7d6520f..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-23-01-52-13.bpo-44717.-vVmAh.rst +++ /dev/null @@ -1 +0,0 @@ -Improve AttributeError on circular imports of submodules. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-23-15-17-01.bpo-44725.qcuKaa.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-23-15-17-01.bpo-44725.qcuKaa.rst deleted file mode 100644 index 995cf148001430..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-23-15-17-01.bpo-44725.qcuKaa.rst +++ /dev/null @@ -1 +0,0 @@ -Expose specialization stats in python via :func:`_opcode.get_specialization_stats`. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-26-15-27-03.bpo-44732.IxObt3.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-26-15-27-03.bpo-44732.IxObt3.rst deleted file mode 100644 index 5094688a294314..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-26-15-27-03.bpo-44732.IxObt3.rst +++ /dev/null @@ -1 +0,0 @@ -Rename ``types.Union`` to ``types.UnionType``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-27-11-14-22.bpo-34013.SjLFe-.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-27-11-14-22.bpo-34013.SjLFe-.rst deleted file mode 100644 index c0d3dd99f98272..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-27-11-14-22.bpo-34013.SjLFe-.rst +++ /dev/null @@ -1,3 +0,0 @@ -Generalize the invalid legacy statement custom error message (like the one -generated when "print" is called without parentheses) to include more -generic expressions. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-31-12-12-57.bpo-44792.mOReTW.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-31-12-12-57.bpo-44792.mOReTW.rst deleted file mode 100644 index 2e9000d09ee44c..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-07-31-12-12-57.bpo-44792.mOReTW.rst +++ /dev/null @@ -1 +0,0 @@ -Improve syntax errors for if expressions. Patch by Miguel Brito diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-04-11-37-38.bpo-44821.67YHGI.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-04-11-37-38.bpo-44821.67YHGI.rst deleted file mode 100644 index 1e254a62773bbd..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-04-11-37-38.bpo-44821.67YHGI.rst +++ /dev/null @@ -1,2 +0,0 @@ -Create instance dictionaries (__dict__) eagerly, to improve regularity of -object layout and assist specialization. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-05-17-42-03.bpo-44838.r_Lkj_.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-05-17-42-03.bpo-44838.r_Lkj_.rst deleted file mode 100644 index a542a5d70933aa..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-05-17-42-03.bpo-44838.r_Lkj_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a bug that was causing the parser to raise an incorrect custom -:exc:`SyntaxError` for invalid 'if' expressions. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-05-17-49-55.bpo-44826.zQsyK5.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-05-17-49-55.bpo-44826.zQsyK5.rst deleted file mode 100644 index ccdb5e0c606c0f..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-05-17-49-55.bpo-44826.zQsyK5.rst +++ /dev/null @@ -1,9 +0,0 @@ -Initial implementation of adaptive specialization of STORE_ATTR - -Three specialized forms of STORE_ATTR are added: - -* STORE_ATTR_SLOT - -* STORE_ATTR_SPLIT_KEYS - -* STORE_ATTR_WITH_HINT diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-07-01-26-12.bpo-44856.9rk3li.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-07-01-26-12.bpo-44856.9rk3li.rst deleted file mode 100644 index 1111d01b726fa2..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-07-01-26-12.bpo-44856.9rk3li.rst +++ /dev/null @@ -1 +0,0 @@ -Fix reference leaks in the error paths of ``update_bases()`` and ``__build_class__``. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-07-21-39-19.bpo-25782.B22lMx.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-07-21-39-19.bpo-25782.B22lMx.rst deleted file mode 100644 index 1c52059f76c8f3..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-07-21-39-19.bpo-25782.B22lMx.rst +++ /dev/null @@ -1 +0,0 @@ -Fix bug where ``PyErr_SetObject`` hangs when the current exception has a cycle in its context chain. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-09-14-29-52.bpo-33930.--5LQ-.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-09-14-29-52.bpo-33930.--5LQ-.rst deleted file mode 100644 index 827dd3f8b65131..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-09-14-29-52.bpo-33930.--5LQ-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix segmentation fault with deep recursion when cleaning method objects. -Patch by Augusto Goulart and Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-09-16-16-03.bpo-44872.OKRlhK.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-09-16-16-03.bpo-44872.OKRlhK.rst deleted file mode 100644 index 9a0d00018b2a7c..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-09-16-16-03.bpo-44872.OKRlhK.rst +++ /dev/null @@ -1 +0,0 @@ -Use new trashcan macros (Py_TRASHCAN_BEGIN/END) in frameobject.c instead of the old ones (Py_TRASHCAN_SAFE_BEGIN/END). \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-09-19-05-20.bpo-44874.oOcfU4.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-09-19-05-20.bpo-44874.oOcfU4.rst deleted file mode 100644 index 1aed5351d74173..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-09-19-05-20.bpo-44874.oOcfU4.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate the old trashcan macros (``Py_TRASHCAN_SAFE_BEGIN``/``Py_TRASHCAN_SAFE_END``). They should be replaced by the new macros ``Py_TRASHCAN_BEGIN`` and ``Py_TRASHCAN_END``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-11-12-03-52.bpo-44878.nEhjLi.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-11-12-03-52.bpo-44878.nEhjLi.rst deleted file mode 100644 index 7998140d4aab0b..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-11-12-03-52.bpo-44878.nEhjLi.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove switch statement for interpreter loop when using computed gotos. This -makes sure that we only have one dispatch table in the interpreter. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-11-14-12-41.bpo-44878.pAbBfc.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-11-14-12-41.bpo-44878.pAbBfc.rst deleted file mode 100644 index 9e07fa8a25df0b..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-11-14-12-41.bpo-44878.pAbBfc.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove the loop from the bytecode interpreter. All instructions end with a -DISPATCH macro, so the loop is now redundant. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-11-15-39-57.bpo-44885.i4noUO.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-11-15-39-57.bpo-44885.i4noUO.rst deleted file mode 100644 index c6abd7363af711..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-11-15-39-57.bpo-44885.i4noUO.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correct the ast locations of f-strings with format specs and repeated -expressions. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-11-16-46-27.bpo-44890.PwNg8N.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-11-16-46-27.bpo-44890.PwNg8N.rst deleted file mode 100644 index 48a1c8b690e65d..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-11-16-46-27.bpo-44890.PwNg8N.rst +++ /dev/null @@ -1 +0,0 @@ -Specialization stats are always collected in debug builds. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-11-20-45-02.bpo-44889.2T3nTn.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-11-20-45-02.bpo-44889.2T3nTn.rst deleted file mode 100644 index a50b6851c14b7a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-11-20-45-02.bpo-44889.2T3nTn.rst +++ /dev/null @@ -1,8 +0,0 @@ -Initial implementation of adaptive specialization of ``LOAD_METHOD``. The -following specialized forms were added: - -* ``LOAD_METHOD_CACHED`` - -* ``LOAD_METHOD_MODULE`` - -* ``LOAD_METHOD_CLASS`` diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-12-14-00-57.bpo-44900.w2gpwy.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-12-14-00-57.bpo-44900.w2gpwy.rst deleted file mode 100644 index 8d94d6aed80ead..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-12-14-00-57.bpo-44900.w2gpwy.rst +++ /dev/null @@ -1,7 +0,0 @@ -Add five superinstructions for PEP 659 quickening: - -* LOAD_FAST LOAD_FAST -* STORE_FAST LOAD_FAST -* LOAD_FAST LOAD_CONST -* LOAD_CONST LOAD_FAST -* STORE_FAST STORE_FAST diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-14-20-13-21.bpo-44895.Ic9m90.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-14-20-13-21.bpo-44895.Ic9m90.rst deleted file mode 100644 index d369ac76505974..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-14-20-13-21.bpo-44895.Ic9m90.rst +++ /dev/null @@ -1,2 +0,0 @@ -A debug variable :envvar:`PYTHONDUMPREFSFILE` is added for creating a dump file -which is generated by :option:`--with-trace-refs`. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-15-10-39-06.bpo-44698.lITKNc.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-15-10-39-06.bpo-44698.lITKNc.rst deleted file mode 100644 index f197253e10ec69..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-15-10-39-06.bpo-44698.lITKNc.rst +++ /dev/null @@ -1,2 +0,0 @@ -Restore behaviour of complex exponentiation with integer-valued exponent of -type :class:`float` or :class:`complex`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-16-11-36-02.bpo-44914.6Lgrx3.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-16-11-36-02.bpo-44914.6Lgrx3.rst deleted file mode 100644 index 5e306ffaf5de84..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-16-11-36-02.bpo-44914.6Lgrx3.rst +++ /dev/null @@ -1,5 +0,0 @@ -Class version tags are no longer recycled. - -This means that a version tag serves as a unique identifier for the state of -a class. We rely on this for effective specialization of the LOAD_ATTR and -other instructions. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-16-23-16-17.bpo-44929.qpMEky.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-16-23-16-17.bpo-44929.qpMEky.rst deleted file mode 100644 index e883e031a4afd8..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-16-23-16-17.bpo-44929.qpMEky.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix some edge cases of ``enum.Flag`` string representation in the REPL. -Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-18-11-14-38.bpo-44945.CO3s77.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-18-11-14-38.bpo-44945.CO3s77.rst deleted file mode 100644 index 66d53ec523de3c..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-18-11-14-38.bpo-44945.CO3s77.rst +++ /dev/null @@ -1,7 +0,0 @@ -Specialize the BINARY_ADD instruction using the PEP 659 machinery. Adds five new instructions: - -* BINARY_ADD_ADAPTIVE -* BINARY_ADD_FLOAT -* BINARY_ADD_INT -* BINARY_ADD_UNICODE -* BINARY_ADD_UNICODE_INPLACE_FAST diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-18-19-09-28.bpo-44947.mcvGdS.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-18-19-09-28.bpo-44947.mcvGdS.rst deleted file mode 100644 index d531ba9faf3de5..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-18-19-09-28.bpo-44947.mcvGdS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Refine the syntax error for trailing commas in import statements. Patch by -Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-19-14-43-24.bpo-44954.dLn3lg.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-19-14-43-24.bpo-44954.dLn3lg.rst deleted file mode 100644 index 4cdeb34b8b6116..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-19-14-43-24.bpo-44954.dLn3lg.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a corner case bug where the result of ``float.fromhex('0x.8p-1074')`` -was rounded the wrong way. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-22-12-28-50.bpo-24234.n3oTdx.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-22-12-28-50.bpo-24234.n3oTdx.rst deleted file mode 100644 index 52397e90fbdfa1..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-22-12-28-50.bpo-24234.n3oTdx.rst +++ /dev/null @@ -1,3 +0,0 @@ -Implement the :meth:`__complex__` special method on the :class:`complex` type, -so a complex number ``z`` passes an ``isinstance(z, typing.SupportsComplex)`` -check. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-23-10-36-55.bpo-24234.MGVUQi.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-23-10-36-55.bpo-24234.MGVUQi.rst deleted file mode 100644 index 3f724da08898a1..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-23-10-36-55.bpo-24234.MGVUQi.rst +++ /dev/null @@ -1,3 +0,0 @@ -Implement the :meth:`__bytes__` special method on the :class:`bytes` type, -so a bytes object ``b`` passes an ``isinstance(b, typing.SupportsBytes)`` -check. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-23-19-55-08.bpo-44962.J00ftt.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-23-19-55-08.bpo-44962.J00ftt.rst deleted file mode 100644 index 6b4b9dfd8bc3c0..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-23-19-55-08.bpo-44962.J00ftt.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a race in WeakKeyDictionary, WeakValueDictionary and WeakSet when two threads attempt to commit the last pending removal. This fixes asyncio.create_task and fixes a data loss in asyncio.run where shutdown_asyncgens is not run \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-25-23-07-10.bpo-44963.5EET8y.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-25-23-07-10.bpo-44963.5EET8y.rst deleted file mode 100644 index 9a54bda118e002..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-25-23-07-10.bpo-44963.5EET8y.rst +++ /dev/null @@ -1,2 +0,0 @@ -Implement ``send()`` and ``throw()`` methods for ``anext_awaitable`` -objects. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-25-23-17-32.bpo-45000.XjmyLl.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-25-23-17-32.bpo-45000.XjmyLl.rst deleted file mode 100644 index 96c95cc6e0296f..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-25-23-17-32.bpo-45000.XjmyLl.rst +++ /dev/null @@ -1,2 +0,0 @@ -A :exc:`SyntaxError` is now raised when trying to delete :const:`__debug__`. -Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-26-18-44-03.bpo-45018.pu8H9L.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-26-18-44-03.bpo-45018.pu8H9L.rst deleted file mode 100644 index 88ef80630ef9b3..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-26-18-44-03.bpo-45018.pu8H9L.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed pickling of range iterators that iterated for over ``2**32`` times. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-31-11-09-52.bpo-45012.ueeOcx.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-31-11-09-52.bpo-45012.ueeOcx.rst deleted file mode 100644 index 91cb3a9e69cc52..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-31-11-09-52.bpo-45012.ueeOcx.rst +++ /dev/null @@ -1,2 +0,0 @@ -In :mod:`posix`, release GIL during ``stat()``, ``lstat()``, and -``fstatat()`` syscalls made by :func:`os.DirEntry.stat`. Patch by Stanisław Skonieczny. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-31-17-44-51.bpo-45020.ZPI_3L.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-31-17-44-51.bpo-45020.ZPI_3L.rst deleted file mode 100644 index f6dffa0831c54a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-08-31-17-44-51.bpo-45020.ZPI_3L.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add a new command line option, "-X frozen_modules=[on|off]" to opt out -of (or into) using optional frozen modules. This defaults to "on" (or -"off" if it's a debug build). diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-01-16-55-43.bpo-45056.7AK2d9.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-01-16-55-43.bpo-45056.7AK2d9.rst deleted file mode 100644 index 6c790f5c50c48e..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-01-16-55-43.bpo-45056.7AK2d9.rst +++ /dev/null @@ -1 +0,0 @@ -Compiler now removes trailing unused constants from co_consts. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-01-19-21-48.bpo-34561.uMAVA-.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-01-19-21-48.bpo-34561.uMAVA-.rst deleted file mode 100644 index 7c48cb39df1c5a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-01-19-21-48.bpo-34561.uMAVA-.rst +++ /dev/null @@ -1 +0,0 @@ -List sorting now uses the merge-ordering strategy from Munro and Wild's ``powersort()``. Unlike the former strategy, this is provably near-optimal in the entropy of the distribution of run lengths. Most uses of ``list.sort()`` probably won't see a significant time difference, but may see significant improvements in cases where the former strategy was exceptionally poor. However, as these are all fast linear-time approximations to a problem that's inherently at best quadratic-time to solve truly optimally, it's also possible to contrive cases where the former strategy did better. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-01-23-55-49.bpo-45083.cLi9G3.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-01-23-55-49.bpo-45083.cLi9G3.rst deleted file mode 100644 index 7bfd87b9420593..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-01-23-55-49.bpo-45083.cLi9G3.rst +++ /dev/null @@ -1,3 +0,0 @@ -When the interpreter renders an exception, its name now has a complete qualname. Previously only the class name was concatenated to the module name, which sometimes resulted in an incorrect full name being displayed. - -(This issue impacted only the C code exception rendering, the :mod:`traceback` module was using qualname already). \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-02-01-28-01.bpo-37330.QDjM_l.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-02-01-28-01.bpo-37330.QDjM_l.rst deleted file mode 100644 index 3f09449de70d09..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-02-01-28-01.bpo-37330.QDjM_l.rst +++ /dev/null @@ -1,4 +0,0 @@ -:func:`open`, :func:`io.open`, :func:`codecs.open` and -:class:`fileinput.FileInput` no longer accept ``'U'`` ("universal newline") -in the file mode. This flag was deprecated since Python 3.3. Patch by Victor -Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-03-12-35-17.bpo-41031.yPSJEs.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-03-12-35-17.bpo-41031.yPSJEs.rst deleted file mode 100644 index 5dcfaa0046c65c..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-03-12-35-17.bpo-41031.yPSJEs.rst +++ /dev/null @@ -1 +0,0 @@ -Match C and Python code formatting of unprintable exceptions and exceptions in the :mod:`__main__` module. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-03-16-18-10.bpo-1514420.2Lumpj.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-03-16-18-10.bpo-1514420.2Lumpj.rst deleted file mode 100644 index fdd5cd70c5c2fb..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-03-16-18-10.bpo-1514420.2Lumpj.rst +++ /dev/null @@ -1 +0,0 @@ -Interpreter no longer attempts to open files with names in angle brackets (like "" or "") when formatting an exception. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-06-21-52-45.bpo-45123.8Eh9iI.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-06-21-52-45.bpo-45123.8Eh9iI.rst deleted file mode 100644 index 6cc7303766f25d..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-06-21-52-45.bpo-45123.8Eh9iI.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix PyAiter_Check to only check for the __anext__ presence (not for -__aiter__). Rename PyAiter_Check to PyAIter_Check, PyObject_GetAiter -> -PyObject_GetAIter. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-07-00-21-04.bpo-44348.f8w_Td.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-07-00-21-04.bpo-44348.f8w_Td.rst deleted file mode 100644 index c222a07725b8a3..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-07-00-21-04.bpo-44348.f8w_Td.rst +++ /dev/null @@ -1,8 +0,0 @@ -The deallocator function of the :exc:`BaseException` type now uses the -trashcan mecanism to prevent stack overflow. For example, when a -:exc:`RecursionError` instance is raised, it can be linked to another -RecursionError through the ``__context__`` attribute or the -``__traceback__`` attribute, and then a chain of exceptions is created. When -the chain is destroyed, nested deallocator function calls can crash with a -stack overflow if the chain is too long compared to the available stack -memory. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-07-17-10-16.bpo-45121.iG-Hsf.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-07-17-10-16.bpo-45121.iG-Hsf.rst deleted file mode 100644 index 19eb3314125167..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-07-17-10-16.bpo-45121.iG-Hsf.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix issue where ``Protocol.__init__`` raises ``RecursionError`` when it's -called directly or via ``super()``. Patch provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-08-08-29-41.bpo-44959.OSwwPf.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-08-08-29-41.bpo-44959.OSwwPf.rst deleted file mode 100644 index 02e11ae94e430b..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-08-08-29-41.bpo-44959.OSwwPf.rst +++ /dev/null @@ -1 +0,0 @@ -Added fallback to extension modules with '.sl' suffix on HP-UX \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-09-10-32-33.bpo-44219.WiYyjz.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-09-10-32-33.bpo-44219.WiYyjz.rst deleted file mode 100644 index 2abd81673663b8..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-09-10-32-33.bpo-44219.WiYyjz.rst +++ /dev/null @@ -1,5 +0,0 @@ -Release the GIL while performing ``isatty`` system calls on arbitrary file -descriptors. In particular, this affects :func:`os.isatty`, -:func:`os.device_encoding` and :class:`io.TextIOWrapper`. By extension, -:func:`io.open` in text mode is also affected. This change solves -a deadlock in :func:`os.isatty`. Patch by Vincent Michel in :issue:`44219`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-09-15-05-17.bpo-45155.JRw9TG.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-09-15-05-17.bpo-45155.JRw9TG.rst deleted file mode 100644 index eab023bf89471e..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-09-15-05-17.bpo-45155.JRw9TG.rst +++ /dev/null @@ -1,3 +0,0 @@ -:meth:`int.to_bytes` and :meth:`int.from_bytes` now take a default value of -``"big"`` for the ``byteorder`` argument. :meth:`int.to_bytes` also takes a -default value of ``1`` for the ``length`` argument. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-14-09-23-59.bpo-45167.CPSSoV.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-14-09-23-59.bpo-45167.CPSSoV.rst deleted file mode 100644 index 47755ae59be2bd..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-14-09-23-59.bpo-45167.CPSSoV.rst +++ /dev/null @@ -1 +0,0 @@ -Fix deepcopying of :class:`types.GenericAlias` objects. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-14-10-02-12.bpo-45190.ZFRgSj.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-14-10-02-12.bpo-45190.ZFRgSj.rst deleted file mode 100644 index c6a4c554aff5a5..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-14-10-02-12.bpo-45190.ZFRgSj.rst +++ /dev/null @@ -1 +0,0 @@ -Update Unicode databases to Unicode 14.0.0. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-20-10-02-12.bpo-24076.ZFgFSj.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-20-10-02-12.bpo-24076.ZFgFSj.rst deleted file mode 100644 index b680884ff8b1e0..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-20-10-02-12.bpo-24076.ZFgFSj.rst +++ /dev/null @@ -1 +0,0 @@ -sum() was further optimised for summing up single digit integers. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-21-22-27-25.bpo-45061.5IOUf0.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-21-22-27-25.bpo-45061.5IOUf0.rst deleted file mode 100644 index caeb36ba52646a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-21-22-27-25.bpo-45061.5IOUf0.rst +++ /dev/null @@ -1,5 +0,0 @@ -Add a deallocator to the bool type to detect refcount bugs in C extensions -which call Py_DECREF(Py_True) or Py_DECREF(Py_False) by mistake. Detect also -refcount bugs when the empty tuple singleton or the Unicode empty string -singleton is destroyed by mistake. -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-10-04-16-11-50.bpo-43760.R9QoUv.rst b/Misc/NEWS.d/next/Core and Builtins/2021-10-04-16-11-50.bpo-43760.R9QoUv.rst deleted file mode 100644 index 1809b42b94438b..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-10-04-16-11-50.bpo-43760.R9QoUv.rst +++ /dev/null @@ -1,3 +0,0 @@ -The number of hardware branches per instruction dispatch is reduced from two -to one by adding a special instruction for tracing. Patch by Mark Shannon. - diff --git a/Misc/NEWS.d/next/Documentation/2018-05-19-15-59-29.bpo-33479.4cLlxo.rst b/Misc/NEWS.d/next/Documentation/2018-05-19-15-59-29.bpo-33479.4cLlxo.rst deleted file mode 100644 index db4973d3923957..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-05-19-15-59-29.bpo-33479.4cLlxo.rst +++ /dev/null @@ -1,4 +0,0 @@ -Remove the unqualified claim that tkinter is threadsafe. It has not been -true for several years and likely never was. An explanation of what is true -may be added later, after more discussion, and possibly after patching -_tkinter.c, diff --git a/Misc/NEWS.d/next/Documentation/2020-01-30-05-18-48.bpo-39498.Nu3sFL.rst b/Misc/NEWS.d/next/Documentation/2020-01-30-05-18-48.bpo-39498.Nu3sFL.rst deleted file mode 100644 index a3e899a80a0fc2..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-01-30-05-18-48.bpo-39498.Nu3sFL.rst +++ /dev/null @@ -1 +0,0 @@ -Add a "Security Considerations" index which links to standard library modules that have explicitly documented security considerations. diff --git a/Misc/NEWS.d/next/Documentation/2020-03-21-01-19-28.bpo-21760.CqofIc.rst b/Misc/NEWS.d/next/Documentation/2020-03-21-01-19-28.bpo-21760.CqofIc.rst deleted file mode 100644 index 119ef3d4c4378e..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-03-21-01-19-28.bpo-21760.CqofIc.rst +++ /dev/null @@ -1,2 +0,0 @@ -The description for __file__ fixed. -Patch by Furkan Onder \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2020-08-21-22-59-37.bpo-41576.7a6CQR.rst b/Misc/NEWS.d/next/Documentation/2020-08-21-22-59-37.bpo-41576.7a6CQR.rst deleted file mode 100644 index f74ef62ca47ab2..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-08-21-22-59-37.bpo-41576.7a6CQR.rst +++ /dev/null @@ -1 +0,0 @@ -document BaseException in favor of bare except \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2020-08-24-13-35-04.bpo-41621.nqaw9G.rst b/Misc/NEWS.d/next/Documentation/2020-08-24-13-35-04.bpo-41621.nqaw9G.rst deleted file mode 100644 index bd193d9163073a..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-08-24-13-35-04.bpo-41621.nqaw9G.rst +++ /dev/null @@ -1 +0,0 @@ -Document that :class:`collections.defaultdict` parameter ``default_factory`` defaults to None and is positional-only. diff --git a/Misc/NEWS.d/next/Documentation/2020-09-03-13-37-19.bpo-41706._zXWOR.rst b/Misc/NEWS.d/next/Documentation/2020-09-03-13-37-19.bpo-41706._zXWOR.rst deleted file mode 100644 index 6406494ec03c7b..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-09-03-13-37-19.bpo-41706._zXWOR.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix docs about how methods like ``__add__`` are invoked when evaluating -operator expressions. diff --git a/Misc/NEWS.d/next/Documentation/2021-05-03-22-08-08.bpo-44025.gcB7iP.rst b/Misc/NEWS.d/next/Documentation/2021-05-03-22-08-08.bpo-44025.gcB7iP.rst deleted file mode 100644 index 1432236a32f63f..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-05-03-22-08-08.bpo-44025.gcB7iP.rst +++ /dev/null @@ -1 +0,0 @@ -Clarify when '_' in match statements is a keyword, and when not. diff --git a/Misc/NEWS.d/next/Documentation/2021-05-07-12-27-09.bpo-43558.UGhA8R.rst b/Misc/NEWS.d/next/Documentation/2021-05-07-12-27-09.bpo-43558.UGhA8R.rst deleted file mode 100644 index b0ecb171ef7314..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-05-07-12-27-09.bpo-43558.UGhA8R.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add the remark to :mod:`dataclasses` documentation that the :meth:`__init__` of any base class -has to be called in :meth:`__post_init__`, along with a code example. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2021-05-08-09-48-05.bpo-44072.fb2x5I.rst b/Misc/NEWS.d/next/Documentation/2021-05-08-09-48-05.bpo-44072.fb2x5I.rst deleted file mode 100644 index a5b0c95d85e66e..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-05-08-09-48-05.bpo-44072.fb2x5I.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correct where in the numeric ABC hierarchy ``**`` support is added, i.e., in -numbers.Complex, not numbers.Integral. diff --git a/Misc/NEWS.d/next/Documentation/2021-05-17-20-03-47.bpo-41963.eUz9_o.rst b/Misc/NEWS.d/next/Documentation/2021-05-17-20-03-47.bpo-41963.eUz9_o.rst deleted file mode 100644 index b9fe722fa3a795..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-05-17-20-03-47.bpo-41963.eUz9_o.rst +++ /dev/null @@ -1 +0,0 @@ -Document that ``ConfigParser`` strips off comments when reading configuration files. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2021-05-23-09-11-28.bpo-44195.1bqkOs.rst b/Misc/NEWS.d/next/Documentation/2021-05-23-09-11-28.bpo-44195.1bqkOs.rst deleted file mode 100644 index 5f165f166a377f..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-05-23-09-11-28.bpo-44195.1bqkOs.rst +++ /dev/null @@ -1,2 +0,0 @@ -Corrected references to ``TraversableResources`` in docs. There is no -``TraversableReader``. diff --git a/Misc/NEWS.d/next/Documentation/2021-05-26-11-16-33.bpo-42392.oxRx6E.rst b/Misc/NEWS.d/next/Documentation/2021-05-26-11-16-33.bpo-42392.oxRx6E.rst deleted file mode 100644 index 5c840de6f68ef6..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-05-26-11-16-33.bpo-42392.oxRx6E.rst +++ /dev/null @@ -1,2 +0,0 @@ -Document the deprecation and removal of the ``loop`` parameter for many -functions and classes in :mod:`asyncio`. diff --git a/Misc/NEWS.d/next/Documentation/2021-06-06-14-12-00.bpo-44322.K0PHfE.rst b/Misc/NEWS.d/next/Documentation/2021-06-06-14-12-00.bpo-44322.K0PHfE.rst deleted file mode 100644 index 48dd7e6d97662d..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-06-06-14-12-00.bpo-44322.K0PHfE.rst +++ /dev/null @@ -1,2 +0,0 @@ -Document that SyntaxError args have a details tuple and that details are -adjusted for errors in f-string field replacement expressions. diff --git a/Misc/NEWS.d/next/Documentation/2021-06-14-09-20-37.bpo-38291.VMYa_Q.rst b/Misc/NEWS.d/next/Documentation/2021-06-14-09-20-37.bpo-38291.VMYa_Q.rst deleted file mode 100644 index 23ce35eb176d9d..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-06-14-09-20-37.bpo-38291.VMYa_Q.rst +++ /dev/null @@ -1,2 +0,0 @@ -Mark ``typing.io`` and ``typing.re`` as deprecated since Python 3.8 in the -documentation. They were never properly supported by type checkers. diff --git a/Misc/NEWS.d/next/Documentation/2021-06-16-18-09-49.bpo-44392.6RF1Sc.rst b/Misc/NEWS.d/next/Documentation/2021-06-16-18-09-49.bpo-44392.6RF1Sc.rst deleted file mode 100644 index ac197f22929d14..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-06-16-18-09-49.bpo-44392.6RF1Sc.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added a new section in the C API documentation for types used in type -hinting. Documented ``Py_GenericAlias`` and ``Py_GenericAliasType``. diff --git a/Misc/NEWS.d/next/Documentation/2021-06-18-06-44-45.bpo-44453.3PIkj2.rst b/Misc/NEWS.d/next/Documentation/2021-06-18-06-44-45.bpo-44453.3PIkj2.rst deleted file mode 100644 index fd72cf525c32fb..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-06-18-06-44-45.bpo-44453.3PIkj2.rst +++ /dev/null @@ -1 +0,0 @@ -Fix documentation for the return type of :func:`sysconfig.get_path`. diff --git a/Misc/NEWS.d/next/Documentation/2021-06-18-18-04-53.bpo-27752.NEByNk.rst b/Misc/NEWS.d/next/Documentation/2021-06-18-18-04-53.bpo-27752.NEByNk.rst deleted file mode 100644 index ccb7767a6b6936..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-06-18-18-04-53.bpo-27752.NEByNk.rst +++ /dev/null @@ -1 +0,0 @@ -Documentation of csv.Dialect is more descriptive. diff --git a/Misc/NEWS.d/next/Documentation/2021-06-21-15-46-32.bpo-13814.LDcslu.rst b/Misc/NEWS.d/next/Documentation/2021-06-21-15-46-32.bpo-13814.LDcslu.rst deleted file mode 100644 index db0c6d6524beeb..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-06-21-15-46-32.bpo-13814.LDcslu.rst +++ /dev/null @@ -1 +0,0 @@ -In the Design FAQ, answer "Why don't generators support the with statement?" diff --git a/Misc/NEWS.d/next/Documentation/2021-06-23-15-21-36.bpo-39452.o_I-6d.rst b/Misc/NEWS.d/next/Documentation/2021-06-23-15-21-36.bpo-39452.o_I-6d.rst deleted file mode 100644 index 5c8cbd8e652232..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-06-23-15-21-36.bpo-39452.o_I-6d.rst +++ /dev/null @@ -1,4 +0,0 @@ -Rewrote ``Doc/library/__main__.rst``. Broadened scope of the document to -explicitly discuss and differentiate between ``__main__.py`` in packages -versus the ``__name__ == '__main__'`` expression (and the idioms that -surround it). diff --git a/Misc/NEWS.d/next/Documentation/2021-06-24-14-37-16.bpo-43066.Ti7ahX.rst b/Misc/NEWS.d/next/Documentation/2021-06-24-14-37-16.bpo-43066.Ti7ahX.rst deleted file mode 100644 index 3e38522839e8be..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-06-24-14-37-16.bpo-43066.Ti7ahX.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added a warning to :mod:`zipfile` docs: filename arg with a leading slash may cause archive to -be un-openable on Windows systems. diff --git a/Misc/NEWS.d/next/Documentation/2021-06-26-17-41-06.bpo-40620.PAYDrB.rst b/Misc/NEWS.d/next/Documentation/2021-06-26-17-41-06.bpo-40620.PAYDrB.rst deleted file mode 100644 index 52b451b492640e..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-06-26-17-41-06.bpo-40620.PAYDrB.rst +++ /dev/null @@ -1,2 +0,0 @@ -Convert examples in tutorial controlflow.rst section 4.3 to be interpreter-demo -style. diff --git a/Misc/NEWS.d/next/Documentation/2021-06-28-12-13-48.bpo-38062.9Ehp9O.rst b/Misc/NEWS.d/next/Documentation/2021-06-28-12-13-48.bpo-38062.9Ehp9O.rst deleted file mode 100644 index 1d90096e20bfa4..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-06-28-12-13-48.bpo-38062.9Ehp9O.rst +++ /dev/null @@ -1 +0,0 @@ -Clarify that atexit uses equality comparisons internally. diff --git a/Misc/NEWS.d/next/Documentation/2021-07-02-14-02-29.bpo-44544._5_aCz.rst b/Misc/NEWS.d/next/Documentation/2021-07-02-14-02-29.bpo-44544._5_aCz.rst deleted file mode 100644 index 4bb69977e0c1a4..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-07-02-14-02-29.bpo-44544._5_aCz.rst +++ /dev/null @@ -1,4 +0,0 @@ -List all kwargs for :func:`textwrap.wrap`, :func:`textwrap.fill`, and -:func:`textwrap.shorten`. Now, there are nav links to attributes of -:class:`TextWrap`, which makes navigation much easier while minimizing -duplication in the documentation. diff --git a/Misc/NEWS.d/next/Documentation/2021-07-03-18-25-17.bpo-44558.0pTknl.rst b/Misc/NEWS.d/next/Documentation/2021-07-03-18-25-17.bpo-44558.0pTknl.rst deleted file mode 100644 index a12a49ccd80cc2..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-07-03-18-25-17.bpo-44558.0pTknl.rst +++ /dev/null @@ -1,2 +0,0 @@ -Match the docstring and python implementation of :func:`~operator.countOf` to the behavior -of its c implementation. diff --git a/Misc/NEWS.d/next/Documentation/2021-07-12-11-39-20.bpo-44613.DIXNzc.rst b/Misc/NEWS.d/next/Documentation/2021-07-12-11-39-20.bpo-44613.DIXNzc.rst deleted file mode 100644 index baf591073620c8..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-07-12-11-39-20.bpo-44613.DIXNzc.rst +++ /dev/null @@ -1 +0,0 @@ -importlib.metadata is no longer provisional. diff --git a/Misc/NEWS.d/next/Documentation/2021-07-13-22-25-13.bpo-44631.qkGwe4.rst b/Misc/NEWS.d/next/Documentation/2021-07-13-22-25-13.bpo-44631.qkGwe4.rst deleted file mode 100644 index b0898fe1ad9995..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-07-13-22-25-13.bpo-44631.qkGwe4.rst +++ /dev/null @@ -1 +0,0 @@ -Refactored the ``repr()`` code of the ``_Environ`` (os module). \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2021-07-15-11-19-03.bpo-42958.gC5IHM.rst b/Misc/NEWS.d/next/Documentation/2021-07-15-11-19-03.bpo-42958.gC5IHM.rst deleted file mode 100644 index c93b84d095526e..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-07-15-11-19-03.bpo-42958.gC5IHM.rst +++ /dev/null @@ -1,2 +0,0 @@ -Updated the docstring and docs of :func:`filecmp.cmp` to be more accurate -and less confusing especially in respect to *shallow* arg. diff --git a/Misc/NEWS.d/next/Documentation/2021-07-18-22-26-02.bpo-44651.SjT9iY.rst b/Misc/NEWS.d/next/Documentation/2021-07-18-22-26-02.bpo-44651.SjT9iY.rst deleted file mode 100644 index 20796e2a9bb693..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-07-18-22-26-02.bpo-44651.SjT9iY.rst +++ /dev/null @@ -1 +0,0 @@ -Delete entry "coercion" in Doc/glossary.rst for its outdated definition. diff --git a/Misc/NEWS.d/next/Documentation/2021-07-18-22-43-14.bpo-44561.T7HpWm.rst b/Misc/NEWS.d/next/Documentation/2021-07-18-22-43-14.bpo-44561.T7HpWm.rst deleted file mode 100644 index 53238533edabbf..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-07-18-22-43-14.bpo-44561.T7HpWm.rst +++ /dev/null @@ -1,3 +0,0 @@ -Update of three expired hyperlinks in Doc/distributing/index.rst: -"Project structure", "Building and packaging the project", and "Uploading the -project to the Python Packaging Index". diff --git a/Misc/NEWS.d/next/Documentation/2021-07-20-21-03-18.bpo-30511.eMFkRi.rst b/Misc/NEWS.d/next/Documentation/2021-07-20-21-03-18.bpo-30511.eMFkRi.rst deleted file mode 100644 index a358fb9cc2860b..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-07-20-21-03-18.bpo-30511.eMFkRi.rst +++ /dev/null @@ -1,2 +0,0 @@ -Clarify that :func:`shutil.make_archive` is not thread-safe due to -reliance on changing the current working directory. diff --git a/Misc/NEWS.d/next/Documentation/2021-07-22-08-28-03.bpo-35183.p9BWTB.rst b/Misc/NEWS.d/next/Documentation/2021-07-22-08-28-03.bpo-35183.p9BWTB.rst deleted file mode 100644 index 02c5fe82611fbf..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-07-22-08-28-03.bpo-35183.p9BWTB.rst +++ /dev/null @@ -1 +0,0 @@ -Add typical examples to os.path.splitext docs \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2021-07-25-23-04-15.bpo-44693.JuCbNq.rst b/Misc/NEWS.d/next/Documentation/2021-07-25-23-04-15.bpo-44693.JuCbNq.rst deleted file mode 100644 index 614abb412df8ea..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-07-25-23-04-15.bpo-44693.JuCbNq.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update the definition of __future__ in the glossary by replacing the confusing -word "pseudo-module" with a more accurate description. diff --git a/Misc/NEWS.d/next/Documentation/2021-07-26-23-48-31.bpo-44740.zMFGMV.rst b/Misc/NEWS.d/next/Documentation/2021-07-26-23-48-31.bpo-44740.zMFGMV.rst deleted file mode 100644 index c01273f5ddc269..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-07-26-23-48-31.bpo-44740.zMFGMV.rst +++ /dev/null @@ -1,2 +0,0 @@ -Replaced occurences of uppercase "Web" and "Internet" with lowercase -versions per the 2016 revised Associated Press Style Book. diff --git a/Misc/NEWS.d/next/Documentation/2021-08-09-19-58-45.bpo-36700.WPNW5f.rst b/Misc/NEWS.d/next/Documentation/2021-08-09-19-58-45.bpo-36700.WPNW5f.rst deleted file mode 100644 index 5bc1e23b285970..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-08-09-19-58-45.bpo-36700.WPNW5f.rst +++ /dev/null @@ -1,3 +0,0 @@ -:mod:`base64` RFC references were updated to point to :rfc:`4648`; a section -was added to point users to the new "security considerations" section of the -RFC. diff --git a/Misc/NEWS.d/next/Documentation/2021-08-11-18-02-06.bpo-33479.rCe4c5.rst b/Misc/NEWS.d/next/Documentation/2021-08-11-18-02-06.bpo-33479.rCe4c5.rst deleted file mode 100644 index c4a8a981939dec..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-08-11-18-02-06.bpo-33479.rCe4c5.rst +++ /dev/null @@ -1,2 +0,0 @@ -Tkinter documentation has been greatly expanded with new "Architecture" and -"Threading model" sections. diff --git a/Misc/NEWS.d/next/Documentation/2021-08-13-19-08-03.bpo-44903.aJuvQF.rst b/Misc/NEWS.d/next/Documentation/2021-08-13-19-08-03.bpo-44903.aJuvQF.rst deleted file mode 100644 index e357405085ca06..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-08-13-19-08-03.bpo-44903.aJuvQF.rst +++ /dev/null @@ -1,3 +0,0 @@ -Removed the othergui.rst file, any references to it, and the list of GUI -frameworks in the FAQ. In their place I've added links to the Python Wiki -`page on GUI frameworks `. diff --git a/Misc/NEWS.d/next/Documentation/2021-08-13-20-17-59.bpo-16580.MZ_iK9.rst b/Misc/NEWS.d/next/Documentation/2021-08-13-20-17-59.bpo-16580.MZ_iK9.rst deleted file mode 100644 index edeca6f66e5394..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-08-13-20-17-59.bpo-16580.MZ_iK9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added code equivalents for the :meth:`int.to_bytes` and :meth:`int.from_bytes` -methods, as well as tests ensuring that these code equivalents are valid. diff --git a/Misc/NEWS.d/next/Documentation/2021-08-19-15-53-08.bpo-44957.imqrh3.rst b/Misc/NEWS.d/next/Documentation/2021-08-19-15-53-08.bpo-44957.imqrh3.rst deleted file mode 100644 index 20a2aecc94ee19..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-08-19-15-53-08.bpo-44957.imqrh3.rst +++ /dev/null @@ -1,3 +0,0 @@ -Promote PEP 604 union syntax by using it where possible. Also, mention ``X | -Y`` more prominently in section about ``Union`` and mention ``X | None`` at -all in section about ``Optional``. diff --git a/Misc/NEWS.d/next/Documentation/2021-09-08-17-20-19.bpo-45024.dkNPNi.rst b/Misc/NEWS.d/next/Documentation/2021-09-08-17-20-19.bpo-45024.dkNPNi.rst deleted file mode 100644 index e73d52b8cc514e..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-09-08-17-20-19.bpo-45024.dkNPNi.rst +++ /dev/null @@ -1,4 +0,0 @@ -:mod:`collections.abc` documentation has been expanded to explicitly cover -how instance and subclass checks work, with additional doctest examples and -an exhaustive list of ABCs which test membership purely by presence of the -right :term:`special method`\s. Patch by Raymond Hettinger. diff --git a/Misc/NEWS.d/next/Documentation/2021-09-18-13-45-19.bpo-45216.o56nyt.rst b/Misc/NEWS.d/next/Documentation/2021-09-18-13-45-19.bpo-45216.o56nyt.rst deleted file mode 100644 index d10b18ecdb8fd9..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-09-18-13-45-19.bpo-45216.o56nyt.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove extra documentation listing methods in ``difflib``. It was rendering -twice in pydoc and was outdated in some places. diff --git a/Misc/NEWS.d/next/IDLE/2021-05-05-09-45-24.bpo-44026.m2Z0zR.rst b/Misc/NEWS.d/next/IDLE/2021-05-05-09-45-24.bpo-44026.m2Z0zR.rst deleted file mode 100644 index bc4b680983a59a..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-05-05-09-45-24.bpo-44026.m2Z0zR.rst +++ /dev/null @@ -1,2 +0,0 @@ -Include interpreter's typo fix suggestions in message line for -NameErrors and AttributeErrors. Patch by E. Paine. diff --git a/Misc/NEWS.d/next/IDLE/2021-05-09-09-02-09.bpo-44010.TaLe9x.rst b/Misc/NEWS.d/next/IDLE/2021-05-09-09-02-09.bpo-44010.TaLe9x.rst deleted file mode 100644 index becd331f6d789c..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-05-09-09-02-09.bpo-44010.TaLe9x.rst +++ /dev/null @@ -1,5 +0,0 @@ -Highlight the new :ref:`match ` statement's -:ref:`soft keywords `: :keyword:`match`, -:keyword:`case `, and :keyword:`_ `. -However, this highlighting is not perfect and will be incorrect in some -rare cases, including some ``_``-s in ``case`` patterns. diff --git a/Misc/NEWS.d/next/IDLE/2021-05-27-13-39-43.bpo-41611.liNQqj.rst b/Misc/NEWS.d/next/IDLE/2021-05-27-13-39-43.bpo-41611.liNQqj.rst deleted file mode 100644 index 27d778bbe41009..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-05-27-13-39-43.bpo-41611.liNQqj.rst +++ /dev/null @@ -1 +0,0 @@ -Fix IDLE sometimes freezing upon tab-completion on macOS. diff --git a/Misc/NEWS.d/next/IDLE/2021-05-27-18-22-46.bpo-41611.jOKpfc.rst b/Misc/NEWS.d/next/IDLE/2021-05-27-18-22-46.bpo-41611.jOKpfc.rst deleted file mode 100644 index a80c9f7c5a73b6..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-05-27-18-22-46.bpo-41611.jOKpfc.rst +++ /dev/null @@ -1 +0,0 @@ -Avoid uncaught exceptions in ``AutoCompleteWindow.winconfig_event()``. diff --git a/Misc/NEWS.d/next/IDLE/2021-06-08-03-04-51.bpo-40468.tUCGUb.rst b/Misc/NEWS.d/next/IDLE/2021-06-08-03-04-51.bpo-40468.tUCGUb.rst deleted file mode 100644 index 526036ccf841ee..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-06-08-03-04-51.bpo-40468.tUCGUb.rst +++ /dev/null @@ -1,4 +0,0 @@ -Split the settings dialog General tab into Windows and Shell/ED tabs. -Move help sources, which extend the Help menu, to the Extensions tab. -Make space for new options and shorten the dialog. -The latter makes the dialog better fit small screens. diff --git a/Misc/NEWS.d/next/IDLE/2021-06-10-00-50-02.bpo-33962.ikAUNg.rst b/Misc/NEWS.d/next/IDLE/2021-06-10-00-50-02.bpo-33962.ikAUNg.rst deleted file mode 100644 index b15fa8f184792a..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-06-10-00-50-02.bpo-33962.ikAUNg.rst +++ /dev/null @@ -1,2 +0,0 @@ -Move the indent space setting from the Font tab to the new Windows tab. -Patch by Mark Roseman and Terry Jan Reedy. diff --git a/Misc/NEWS.d/next/IDLE/2021-06-11-17-43-39.bpo-40128.7vDN3U.rst b/Misc/NEWS.d/next/IDLE/2021-06-11-17-43-39.bpo-40128.7vDN3U.rst deleted file mode 100644 index dafbe2cd5c3a8f..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-06-11-17-43-39.bpo-40128.7vDN3U.rst +++ /dev/null @@ -1,3 +0,0 @@ -Mostly fix completions on macOS when not using tcl/tk 8.6.11 (as with 3.9). -The added update_idletask call should be harmless and possibly helpful -otherwise. diff --git a/Misc/NEWS.d/next/IDLE/2021-09-15-03-20-06.bpo-45193.G61_GV.rst b/Misc/NEWS.d/next/IDLE/2021-09-15-03-20-06.bpo-45193.G61_GV.rst deleted file mode 100644 index 94729640c71eb4..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-09-15-03-20-06.bpo-45193.G61_GV.rst +++ /dev/null @@ -1 +0,0 @@ -Make completion boxes appear on Ubuntu again. diff --git a/Misc/NEWS.d/next/IDLE/2021-09-27-01-21-59.bpo-45296.9H8rdY.rst b/Misc/NEWS.d/next/IDLE/2021-09-27-01-21-59.bpo-45296.9H8rdY.rst deleted file mode 100644 index 52bade1e5327b9..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-09-27-01-21-59.bpo-45296.9H8rdY.rst +++ /dev/null @@ -1,2 +0,0 @@ -On Windows, change exit/quit message to suggest Ctrl-D, which works, instead -of , which does not work in IDLE. diff --git a/Misc/NEWS.d/next/Library/2017-09-20-14-43-03.bpo-29298._78CSN.rst b/Misc/NEWS.d/next/Library/2017-09-20-14-43-03.bpo-29298._78CSN.rst deleted file mode 100644 index e84c6de02cd27e..00000000000000 --- a/Misc/NEWS.d/next/Library/2017-09-20-14-43-03.bpo-29298._78CSN.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``TypeError`` when required subparsers without ``dest`` do not receive -arguments. Patch by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Library/2018-04-24-14-25-07.bpo-33349.Y_0LIr.rst b/Misc/NEWS.d/next/Library/2018-04-24-14-25-07.bpo-33349.Y_0LIr.rst deleted file mode 100644 index be68b3ea7c4a2a..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-04-24-14-25-07.bpo-33349.Y_0LIr.rst +++ /dev/null @@ -1 +0,0 @@ -lib2to3 now recognizes async generators everywhere. diff --git a/Misc/NEWS.d/next/Library/2019-02-26-09-31-59.bpo-26228.wyrHKc.rst b/Misc/NEWS.d/next/Library/2019-02-26-09-31-59.bpo-26228.wyrHKc.rst deleted file mode 100644 index c6ca84ae3b6399..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-26-09-31-59.bpo-26228.wyrHKc.rst +++ /dev/null @@ -1 +0,0 @@ -pty.spawn no longer hangs on FreeBSD, macOS, and Solaris. diff --git a/Misc/NEWS.d/next/Library/2019-05-08-15-14-32.bpo-16379.rN5JVe.rst b/Misc/NEWS.d/next/Library/2019-05-08-15-14-32.bpo-16379.rN5JVe.rst deleted file mode 100644 index 874a9cf77d8c01..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-08-15-14-32.bpo-16379.rN5JVe.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add SQLite error code and name to :mod:`sqlite3` exceptions. -Patch by Aviv Palivoda, Daniel Shahaf, and Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2019-06-03-23-53-25.bpo-27513.qITN7d.rst b/Misc/NEWS.d/next/Library/2019-06-03-23-53-25.bpo-27513.qITN7d.rst deleted file mode 100644 index 90d49bb2a993f1..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-06-03-23-53-25.bpo-27513.qITN7d.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`email.utils.getaddresses` now accepts -:class:`email.header.Header` objects along with string values. -Patch by Zackery Spytz. diff --git a/Misc/NEWS.d/next/Library/2019-09-25-13-54-41.bpo-30256.wBkzox.rst b/Misc/NEWS.d/next/Library/2019-09-25-13-54-41.bpo-30256.wBkzox.rst deleted file mode 100644 index 698b0e8a61c0d8..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-09-25-13-54-41.bpo-30256.wBkzox.rst +++ /dev/null @@ -1 +0,0 @@ -Pass multiprocessing BaseProxy argument ``manager_owned`` through AutoProxy. diff --git a/Misc/NEWS.d/next/Library/2019-10-08-14-08-59.bpo-38415.N1bUw6.rst b/Misc/NEWS.d/next/Library/2019-10-08-14-08-59.bpo-38415.N1bUw6.rst deleted file mode 100644 index f99bf0d19b1f8e..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-10-08-14-08-59.bpo-38415.N1bUw6.rst +++ /dev/null @@ -1,3 +0,0 @@ -Added missing behavior to :func:`contextlib.asynccontextmanager` to match -:func:`contextlib.contextmanager` so decorated functions can themselves be -decorators. diff --git a/Misc/NEWS.d/next/Library/2019-11-12-18-59-33.bpo-38741.W7IYkq.rst b/Misc/NEWS.d/next/Library/2019-11-12-18-59-33.bpo-38741.W7IYkq.rst deleted file mode 100644 index 39d84ccea55b8c..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-11-12-18-59-33.bpo-38741.W7IYkq.rst +++ /dev/null @@ -1 +0,0 @@ -:mod:`configparser`: using ']' inside a section header will no longer cut the section name short at the ']' \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-01-16-13-54-28.bpo-39359.hzTu0h.rst b/Misc/NEWS.d/next/Library/2020-01-16-13-54-28.bpo-39359.hzTu0h.rst deleted file mode 100644 index ed4eb0c873d86a..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-16-13-54-28.bpo-39359.hzTu0h.rst +++ /dev/null @@ -1 +0,0 @@ -Add one missing check that the password is a bytes object for an encrypted zipfile. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-01-16-23-41-16.bpo-38840.VzzYZz.rst b/Misc/NEWS.d/next/Library/2020-01-16-23-41-16.bpo-38840.VzzYZz.rst deleted file mode 100644 index 727f62b52a710b..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-16-23-41-16.bpo-38840.VzzYZz.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``test___all__`` on platforms lacking a shared memory implementation. diff --git a/Misc/NEWS.d/next/Library/2020-01-25-12-58-20.bpo-37022.FUZI25.rst b/Misc/NEWS.d/next/Library/2020-01-25-12-58-20.bpo-37022.FUZI25.rst deleted file mode 100644 index 7b923b3aa6e444..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-25-12-58-20.bpo-37022.FUZI25.rst +++ /dev/null @@ -1 +0,0 @@ -:mod:`pdb` now displays exceptions from ``repr()`` with its ``p`` and ``pp`` commands. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-02-03-21-18-31.bpo-39549.l4a8uH.rst b/Misc/NEWS.d/next/Library/2020-02-03-21-18-31.bpo-39549.l4a8uH.rst deleted file mode 100644 index 91d63a96763cee..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-02-03-21-18-31.bpo-39549.l4a8uH.rst +++ /dev/null @@ -1,4 +0,0 @@ -Whereas the code for reprlib.Repr had previously used a hardcoded string -value of '...', this PR updates it to use of a “fillvalue” attribute, whose -value defaults to '...' and can be reset in either individual reprlib.Repr -instances or in subclasses thereof. diff --git a/Misc/NEWS.d/next/Library/2020-04-24-20-39-38.bpo-34990.3SmL9M.rst b/Misc/NEWS.d/next/Library/2020-04-24-20-39-38.bpo-34990.3SmL9M.rst deleted file mode 100644 index d420b5dce1e3b5..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-04-24-20-39-38.bpo-34990.3SmL9M.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a Y2k38 bug in the compileall module where it would fail to compile -files with a modification time after the year 2038. diff --git a/Misc/NEWS.d/next/Library/2020-05-21-01-42-32.bpo-40563.fDn5bP.rst b/Misc/NEWS.d/next/Library/2020-05-21-01-42-32.bpo-40563.fDn5bP.rst deleted file mode 100644 index f20664637669af..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-21-01-42-32.bpo-40563.fDn5bP.rst +++ /dev/null @@ -1 +0,0 @@ -Support pathlike objects on dbm/shelve. Patch by Hakan Çelik and Henry-Joseph Audéoud. diff --git a/Misc/NEWS.d/next/Library/2020-05-25-23-58-29.bpo-5846.O9BIfm.rst b/Misc/NEWS.d/next/Library/2020-05-25-23-58-29.bpo-5846.O9BIfm.rst deleted file mode 100644 index 556c54d0d1718b..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-25-23-58-29.bpo-5846.O9BIfm.rst +++ /dev/null @@ -1,14 +0,0 @@ -Deprecated the following :mod:`unittest` functions, scheduled for removal in -Python 3.13: - -* :func:`~unittest.findTestCases` -* :func:`~unittest.makeSuite` -* :func:`~unittest.getTestCaseNames` - -Use :class:`~unittest.TestLoader` methods instead: - -* :meth:`unittest.TestLoader.loadTestsFromModule` -* :meth:`unittest.TestLoader.loadTestsFromTestCase` -* :meth:`unittest.TestLoader.getTestCaseNames` - -Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2020-05-30-10-48-04.bpo-24391.ZCTnhX.rst b/Misc/NEWS.d/next/Library/2020-05-30-10-48-04.bpo-24391.ZCTnhX.rst deleted file mode 100644 index 15add1531501aa..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-30-10-48-04.bpo-24391.ZCTnhX.rst +++ /dev/null @@ -1,3 +0,0 @@ -Improved reprs of :mod:`threading` synchronization objects: -:class:`~threading.Semaphore`, :class:`~threading.BoundedSemaphore`, -:class:`~threading.Event` and :class:`~threading.Barrier`. diff --git a/Misc/NEWS.d/next/Library/2020-07-01-17-42-41.bpo-41137.AnqbP-.rst b/Misc/NEWS.d/next/Library/2020-07-01-17-42-41.bpo-41137.AnqbP-.rst deleted file mode 100644 index f91b47dd724619..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-01-17-42-41.bpo-41137.AnqbP-.rst +++ /dev/null @@ -1 +0,0 @@ -Use utf-8 encoding while reading .pdbrc files. Patch by Srinivas Reddy Thatiparthy \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-07-13-23-46-59.bpo-32695.tTqqXe.rst b/Misc/NEWS.d/next/Library/2020-07-13-23-46-59.bpo-32695.tTqqXe.rst deleted file mode 100644 index c71316ed656a2b..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-13-23-46-59.bpo-32695.tTqqXe.rst +++ /dev/null @@ -1,2 +0,0 @@ -The *compresslevel* and *preset* keyword arguments of :func:`tarfile.open` -are now both documented and tested. diff --git a/Misc/NEWS.d/next/Library/2020-07-26-18-17-30.bpo-41402.YRkVkp.rst b/Misc/NEWS.d/next/Library/2020-07-26-18-17-30.bpo-41402.YRkVkp.rst deleted file mode 100644 index 45585a469e7247..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-26-18-17-30.bpo-41402.YRkVkp.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :meth:`email.message.EmailMessage.set_content` when called with binary data and ``7bit`` content transfer encoding. diff --git a/Misc/NEWS.d/next/Library/2020-07-30-14-37-15.bpo-20684.qV35GU.rst b/Misc/NEWS.d/next/Library/2020-07-30-14-37-15.bpo-20684.qV35GU.rst deleted file mode 100644 index 56bc1e4cb4ef06..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-30-14-37-15.bpo-20684.qV35GU.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove unused ``_signature_get_bound_param`` function from :mod:`inspect` - -by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Library/2020-09-10-07-23-24.bpo-41730.DyKFi9.rst b/Misc/NEWS.d/next/Library/2020-09-10-07-23-24.bpo-41730.DyKFi9.rst deleted file mode 100644 index 63d8353a7aab2e..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-10-07-23-24.bpo-41730.DyKFi9.rst +++ /dev/null @@ -1 +0,0 @@ -``DeprecationWarning`` is now raised when importing :mod:`tkinter.tix`, which has been deprecated in documentation since Python 3.6. diff --git a/Misc/NEWS.d/next/Library/2020-10-01-21-46-34.bpo-40956._tvsZ7.rst b/Misc/NEWS.d/next/Library/2020-10-01-21-46-34.bpo-40956._tvsZ7.rst deleted file mode 100644 index adec299d2316a8..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-01-21-46-34.bpo-40956._tvsZ7.rst +++ /dev/null @@ -1 +0,0 @@ -Use Argument Clinic in :mod:`sqlite3`. Patches by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2020-10-11-20-23-48.bpo-37449.f-t3V6.rst b/Misc/NEWS.d/next/Library/2020-10-11-20-23-48.bpo-37449.f-t3V6.rst deleted file mode 100644 index 2202ae0a9ac969..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-11-20-23-48.bpo-37449.f-t3V6.rst +++ /dev/null @@ -1 +0,0 @@ -``ensurepip`` now uses ``importlib.resources.files()`` traversable APIs diff --git a/Misc/NEWS.d/next/Library/2020-10-18-09-42-53.bpo-40497.CRz2sG.rst b/Misc/NEWS.d/next/Library/2020-10-18-09-42-53.bpo-40497.CRz2sG.rst deleted file mode 100644 index 067c48626c3083..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-18-09-42-53.bpo-40497.CRz2sG.rst +++ /dev/null @@ -1,4 +0,0 @@ -:meth:`subprocess.check_output` now raises :exc:`ValueError` when the -invalid keyword argument *check* is passed by user code. Previously -such use would fail later with a :exc:`TypeError`. -Patch by Rémi Lapeyre. diff --git a/Misc/NEWS.d/next/Library/2020-12-08-01-08-58.bpo-41818.zO8vV7.rst b/Misc/NEWS.d/next/Library/2020-12-08-01-08-58.bpo-41818.zO8vV7.rst deleted file mode 100644 index e8d6063d4b5e79..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-08-01-08-58.bpo-41818.zO8vV7.rst +++ /dev/null @@ -1 +0,0 @@ -Soumendra Ganguly: add termios.tcgetwinsize(), termios.tcsetwinsize(). \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-01-13-00-02-44.bpo-42862.Z6ACLN.rst b/Misc/NEWS.d/next/Library/2021-01-13-00-02-44.bpo-42862.Z6ACLN.rst deleted file mode 100644 index beda25fd335b08..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-13-00-02-44.bpo-42862.Z6ACLN.rst +++ /dev/null @@ -1,4 +0,0 @@ -:mod:`sqlite3` now utilizes :meth:`functools.lru_cache` to implement the -connection statement cache. As a small optimisation, the default -statement cache size has been increased from 100 to 128. -Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2021-01-16-18-36-00.bpo-33809.BiMK6V.rst b/Misc/NEWS.d/next/Library/2021-01-16-18-36-00.bpo-33809.BiMK6V.rst deleted file mode 100644 index a8a550dc0d4183..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-16-18-36-00.bpo-33809.BiMK6V.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add the :meth:`traceback.TracebackException.print` method which prints -the formatted exception information. diff --git a/Misc/NEWS.d/next/Library/2021-01-25-21-24-55.bpo-43024.vAUrIi.rst b/Misc/NEWS.d/next/Library/2021-01-25-21-24-55.bpo-43024.vAUrIi.rst deleted file mode 100644 index 56596ce3c2a978..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-25-21-24-55.bpo-43024.vAUrIi.rst +++ /dev/null @@ -1 +0,0 @@ -Improve the help signature of :func:`traceback.print_exception`, :func:`traceback.format_exception` and :func:`traceback.format_exception_only`. diff --git a/Misc/NEWS.d/next/Library/2021-01-31-18-24-54.bpo-43086.2_P-SH.rst b/Misc/NEWS.d/next/Library/2021-01-31-18-24-54.bpo-43086.2_P-SH.rst deleted file mode 100644 index f49e7a84cc5375..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-31-18-24-54.bpo-43086.2_P-SH.rst +++ /dev/null @@ -1,3 +0,0 @@ -Added a new optional :code:`strict_mode` parameter to *binascii.a2b_base64*. -When :code:`scrict_mode` is set to :code:`True`, the *a2b_base64* function will accept only valid base64 content. -More details about what "valid base64 content" is, can be found in the function's documentation. diff --git a/Misc/NEWS.d/next/Library/2021-02-02-20-11-14.bpo-42971.OpVoFu.rst b/Misc/NEWS.d/next/Library/2021-02-02-20-11-14.bpo-42971.OpVoFu.rst deleted file mode 100644 index 97c8d2d79aa404..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-02-02-20-11-14.bpo-42971.OpVoFu.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add definition of ``errno.EQFULL`` for platforms that define this constant -(such as macOS). diff --git a/Misc/NEWS.d/next/Library/2021-02-04-23-16-03.bpo-30077.v6TqAi.rst b/Misc/NEWS.d/next/Library/2021-02-04-23-16-03.bpo-30077.v6TqAi.rst deleted file mode 100644 index 4af17eed8f7336..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-02-04-23-16-03.bpo-30077.v6TqAi.rst +++ /dev/null @@ -1 +0,0 @@ -Added support for Apple's aifc/sowt pseudo-compression \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-02-15-21-17-46.bpo-43232.awc4yZ.rst b/Misc/NEWS.d/next/Library/2021-02-15-21-17-46.bpo-43232.awc4yZ.rst deleted file mode 100644 index a527a7ba95657f..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-02-15-21-17-46.bpo-43232.awc4yZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Prohibit previously deprecated potentially disruptive operations on -:class:`asyncio.trsock.TransportSocket`. Patch by Illia Volochii. diff --git a/Misc/NEWS.d/next/Library/2021-02-15-22-14-31.bpo-43234.F-vKAT.rst b/Misc/NEWS.d/next/Library/2021-02-15-22-14-31.bpo-43234.F-vKAT.rst deleted file mode 100644 index 7f195cc752fc13..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-02-15-22-14-31.bpo-43234.F-vKAT.rst +++ /dev/null @@ -1,3 +0,0 @@ -Prohibit passing non-:class:`concurrent.futures.ThreadPoolExecutor` -executors to :meth:`loop.set_default_executor` following a deprecation in -Python 3.8. Patch by Illia Volochii. diff --git a/Misc/NEWS.d/next/Library/2021-02-25-08-32-06.bpo-43318.bZJw6V.rst b/Misc/NEWS.d/next/Library/2021-02-25-08-32-06.bpo-43318.bZJw6V.rst deleted file mode 100644 index c2c9c8776fd86d..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-02-25-08-32-06.bpo-43318.bZJw6V.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a bug where :mod:`pdb` does not always echo cleared breakpoints. diff --git a/Misc/NEWS.d/next/Library/2021-03-03-13-32-37.bpo-43392.QQumou.rst b/Misc/NEWS.d/next/Library/2021-03-03-13-32-37.bpo-43392.QQumou.rst deleted file mode 100644 index 175836b89170aa..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-03-03-13-32-37.bpo-43392.QQumou.rst +++ /dev/null @@ -1,4 +0,0 @@ -:func:`importlib._bootstrap._find_and_load` now implements a two-step -check to avoid locking when modules have been already imported and are -ready. This improves performance of repeated calls to -:func:`importlib.import_module` and :func:`importlib.__import__`. diff --git a/Misc/NEWS.d/next/Library/2021-03-24-09-40-02.bpo-43612.vMGZ4y.rst b/Misc/NEWS.d/next/Library/2021-03-24-09-40-02.bpo-43612.vMGZ4y.rst deleted file mode 100644 index e6fc88f45eea5e..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-03-24-09-40-02.bpo-43612.vMGZ4y.rst +++ /dev/null @@ -1,5 +0,0 @@ -:func:`zlib.compress` now accepts a wbits parameter which allows users to -compress data as a raw deflate block without zlib headers and trailers in -one go. Previously this required instantiating a ``zlib.compressobj``. It -also provides a faster alternative to ``gzip.compress`` when wbits=31 is -used. diff --git a/Misc/NEWS.d/next/Library/2021-03-29-00-23-30.bpo-43650.v01tic.rst b/Misc/NEWS.d/next/Library/2021-03-29-00-23-30.bpo-43650.v01tic.rst deleted file mode 100644 index a2ea4a4800a738..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-03-29-00-23-30.bpo-43650.v01tic.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :exc:`MemoryError` in :func:`shutil.unpack_archive` which fails inside -:func:`shutil._unpack_zipfile` on large files. Patch by Igor Bolshakov. diff --git a/Misc/NEWS.d/next/Library/2021-03-30-08-39-08.bpo-43666.m72tlH.rst b/Misc/NEWS.d/next/Library/2021-03-30-08-39-08.bpo-43666.m72tlH.rst deleted file mode 100644 index 6a3432191d61ba..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-03-30-08-39-08.bpo-43666.m72tlH.rst +++ /dev/null @@ -1,6 +0,0 @@ -AIX: `Lib/_aix_support.get_platform()` may fail in an AIX WPAR. -The fileset bos.rte appears to have a builddate in both LPAR and WPAR -so this fileset is queried rather than bos.mp64. -To prevent a similiar situation (no builddate in ODM) a value (9988) -sufficient for completing a build is provided. -Patch by M Felt. diff --git a/Misc/NEWS.d/next/Library/2021-04-15-12-02-17.bpo-43853.XXCVAp.rst b/Misc/NEWS.d/next/Library/2021-04-15-12-02-17.bpo-43853.XXCVAp.rst deleted file mode 100644 index a0164c4665a056..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-04-15-12-02-17.bpo-43853.XXCVAp.rst +++ /dev/null @@ -1,7 +0,0 @@ -Improved string handling for :mod:`sqlite3` user-defined functions and -aggregates: - -* It is now possible to pass strings with embedded null characters to UDFs -* Conversion failures now correctly raise :exc:`MemoryError` - -Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2021-04-29-00-48-00.bpo-28528.JLAVWj.rst b/Misc/NEWS.d/next/Library/2021-04-29-00-48-00.bpo-28528.JLAVWj.rst deleted file mode 100644 index 97731ad882e032..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-04-29-00-48-00.bpo-28528.JLAVWj.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a bug in :mod:`pdb` where :meth:`~pdb.Pdb.checkline` raises -:exc:`AttributeError` if it is called after :meth:`~pdb.Pdb.reset`. diff --git a/Misc/NEWS.d/next/Library/2021-04-30-16-58-24.bpo-43972.Y2r9lg.rst b/Misc/NEWS.d/next/Library/2021-04-30-16-58-24.bpo-43972.Y2r9lg.rst deleted file mode 100644 index 3d67b885bab105..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-04-30-16-58-24.bpo-43972.Y2r9lg.rst +++ /dev/null @@ -1,3 +0,0 @@ -When :class:`http.server.SimpleHTTPRequestHandler` sends a -``301 (Moved Permanently)`` for a directory path not ending with `/`, add a -``Content-Length: 0`` header. This improves the behavior for certain clients. diff --git a/Misc/NEWS.d/next/Library/2021-05-01-15-43-37.bpo-44002.KLT_wd.rst b/Misc/NEWS.d/next/Library/2021-05-01-15-43-37.bpo-44002.KLT_wd.rst deleted file mode 100644 index 9d662d9827a91d..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-01-15-43-37.bpo-44002.KLT_wd.rst +++ /dev/null @@ -1,5 +0,0 @@ -:mod:`urllib.parse` now uses :func:`functool.lru_cache` for its internal URL -splitting and quoting caches instead of rolling its own like its the '90s. - -The undocumented internal :mod:`urllib.parse` ``Quoted`` class API is now -deprecated, for removal in 3.14. diff --git a/Misc/NEWS.d/next/Library/2021-05-02-13-54-25.bpo-38352.N9MlhV.rst b/Misc/NEWS.d/next/Library/2021-05-02-13-54-25.bpo-38352.N9MlhV.rst deleted file mode 100644 index bf8fe758f35702..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-02-13-54-25.bpo-38352.N9MlhV.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add ``IO``, ``BinaryIO``, ``TextIO``, ``Match``, and ``Pattern`` to -``typing.__all__``. Patch by Jelle Zijlstra. diff --git a/Misc/NEWS.d/next/Library/2021-05-03-10-07-43.bpo-44018.VDyW8f.rst b/Misc/NEWS.d/next/Library/2021-05-03-10-07-43.bpo-44018.VDyW8f.rst deleted file mode 100644 index 87c7d83a7f35c5..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-03-10-07-43.bpo-44018.VDyW8f.rst +++ /dev/null @@ -1 +0,0 @@ -random.seed() no longer mutates bytearray inputs. diff --git a/Misc/NEWS.d/next/Library/2021-05-03-19-59-14.bpo-40465.1tB4Y0.rst b/Misc/NEWS.d/next/Library/2021-05-03-19-59-14.bpo-40465.1tB4Y0.rst deleted file mode 100644 index b8b63debdbc195..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-03-19-59-14.bpo-40465.1tB4Y0.rst +++ /dev/null @@ -1 +0,0 @@ -Remove random module features deprecated in Python 3.9. diff --git a/Misc/NEWS.d/next/Library/2021-05-05-11-44-49.bpo-36515.uOSa3q.rst b/Misc/NEWS.d/next/Library/2021-05-05-11-44-49.bpo-36515.uOSa3q.rst deleted file mode 100644 index dd24474c2fde7e..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-05-11-44-49.bpo-36515.uOSa3q.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :mod:`hashlib` module no longer does unaligned memory accesses when -compiled for ARM platforms. diff --git a/Misc/NEWS.d/next/Library/2021-05-06-16-01-55.bpo-44059.GF5r6O.rst b/Misc/NEWS.d/next/Library/2021-05-06-16-01-55.bpo-44059.GF5r6O.rst deleted file mode 100644 index f734bdb0bce09f..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-06-16-01-55.bpo-44059.GF5r6O.rst +++ /dev/null @@ -1 +0,0 @@ -Register the SerenityOS Browser in the :mod:`webbrowser` module. diff --git a/Misc/NEWS.d/next/Library/2021-05-07-08-39-23.bpo-44061.MvElG6.rst b/Misc/NEWS.d/next/Library/2021-05-07-08-39-23.bpo-44061.MvElG6.rst deleted file mode 100644 index e41f285fae9491..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-07-08-39-23.bpo-44061.MvElG6.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix regression in previous release when calling :func:`pkgutil.iter_modules` -with a list of :class:`pathlib.Path` objects diff --git a/Misc/NEWS.d/next/Library/2021-05-09-03-26-31.bpo-44081.A-Mrto.rst b/Misc/NEWS.d/next/Library/2021-05-09-03-26-31.bpo-44081.A-Mrto.rst deleted file mode 100644 index e4a09e366bd807..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-09-03-26-31.bpo-44081.A-Mrto.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`ast.unparse` now doesn't use redundant spaces to separate ``lambda`` -and the ``:`` if there are no parameters. diff --git a/Misc/NEWS.d/next/Library/2021-05-09-22-52-34.bpo-44089.IoANsN.rst b/Misc/NEWS.d/next/Library/2021-05-09-22-52-34.bpo-44089.IoANsN.rst deleted file mode 100644 index b9bd963582fdc2..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-09-22-52-34.bpo-44089.IoANsN.rst +++ /dev/null @@ -1,2 +0,0 @@ -Allow subclassing ``csv.Error`` in 3.10 (it was allowed in 3.9 and earlier but -was disallowed in early versions of 3.10). diff --git a/Misc/NEWS.d/next/Library/2021-05-10-17-45-00.bpo-44098._MoxuZ.rst b/Misc/NEWS.d/next/Library/2021-05-10-17-45-00.bpo-44098._MoxuZ.rst deleted file mode 100644 index 2aaa8b695af465..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-10-17-45-00.bpo-44098._MoxuZ.rst +++ /dev/null @@ -1,5 +0,0 @@ -``typing.ParamSpec`` will no longer be found in the ``__parameters__`` of -most :mod:`typing` generics except in valid use locations specified by -:pep:`612`. This prevents incorrect usage like ``typing.List[P][int]``. This -change means incorrect usage which may have passed silently in 3.10 beta 1 -and earlier will now error. diff --git a/Misc/NEWS.d/next/Library/2021-05-12-16-43-21.bpo-38908.nM2_rO.rst b/Misc/NEWS.d/next/Library/2021-05-12-16-43-21.bpo-38908.nM2_rO.rst deleted file mode 100644 index 18e3dd4066c4af..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-12-16-43-21.bpo-38908.nM2_rO.rst +++ /dev/null @@ -1,5 +0,0 @@ -Subclasses of ``typing.Protocol`` which only have data variables declared -will now raise a ``TypeError`` when checked with ``isinstance`` unless they -are decorated with :func:`runtime_checkable`. Previously, these checks -passed silently. -Patch provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Library/2021-05-13-19-07-28.bpo-37788.adeFcf.rst b/Misc/NEWS.d/next/Library/2021-05-13-19-07-28.bpo-37788.adeFcf.rst deleted file mode 100644 index 0c33923e992452..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-13-19-07-28.bpo-37788.adeFcf.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a reference leak when a Thread object is never joined. diff --git a/Misc/NEWS.d/next/Library/2021-05-13-19-44-38.bpo-44077.04b2a4.rst b/Misc/NEWS.d/next/Library/2021-05-13-19-44-38.bpo-44077.04b2a4.rst deleted file mode 100644 index 7bb4379f571b68..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-13-19-44-38.bpo-44077.04b2a4.rst +++ /dev/null @@ -1,3 +0,0 @@ -It's now possible to receive the type of service (ToS), a.k.a. differentiated -services (DS), a.k.a. differenciated services code point (DSCP) and excplicit -congestion notification (ECN) IP header fields with ``socket.IP_RECVTOS``. diff --git a/Misc/NEWS.d/next/Library/2021-05-14-16-06-02.bpo-44095.v_pLwY.rst b/Misc/NEWS.d/next/Library/2021-05-14-16-06-02.bpo-44095.v_pLwY.rst deleted file mode 100644 index ee03e933f35d63..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-14-16-06-02.bpo-44095.v_pLwY.rst +++ /dev/null @@ -1,2 +0,0 @@ -:class:`zipfile.Path` now supports :attr:`zipfile.Path.stem`, -:attr:`zipfile.Path.suffixes`, and :attr:`zipfile.Path.suffix` attributes. diff --git a/Misc/NEWS.d/next/Library/2021-05-16-00-00-38.bpo-44145.ko5SJ7.rst b/Misc/NEWS.d/next/Library/2021-05-16-00-00-38.bpo-44145.ko5SJ7.rst deleted file mode 100644 index 40222185d50678..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-16-00-00-38.bpo-44145.ko5SJ7.rst +++ /dev/null @@ -1,3 +0,0 @@ -:mod:`hmac` computations were not releasing the GIL while calling the -OpenSSL ``HMAC_Update`` C API (a new feature in 3.9). This unintentionally -prevented parallel computation as other :mod:`hashlib` algorithms support. diff --git a/Misc/NEWS.d/next/Library/2021-05-16-02-24-23.bpo-44142.t-XU8k.rst b/Misc/NEWS.d/next/Library/2021-05-16-02-24-23.bpo-44142.t-XU8k.rst deleted file mode 100644 index 96fdd7c6566b20..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-16-02-24-23.bpo-44142.t-XU8k.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`ast.unparse` will now drop the redundant parentheses when tuples used -as assignment targets (e.g in for loops). diff --git a/Misc/NEWS.d/next/Library/2021-05-16-11-57-38.bpo-44150.xAhhik.rst b/Misc/NEWS.d/next/Library/2021-05-16-11-57-38.bpo-44150.xAhhik.rst deleted file mode 100644 index f4c2786d13b05e..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-16-11-57-38.bpo-44150.xAhhik.rst +++ /dev/null @@ -1 +0,0 @@ -Add optional *weights* argument to statistics.fmean(). diff --git a/Misc/NEWS.d/next/Library/2021-05-16-17-48-24.bpo-33433.MyzO71.rst b/Misc/NEWS.d/next/Library/2021-05-16-17-48-24.bpo-33433.MyzO71.rst deleted file mode 100644 index 703e038fac9856..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-16-17-48-24.bpo-33433.MyzO71.rst +++ /dev/null @@ -1 +0,0 @@ -For IPv4 mapped IPv6 addresses (:rfc:`4291` Section 2.5.5.2), the :mod:`ipaddress.IPv6Address.is_private` check is deferred to the mapped IPv4 address. This solves a bug where public mapped IPv4 addresses were considered private by the IPv6 check. diff --git a/Misc/NEWS.d/next/Library/2021-05-17-07-24-24.bpo-44154.GRI5bf.rst b/Misc/NEWS.d/next/Library/2021-05-17-07-24-24.bpo-44154.GRI5bf.rst deleted file mode 100644 index 3ec326e875eccd..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-17-07-24-24.bpo-44154.GRI5bf.rst +++ /dev/null @@ -1 +0,0 @@ -Optimize :class:`fractions.Fraction` pickling for large components. diff --git a/Misc/NEWS.d/next/Library/2021-05-17-21-05-06.bpo-4928.Ot2yjO.rst b/Misc/NEWS.d/next/Library/2021-05-17-21-05-06.bpo-4928.Ot2yjO.rst deleted file mode 100644 index 359f8015821544..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-17-21-05-06.bpo-4928.Ot2yjO.rst +++ /dev/null @@ -1 +0,0 @@ -Documented existing behavior on POSIX: NamedTemporaryFiles are not deleted when creating process is killed with SIGKILL \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-05-18-00-17-21.bpo-27334.32EJZi.rst b/Misc/NEWS.d/next/Library/2021-05-18-00-17-21.bpo-27334.32EJZi.rst deleted file mode 100644 index dc0cdf33ec5acf..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-18-00-17-21.bpo-27334.32EJZi.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :mod:`sqlite3` context manager now performs a rollback (thus releasing the -database lock) if commit failed. Patch by Luca Citi and Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2021-05-21-12-12-35.bpo-43643.GWnmcF.rst b/Misc/NEWS.d/next/Library/2021-05-21-12-12-35.bpo-43643.GWnmcF.rst deleted file mode 100644 index 57157dfe217ee5..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-21-12-12-35.bpo-43643.GWnmcF.rst +++ /dev/null @@ -1 +0,0 @@ -Declare readers.MultiplexedPath.name as a property per the spec. diff --git a/Misc/NEWS.d/next/Library/2021-05-21-21-23-43.bpo-44210.5afQ3K.rst b/Misc/NEWS.d/next/Library/2021-05-21-21-23-43.bpo-44210.5afQ3K.rst deleted file mode 100644 index e5a14a1a265f1d..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-21-21-23-43.bpo-44210.5afQ3K.rst +++ /dev/null @@ -1 +0,0 @@ -Make importlib.metadata._meta.PackageMetadata public. diff --git a/Misc/NEWS.d/next/Library/2021-05-25-23-26-38.bpo-43216.xTUyyX.rst b/Misc/NEWS.d/next/Library/2021-05-25-23-26-38.bpo-43216.xTUyyX.rst deleted file mode 100644 index 845ef95d1ad296..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-25-23-26-38.bpo-43216.xTUyyX.rst +++ /dev/null @@ -1,6 +0,0 @@ -Remove the :func:`@asyncio.coroutine ` :term:`decorator` -enabling legacy generator-based coroutines to be compatible with async/await -code; remove :class:`asyncio.coroutines.CoroWrapper` used for wrapping -legacy coroutine objects in the debug mode. The decorator has been deprecated -since Python 3.8 and the removal was initially scheduled for Python 3.10. -Patch by Illia Volochii. diff --git a/Misc/NEWS.d/next/Library/2021-05-26-13-15-51.bpo-44241.TBqej8.rst b/Misc/NEWS.d/next/Library/2021-05-26-13-15-51.bpo-44241.TBqej8.rst deleted file mode 100644 index c160cf70abb528..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-26-13-15-51.bpo-44241.TBqej8.rst +++ /dev/null @@ -1,2 +0,0 @@ -Incorporate minor tweaks from importlib_metadata 4.1: SimplePath protocol, -support for Metadata 2.2. diff --git a/Misc/NEWS.d/next/Library/2021-05-26-13-34-37.bpo-33693.3okzdo.rst b/Misc/NEWS.d/next/Library/2021-05-26-13-34-37.bpo-33693.3okzdo.rst deleted file mode 100644 index 2a568a4f469f8d..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-26-13-34-37.bpo-33693.3okzdo.rst +++ /dev/null @@ -1 +0,0 @@ -Importlib.metadata now prefers f-strings to .format. diff --git a/Misc/NEWS.d/next/Library/2021-05-26-14-50-06.bpo-38693.NkMacJ.rst b/Misc/NEWS.d/next/Library/2021-05-26-14-50-06.bpo-38693.NkMacJ.rst deleted file mode 100644 index 10d014b5da562b..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-26-14-50-06.bpo-38693.NkMacJ.rst +++ /dev/null @@ -1 +0,0 @@ -Prefer f-strings to ``.format`` in importlib.resources. diff --git a/Misc/NEWS.d/next/Library/2021-05-26-22-04-40.bpo-44235.qFBYpp.rst b/Misc/NEWS.d/next/Library/2021-05-26-22-04-40.bpo-44235.qFBYpp.rst deleted file mode 100644 index 41af18175d95bb..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-26-22-04-40.bpo-44235.qFBYpp.rst +++ /dev/null @@ -1 +0,0 @@ -Remove deprecated functions in the :mod:`gettext`. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2021-05-28-09-43-33.bpo-44258.nh5F7R.rst b/Misc/NEWS.d/next/Library/2021-05-28-09-43-33.bpo-44258.nh5F7R.rst deleted file mode 100644 index b9636899700f6e..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-28-09-43-33.bpo-44258.nh5F7R.rst +++ /dev/null @@ -1 +0,0 @@ -Support PEP 515 for Fraction's initialization from string. diff --git a/Misc/NEWS.d/next/Library/2021-05-29-01-05-43.bpo-44254.f06xDm.rst b/Misc/NEWS.d/next/Library/2021-05-29-01-05-43.bpo-44254.f06xDm.rst deleted file mode 100644 index 7438d5ce044b87..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-29-01-05-43.bpo-44254.f06xDm.rst +++ /dev/null @@ -1,2 +0,0 @@ -On Mac, give turtledemo button text a color that works on both light -or dark background. Programmers cannot control the latter. diff --git a/Misc/NEWS.d/next/Library/2021-05-30-13-32-09.bpo-44260.ROEbVd.rst b/Misc/NEWS.d/next/Library/2021-05-30-13-32-09.bpo-44260.ROEbVd.rst deleted file mode 100644 index a63af627e6fbf9..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-30-13-32-09.bpo-44260.ROEbVd.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :class:`random.Random` constructor no longer reads system entropy -without need. diff --git a/Misc/NEWS.d/next/Library/2021-05-31-04-51-02.bpo-43858.r7LOu6.rst b/Misc/NEWS.d/next/Library/2021-05-31-04-51-02.bpo-43858.r7LOu6.rst deleted file mode 100644 index d864e1b4e51e3d..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-31-04-51-02.bpo-43858.r7LOu6.rst +++ /dev/null @@ -1 +0,0 @@ -Added a function that returns a copy of a dict of logging levels: :func:`logging.getLevelNamesMapping` diff --git a/Misc/NEWS.d/next/Library/2021-05-31-11-28-03.bpo-44246.nhmt-v.rst b/Misc/NEWS.d/next/Library/2021-05-31-11-28-03.bpo-44246.nhmt-v.rst deleted file mode 100644 index 727d9fd0a19d8a..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-31-11-28-03.bpo-44246.nhmt-v.rst +++ /dev/null @@ -1,3 +0,0 @@ -In importlib.metadata.entry_points, de-duplication of distributions no -longer requires loading the full metadata for PathDistribution objects, -improving entry point loading performance by ~10x. diff --git a/Misc/NEWS.d/next/Library/2021-05-31-11-34-56.bpo-44246.yHAkF0.rst b/Misc/NEWS.d/next/Library/2021-05-31-11-34-56.bpo-44246.yHAkF0.rst deleted file mode 100644 index b93f8b02dc4760..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-31-11-34-56.bpo-44246.yHAkF0.rst +++ /dev/null @@ -1,7 +0,0 @@ -In ``importlib.metadata``, restore compatibility in the result from -``Distribution.entry_points`` (``EntryPoints``) to honor expectations in -older implementations and issuing deprecation warnings for these cases: A. ``EntryPoints`` objects are once again mutable, allowing for ``sort()`` -and other list-based mutation operations. Avoid deprecation warnings by -casting to a mutable sequence (e.g. ``list(dist.entry_points).sort()``). B. ``EntryPoints`` results once again allow for access by index. To avoid -deprecation warnings, cast the result to a Sequence first (e.g. -``tuple(dist.entry_points)[0]``). diff --git a/Misc/NEWS.d/next/Library/2021-06-07-10-26-14.bpo-44242.MKeMCQ.rst b/Misc/NEWS.d/next/Library/2021-06-07-10-26-14.bpo-44242.MKeMCQ.rst deleted file mode 100644 index 39740b67365918..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-07-10-26-14.bpo-44242.MKeMCQ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove missing flag check from Enum creation and move into a ``verify`` -decorator. diff --git a/Misc/NEWS.d/next/Library/2021-06-08-17-47-38.bpo-44339.9JwMSc.rst b/Misc/NEWS.d/next/Library/2021-06-08-17-47-38.bpo-44339.9JwMSc.rst deleted file mode 100644 index 10499eb02bb3c9..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-08-17-47-38.bpo-44339.9JwMSc.rst +++ /dev/null @@ -1,3 +0,0 @@ -Change ``math.pow(±0.0, -math.inf)`` to return ``inf`` instead of raising -``ValueError``. This brings the special-case handling of ``math.pow`` into -compliance with the IEEE 754 standard. diff --git a/Misc/NEWS.d/next/Library/2021-06-09-08-32-39.bpo-44357.70Futb.rst b/Misc/NEWS.d/next/Library/2021-06-09-08-32-39.bpo-44357.70Futb.rst deleted file mode 100644 index f169a464f9fe7c..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-09-08-32-39.bpo-44357.70Futb.rst +++ /dev/null @@ -1 +0,0 @@ -Added a function that returns cube root of the given number :func:`math.cbrt` \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-06-09-10-08-32.bpo-35800.3hmkWw.rst b/Misc/NEWS.d/next/Library/2021-06-09-10-08-32.bpo-35800.3hmkWw.rst deleted file mode 100644 index d3bf596b75028f..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-09-10-08-32.bpo-35800.3hmkWw.rst +++ /dev/null @@ -1,2 +0,0 @@ -:class:`smtpd.MailmanProxy` is now removed as it is unusable without an -external module, ``mailman``. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2021-06-10-07-26-12.bpo-44351.rvyf2v.rst b/Misc/NEWS.d/next/Library/2021-06-10-07-26-12.bpo-44351.rvyf2v.rst deleted file mode 100644 index d731a549632b5f..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-10-07-26-12.bpo-44351.rvyf2v.rst +++ /dev/null @@ -1,2 +0,0 @@ -Restore back :func:`parse_makefile` in :mod:`distutils.sysconfig` because it -behaves differently than the similar implementation in :mod:`sysconfig`. diff --git a/Misc/NEWS.d/next/Library/2021-06-10-08-35-38.bpo-44356.6oDFhO.rst b/Misc/NEWS.d/next/Library/2021-06-10-08-35-38.bpo-44356.6oDFhO.rst deleted file mode 100644 index 954a803fe25c18..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-10-08-35-38.bpo-44356.6oDFhO.rst +++ /dev/null @@ -1 +0,0 @@ -[Enum] Allow multiple data-type mixins if they are all the same. diff --git a/Misc/NEWS.d/next/Library/2021-06-10-15-06-47.bpo-44342.qqkGlj.rst b/Misc/NEWS.d/next/Library/2021-06-10-15-06-47.bpo-44342.qqkGlj.rst deleted file mode 100644 index 6db75e3e9bcf11..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-10-15-06-47.bpo-44342.qqkGlj.rst +++ /dev/null @@ -1 +0,0 @@ -[Enum] Change pickling from by-value to by-name. diff --git a/Misc/NEWS.d/next/Library/2021-06-10-20-07-32.bpo-44362.oVOMfd.rst b/Misc/NEWS.d/next/Library/2021-06-10-20-07-32.bpo-44362.oVOMfd.rst deleted file mode 100644 index 0e6aef3c90e6fc..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-10-20-07-32.bpo-44362.oVOMfd.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve :mod:`ssl` module's deprecation messages, error reporting, and -documentation for deprecations. diff --git a/Misc/NEWS.d/next/Library/2021-06-10-21-53-46.bpo-34266.k3fxnm.rst b/Misc/NEWS.d/next/Library/2021-06-10-21-53-46.bpo-34266.k3fxnm.rst deleted file mode 100644 index 22ef84e9626ad6..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-10-21-53-46.bpo-34266.k3fxnm.rst +++ /dev/null @@ -1 +0,0 @@ -Handle exceptions from parsing the arg of :mod:`pdb`'s run/restart command. diff --git a/Misc/NEWS.d/next/Library/2021-06-12-10-08-14.bpo-44395.PcW6Sx.rst b/Misc/NEWS.d/next/Library/2021-06-12-10-08-14.bpo-44395.PcW6Sx.rst deleted file mode 100644 index 6172eec0a9bd3d..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-12-10-08-14.bpo-44395.PcW6Sx.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :meth:`~email.message.MIMEPart.as_string` to pass unixfrom properly. -Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2021-06-12-21-25-35.bpo-27827.TMWh1i.rst b/Misc/NEWS.d/next/Library/2021-06-12-21-25-35.bpo-27827.TMWh1i.rst deleted file mode 100644 index 1b8cc04533ed85..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-12-21-25-35.bpo-27827.TMWh1i.rst +++ /dev/null @@ -1,2 +0,0 @@ -:meth:`pathlib.PureWindowsPath.is_reserved` now identifies a greater range of -reserved filenames, including those with trailing spaces or colons. diff --git a/Misc/NEWS.d/next/Library/2021-06-12-22-58-20.bpo-44389.WTRnoC.rst b/Misc/NEWS.d/next/Library/2021-06-12-22-58-20.bpo-44389.WTRnoC.rst deleted file mode 100644 index e7e3b874899005..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-12-22-58-20.bpo-44389.WTRnoC.rst +++ /dev/null @@ -1 +0,0 @@ -Fix deprecation of :data:`ssl.OP_NO_TLSv1_3` diff --git a/Misc/NEWS.d/next/Library/2021-06-13-00-16-56.bpo-37880.5bTrkw.rst b/Misc/NEWS.d/next/Library/2021-06-13-00-16-56.bpo-37880.5bTrkw.rst deleted file mode 100644 index 42821572aa67da..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-13-00-16-56.bpo-37880.5bTrkw.rst +++ /dev/null @@ -1,3 +0,0 @@ -argparse actions store_const and append_const each receive a default value -of None when the ``const`` kwarg is not provided. Previously, this raised a -:exc:`TypeError`. diff --git a/Misc/NEWS.d/next/Library/2021-06-14-14-19-11.bpo-38291.ee4cSX.rst b/Misc/NEWS.d/next/Library/2021-06-14-14-19-11.bpo-38291.ee4cSX.rst deleted file mode 100644 index 078d78d1778b1f..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-14-14-19-11.bpo-38291.ee4cSX.rst +++ /dev/null @@ -1 +0,0 @@ -Importing typing.io or typing.re now prints a ``DeprecationWarning``. diff --git a/Misc/NEWS.d/next/Library/2021-06-14-23-28-17.bpo-44422.BlWOgv.rst b/Misc/NEWS.d/next/Library/2021-06-14-23-28-17.bpo-44422.BlWOgv.rst deleted file mode 100644 index 09bace01fc7794..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-14-23-28-17.bpo-44422.BlWOgv.rst +++ /dev/null @@ -1,3 +0,0 @@ -The :func:`threading.enumerate` function now uses a reentrant lock to -prevent a hang on reentrant call. -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-06-15-13-51-25.bpo-42972.UnyYo1.rst b/Misc/NEWS.d/next/Library/2021-06-15-13-51-25.bpo-42972.UnyYo1.rst deleted file mode 100644 index fbcc12c9f90a20..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-15-13-51-25.bpo-42972.UnyYo1.rst +++ /dev/null @@ -1,2 +0,0 @@ -The _thread.RLock type now fully implement the GC protocol: add a traverse -function and the :const:`Py_TPFLAGS_HAVE_GC` flag. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-06-16-16-52-14.bpo-44434.SQS4Pg.rst b/Misc/NEWS.d/next/Library/2021-06-16-16-52-14.bpo-44434.SQS4Pg.rst deleted file mode 100644 index 37b5b57ce65693..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-16-16-52-14.bpo-44434.SQS4Pg.rst +++ /dev/null @@ -1,4 +0,0 @@ -_thread.start_new_thread() no longer calls PyThread_exit_thread() explicitly -at the thread exit, the call was redundant. On Linux with the glibc, -pthread_exit() aborts the whole process if dlopen() fails to open -libgcc_s.so file (ex: EMFILE error). Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-06-17-15-01-51.bpo-44439.1S7QhT.rst b/Misc/NEWS.d/next/Library/2021-06-17-15-01-51.bpo-44439.1S7QhT.rst deleted file mode 100644 index 27396683700a83..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-17-15-01-51.bpo-44439.1S7QhT.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix in :meth:`bz2.BZ2File.write` / :meth:`lzma.LZMAFile.write` methods, when -the input data is an object that supports the buffer protocol, the file length -may be wrong. diff --git a/Misc/NEWS.d/next/Library/2021-06-17-22-39-34.bpo-44446.qwdRic.rst b/Misc/NEWS.d/next/Library/2021-06-17-22-39-34.bpo-44446.qwdRic.rst deleted file mode 100644 index 6d9758f42dd04f..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-17-22-39-34.bpo-44446.qwdRic.rst +++ /dev/null @@ -1 +0,0 @@ -Take into account that ``lineno`` might be ``None`` in :class:`traceback.FrameSummary`. diff --git a/Misc/NEWS.d/next/Library/2021-06-19-21-52-27.bpo-44464.U2oa-a.rst b/Misc/NEWS.d/next/Library/2021-06-19-21-52-27.bpo-44464.U2oa-a.rst deleted file mode 100644 index 6b1c10783d569e..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-19-21-52-27.bpo-44464.U2oa-a.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove exception for flake8 in deprecated importlib.metadata interfaces. -Sync with importlib_metadata 4.6. diff --git a/Misc/NEWS.d/next/Library/2021-06-20-07-14-46.bpo-44458.myqCQ0.rst b/Misc/NEWS.d/next/Library/2021-06-20-07-14-46.bpo-44458.myqCQ0.rst deleted file mode 100644 index f15104b75e31c9..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-20-07-14-46.bpo-44458.myqCQ0.rst +++ /dev/null @@ -1 +0,0 @@ -``BUFFER_BLOCK_SIZE`` is now declared static, to avoid linking collisions when bz2, lmza or zlib are statically linked. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-06-20-14-03-18.bpo-41546.lO1jXU.rst b/Misc/NEWS.d/next/Library/2021-06-20-14-03-18.bpo-41546.lO1jXU.rst deleted file mode 100644 index 050da761570d42..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-20-14-03-18.bpo-41546.lO1jXU.rst +++ /dev/null @@ -1 +0,0 @@ -Make :mod:`pprint` (like the builtin ``print``) not attempt to write to ``stdout`` when it is ``None``. diff --git a/Misc/NEWS.d/next/Library/2021-06-20-19-01-11.bpo-44404.McfrYB.rst b/Misc/NEWS.d/next/Library/2021-06-20-19-01-11.bpo-44404.McfrYB.rst deleted file mode 100644 index ff6ca1bfa7242d..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-20-19-01-11.bpo-44404.McfrYB.rst +++ /dev/null @@ -1 +0,0 @@ -:mod:`tkinter`'s ``after()`` method now supports callables without the ``__name__`` attribute. diff --git a/Misc/NEWS.d/next/Library/2021-06-21-10-46-58.bpo-44471.2QjXv_.rst b/Misc/NEWS.d/next/Library/2021-06-21-10-46-58.bpo-44471.2QjXv_.rst deleted file mode 100644 index 0675ef3262a090..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-21-10-46-58.bpo-44471.2QjXv_.rst +++ /dev/null @@ -1,5 +0,0 @@ -A :exc:`TypeError` is now raised instead of an :exc:`AttributeError` in -:meth:`contextlib.ExitStack.enter_context` and -:meth:`contextlib.AsyncExitStack.enter_async_context` for objects which do -not support the :term:`context manager` or :term:`asynchronous context -manager` protocols correspondingly. diff --git a/Misc/NEWS.d/next/Library/2021-06-21-12-43-04.bpo-44466.NSm6mv.rst b/Misc/NEWS.d/next/Library/2021-06-21-12-43-04.bpo-44466.NSm6mv.rst deleted file mode 100644 index 69de3edb5a7f95..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-21-12-43-04.bpo-44466.NSm6mv.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :mod:`faulthandler` module now detects if a fatal error occurs during a -garbage collector collection. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-06-22-08-43-04.bpo-44482.U9GznK.rst b/Misc/NEWS.d/next/Library/2021-06-22-08-43-04.bpo-44482.U9GznK.rst deleted file mode 100644 index d05fe908e3eba3..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-22-08-43-04.bpo-44482.U9GznK.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix very unlikely resource leak in :mod:`glob` in alternate Python -implementations. diff --git a/Misc/NEWS.d/next/Library/2021-06-22-16-45-48.bpo-43977.bamAGF.rst b/Misc/NEWS.d/next/Library/2021-06-22-16-45-48.bpo-43977.bamAGF.rst deleted file mode 100644 index 5f8cb7b7ea7294..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-22-16-45-48.bpo-43977.bamAGF.rst +++ /dev/null @@ -1,3 +0,0 @@ -Set the proper :const:`Py_TPFLAGS_MAPPING` and :const:`Py_TPFLAGS_SEQUENCE` -flags for subclasses created before a parent has been registered as a -:class:`collections.abc.Mapping` or :class:`collections.abc.Sequence`. diff --git a/Misc/NEWS.d/next/Library/2021-06-23-01-33-01.bpo-44491.tiOlr5.rst b/Misc/NEWS.d/next/Library/2021-06-23-01-33-01.bpo-44491.tiOlr5.rst deleted file mode 100644 index ebe54484187ab8..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-23-01-33-01.bpo-44491.tiOlr5.rst +++ /dev/null @@ -1,3 +0,0 @@ -Allow clearing the :mod:`sqlite3` authorizer callback by passing -:const:`None` to :meth:`~sqlite3.Connection.set_authorizer`. Patch by -Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2021-06-23-19-02-00.bpo-44468.-klV5-.rst b/Misc/NEWS.d/next/Library/2021-06-23-19-02-00.bpo-44468.-klV5-.rst deleted file mode 100644 index 78251c7d55068d..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-23-19-02-00.bpo-44468.-klV5-.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`typing.get_type_hints` now finds annotations in classes and base classes -with unexpected ``__module__``. Previously, it skipped those MRO elements. diff --git a/Misc/NEWS.d/next/Library/2021-06-24-19-16-20.bpo-42892.qvRNhI.rst b/Misc/NEWS.d/next/Library/2021-06-24-19-16-20.bpo-42892.qvRNhI.rst deleted file mode 100644 index 3c70b0534ecabf..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-24-19-16-20.bpo-42892.qvRNhI.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed an exception thrown while parsing a malformed multipart email by :class:`email.message.EmailMessage`. diff --git a/Misc/NEWS.d/next/Library/2021-06-26-12-27-14.bpo-44516.BVyX_y.rst b/Misc/NEWS.d/next/Library/2021-06-26-12-27-14.bpo-44516.BVyX_y.rst deleted file mode 100644 index a9822881135ea7..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-26-12-27-14.bpo-44516.BVyX_y.rst +++ /dev/null @@ -1 +0,0 @@ -Update vendored pip to 21.1.3 diff --git a/Misc/NEWS.d/next/Library/2021-06-29-07-27-08.bpo-43625.ZlAxhp.rst b/Misc/NEWS.d/next/Library/2021-06-29-07-27-08.bpo-43625.ZlAxhp.rst deleted file mode 100644 index a21975b948ef9e..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-29-07-27-08.bpo-43625.ZlAxhp.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a bug in the detection of CSV file headers by -:meth:`csv.Sniffer.has_header` and improve documentation of same. diff --git a/Misc/NEWS.d/next/Library/2021-06-29-21-17-17.bpo-44461.acqRnV.rst b/Misc/NEWS.d/next/Library/2021-06-29-21-17-17.bpo-44461.acqRnV.rst deleted file mode 100644 index 02e25e928b9cff..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-29-21-17-17.bpo-44461.acqRnV.rst +++ /dev/null @@ -1 +0,0 @@ -Fix bug with :mod:`pdb`'s handling of import error due to a package which does not have a ``__main__`` module \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-06-30-11-34-35.bpo-44539.nP0Xi4.rst b/Misc/NEWS.d/next/Library/2021-06-30-11-34-35.bpo-44539.nP0Xi4.rst deleted file mode 100644 index f5e831afce8358..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-30-11-34-35.bpo-44539.nP0Xi4.rst +++ /dev/null @@ -1 +0,0 @@ -Added support for recognizing JPEG files without JFIF or Exif markers. diff --git a/Misc/NEWS.d/next/Library/2021-06-30-13-29-49.bpo-34798.t7FCa0.rst b/Misc/NEWS.d/next/Library/2021-06-30-13-29-49.bpo-34798.t7FCa0.rst deleted file mode 100644 index ab9fd8e33799df..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-06-30-13-29-49.bpo-34798.t7FCa0.rst +++ /dev/null @@ -1 +0,0 @@ -Break up paragraph about :class:`pprint.PrettyPrinter` construction parameters to make it easier to read. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-07-02-18-17-56.bpo-44554.aBUmJo.rst b/Misc/NEWS.d/next/Library/2021-07-02-18-17-56.bpo-44554.aBUmJo.rst deleted file mode 100644 index 2c225b80839516..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-02-18-17-56.bpo-44554.aBUmJo.rst +++ /dev/null @@ -1 +0,0 @@ -Refactor argument processing in :func:`pdb.main` to simplify detection of errors in input loading and clarify behavior around module or script invocation. diff --git a/Misc/NEWS.d/next/Library/2021-07-04-11-33-34.bpo-41249.sHdwBE.rst b/Misc/NEWS.d/next/Library/2021-07-04-11-33-34.bpo-41249.sHdwBE.rst deleted file mode 100644 index 06dae4a6e93565..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-04-11-33-34.bpo-41249.sHdwBE.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixes ``TypedDict`` to work with ``typing.get_type_hints()`` and postponed evaluation of -annotations across modules. diff --git a/Misc/NEWS.d/next/Library/2021-07-04-21-16-53.bpo-44558.cm7Slv.rst b/Misc/NEWS.d/next/Library/2021-07-04-21-16-53.bpo-44558.cm7Slv.rst deleted file mode 100644 index 647a70490d1bac..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-04-21-16-53.bpo-44558.cm7Slv.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make the implementation consistency of :func:`~operator.indexOf` between -C and Python versions. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2021-07-05-18-13-25.bpo-44566.o51Bd1.rst b/Misc/NEWS.d/next/Library/2021-07-05-18-13-25.bpo-44566.o51Bd1.rst deleted file mode 100644 index 3b00a1b715feef..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-05-18-13-25.bpo-44566.o51Bd1.rst +++ /dev/null @@ -1 +0,0 @@ -handle StopIteration subclass raised from @contextlib.contextmanager generator \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-07-08-12-22-54.bpo-44569.KZ02v9.rst b/Misc/NEWS.d/next/Library/2021-07-08-12-22-54.bpo-44569.KZ02v9.rst deleted file mode 100644 index 5f693b290dfb83..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-08-12-22-54.bpo-44569.KZ02v9.rst +++ /dev/null @@ -1,3 +0,0 @@ -Added the :func:`StackSummary.format_frame` function in :mod:`traceback`. -This allows users to customize the way individual lines are formatted in -tracebacks without re-implementing logic to handle recursive tracebacks. diff --git a/Misc/NEWS.d/next/Library/2021-07-09-07-14-37.bpo-41928.Q1jMrr.rst b/Misc/NEWS.d/next/Library/2021-07-09-07-14-37.bpo-41928.Q1jMrr.rst deleted file mode 100644 index e6bd758980b003..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-09-07-14-37.bpo-41928.Q1jMrr.rst +++ /dev/null @@ -1,4 +0,0 @@ -Update :func:`shutil.copyfile` to raise :exc:`FileNotFoundError` instead of -confusing :exc:`IsADirectoryError` when a path ending with a -:const:`os.path.sep` does not exist; :func:`shutil.copy` and -:func:`shutil.copy2` are also affected. diff --git a/Misc/NEWS.d/next/Library/2021-07-10-19-55-13.bpo-42799.ad4tq8.rst b/Misc/NEWS.d/next/Library/2021-07-10-19-55-13.bpo-42799.ad4tq8.rst deleted file mode 100644 index 8a25800611a5a6..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-10-19-55-13.bpo-42799.ad4tq8.rst +++ /dev/null @@ -1,4 +0,0 @@ -In :mod:`fnmatch`, the cache size for compiled regex patterns -(:func:`functools.lru_cache`) was bumped up from 256 to 32768, affecting -functions: :func:`fnmatch.fnmatch`, :func:`fnmatch.fnmatchcase`, -:func:`fnmatch.filter`. diff --git a/Misc/NEWS.d/next/Library/2021-07-12-10-32-48.bpo-44594.eEa5zi.rst b/Misc/NEWS.d/next/Library/2021-07-12-10-32-48.bpo-44594.eEa5zi.rst deleted file mode 100644 index a2bfd8ff5b51bc..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-12-10-32-48.bpo-44594.eEa5zi.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix an edge case of :class:`ExitStack` and :class:`AsyncExitStack` exception -chaining. They will now match ``with`` block behavior when ``__context__`` is -explicitly set to ``None`` when the exception is in flight. diff --git a/Misc/NEWS.d/next/Library/2021-07-13-09-01-33.bpo-44608.R3IcM1.rst b/Misc/NEWS.d/next/Library/2021-07-13-09-01-33.bpo-44608.R3IcM1.rst deleted file mode 100644 index e0cf948f3cba68..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-13-09-01-33.bpo-44608.R3IcM1.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix memory leak in :func:`_tkinter._flatten` if it is called with a sequence -or set, but not list or tuple. diff --git a/Misc/NEWS.d/next/Library/2021-07-15-16-51-32.bpo-44648.2o49TB.rst b/Misc/NEWS.d/next/Library/2021-07-15-16-51-32.bpo-44648.2o49TB.rst deleted file mode 100644 index f7171c3c84c5ea..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-15-16-51-32.bpo-44648.2o49TB.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixed wrong error being thrown by :func:`inspect.getsource` when examining a -class in the interactive session. Instead of :exc:`TypeError`, it should be -:exc:`OSError` with appropriate error message. diff --git a/Misc/NEWS.d/next/Library/2021-07-16-08-57-27.bpo-44638.EwYKne.rst b/Misc/NEWS.d/next/Library/2021-07-16-08-57-27.bpo-44638.EwYKne.rst deleted file mode 100644 index eeaa91c16c4cfc..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-16-08-57-27.bpo-44638.EwYKne.rst +++ /dev/null @@ -1 +0,0 @@ -Add a reference to the zipp project and hint as to how to use it. diff --git a/Misc/NEWS.d/next/Library/2021-07-16-13-40-31.bpo-40897.aveAre.rst b/Misc/NEWS.d/next/Library/2021-07-16-13-40-31.bpo-40897.aveAre.rst deleted file mode 100644 index 04f1465f0ac67f..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-16-13-40-31.bpo-40897.aveAre.rst +++ /dev/null @@ -1,2 +0,0 @@ -Give priority to using the current class constructor in -:func:`inspect.signature`. Patch by Weipeng Hong. diff --git a/Misc/NEWS.d/next/Library/2021-07-19-14-04-42.bpo-44524.Nbf2JC.rst b/Misc/NEWS.d/next/Library/2021-07-19-14-04-42.bpo-44524.Nbf2JC.rst deleted file mode 100644 index 0acdc7dff029f0..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-19-14-04-42.bpo-44524.Nbf2JC.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add missing ``__name__`` and ``__qualname__`` attributes to ``typing`` module -classes. Patch provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Library/2021-07-19-18-45-00.bpo-44678.YMEAu0.rst b/Misc/NEWS.d/next/Library/2021-07-19-18-45-00.bpo-44678.YMEAu0.rst deleted file mode 100644 index 991b1579b2e2b6..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-19-18-45-00.bpo-44678.YMEAu0.rst +++ /dev/null @@ -1 +0,0 @@ -Added a separate error message for discontinuous padding in *binascii.a2b_base64* strict mode. diff --git a/Misc/NEWS.d/next/Library/2021-07-19-22-43-15.bpo-44353.HF81_Q.rst b/Misc/NEWS.d/next/Library/2021-07-19-22-43-15.bpo-44353.HF81_Q.rst deleted file mode 100644 index 8a1e0f77b31772..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-19-22-43-15.bpo-44353.HF81_Q.rst +++ /dev/null @@ -1,2 +0,0 @@ -Refactor ``typing.NewType`` from function into callable class. Patch -provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Library/2021-07-20-00-11-47.bpo-44682.3m2qVV.rst b/Misc/NEWS.d/next/Library/2021-07-20-00-11-47.bpo-44682.3m2qVV.rst deleted file mode 100644 index 308053a62c389f..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-20-00-11-47.bpo-44682.3m2qVV.rst +++ /dev/null @@ -1,2 +0,0 @@ -Change the :mod:`pdb` *commands* directive to disallow setting commands -for an invalid breakpoint and to display an appropriate error. diff --git a/Misc/NEWS.d/next/Library/2021-07-20-18-34-16.bpo-44353.ATuYq4.rst b/Misc/NEWS.d/next/Library/2021-07-20-18-34-16.bpo-44353.ATuYq4.rst deleted file mode 100644 index 7332770ac487e7..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-20-18-34-16.bpo-44353.ATuYq4.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make ``NewType.__call__`` faster by implementing it in C. -Patch provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Library/2021-07-20-19-35-49.bpo-44686.ucCGhu.rst b/Misc/NEWS.d/next/Library/2021-07-20-19-35-49.bpo-44686.ucCGhu.rst deleted file mode 100644 index d9c78020e4a9ba..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-20-19-35-49.bpo-44686.ucCGhu.rst +++ /dev/null @@ -1 +0,0 @@ -Replace ``unittest.mock._importer`` with ``pkgutil.resolve_name``. diff --git a/Misc/NEWS.d/next/Library/2021-07-20-21-51-35.bpo-42854.ThuDMI.rst b/Misc/NEWS.d/next/Library/2021-07-20-21-51-35.bpo-42854.ThuDMI.rst deleted file mode 100644 index 33cbb63a5e14b8..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-20-21-51-35.bpo-42854.ThuDMI.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixed a bug in the :mod:`_ssl` module that was throwing :exc:`OverflowError` -when using :meth:`_ssl._SSLSocket.write` and :meth:`_ssl._SSLSocket.read` -for a big value of the ``len`` parameter. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Library/2021-07-20-22-03-24.bpo-44690.tV7Zjg.rst b/Misc/NEWS.d/next/Library/2021-07-20-22-03-24.bpo-44690.tV7Zjg.rst deleted file mode 100644 index 1d1184805471d4..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-20-22-03-24.bpo-44690.tV7Zjg.rst +++ /dev/null @@ -1 +0,0 @@ -Adopt *binacii.a2b_base64*'s strict mode in *base64.b64decode*. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-07-20-23-28-26.bpo-44688.buFgz3.rst b/Misc/NEWS.d/next/Library/2021-07-20-23-28-26.bpo-44688.buFgz3.rst deleted file mode 100644 index 15f6a521f2d4f9..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-20-23-28-26.bpo-44688.buFgz3.rst +++ /dev/null @@ -1,2 +0,0 @@ -:meth:`sqlite3.Connection.create_collation` now accepts non-ASCII collation -names. Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2021-07-21-10-43-22.bpo-44666.CEThkv.rst b/Misc/NEWS.d/next/Library/2021-07-21-10-43-22.bpo-44666.CEThkv.rst deleted file mode 100644 index ab2ef22d0c4558..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-21-10-43-22.bpo-44666.CEThkv.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed issue in :func:`compileall.compile_file` when ``sys.stdout`` is redirected. -Patch by Stefan Hölzl. diff --git a/Misc/NEWS.d/next/Library/2021-07-21-23-16-30.bpo-44704.iqHLxQ.rst b/Misc/NEWS.d/next/Library/2021-07-21-23-16-30.bpo-44704.iqHLxQ.rst deleted file mode 100644 index 586661876dedba..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-21-23-16-30.bpo-44704.iqHLxQ.rst +++ /dev/null @@ -1 +0,0 @@ -The implementation of ``collections.abc.Set._hash()`` now matches that of ``frozenset.__hash__()``. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-07-24-02-17-59.bpo-44720.shU5Qm.rst b/Misc/NEWS.d/next/Library/2021-07-24-02-17-59.bpo-44720.shU5Qm.rst deleted file mode 100644 index 83694f3988ae9a..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-24-02-17-59.bpo-44720.shU5Qm.rst +++ /dev/null @@ -1 +0,0 @@ -``weakref.proxy`` objects referencing non-iterators now raise ``TypeError`` rather than dereferencing the null ``tp_iternext`` slot and crashing. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-07-25-08-17-55.bpo-42378.WIhUZK.rst b/Misc/NEWS.d/next/Library/2021-07-25-08-17-55.bpo-42378.WIhUZK.rst deleted file mode 100644 index 90c3961dc87d8b..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-25-08-17-55.bpo-42378.WIhUZK.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fixes the issue with log file being overwritten when -:class:`logging.FileHandler` is used in :mod:`atexit` with *filemode* set to -``'w'``. Note this will cause the message in *atexit* not being logged if -the log stream is already closed due to shutdown of logging. diff --git a/Misc/NEWS.d/next/Library/2021-07-27-12-06-19.bpo-44747.epUzZz.rst b/Misc/NEWS.d/next/Library/2021-07-27-12-06-19.bpo-44747.epUzZz.rst deleted file mode 100644 index e63d77f76de92d..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-27-12-06-19.bpo-44747.epUzZz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Refactor usage of ``sys._getframe`` in ``typing`` module. Patch provided by -Yurii Karabas. diff --git a/Misc/NEWS.d/next/Library/2021-07-27-22-11-29.bpo-44752._bvbrZ.rst b/Misc/NEWS.d/next/Library/2021-07-27-22-11-29.bpo-44752._bvbrZ.rst deleted file mode 100644 index 0d8a2cd6a5e0db..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-27-22-11-29.bpo-44752._bvbrZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`rcompleter` does not call :func:`getattr` on :class:`property` objects -to avoid the side-effect of evaluating the corresponding method. diff --git a/Misc/NEWS.d/next/Library/2021-07-28-22-53-18.bpo-44771.BvLdnU.rst b/Misc/NEWS.d/next/Library/2021-07-28-22-53-18.bpo-44771.BvLdnU.rst deleted file mode 100644 index 0d47a55a7d74f9..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-28-22-53-18.bpo-44771.BvLdnU.rst +++ /dev/null @@ -1,5 +0,0 @@ -Added ``importlib.simple`` module implementing adapters from a low-level -resources reader interface to a ``TraversableResources`` interface. Legacy -API (``path``, ``contents``, ...) is now supported entirely by the -``.files()`` API with a compatibility shim supplied for resource loaders -without that functionality. Feature parity with ``importlib_resources`` 5.2. diff --git a/Misc/NEWS.d/next/Library/2021-07-30-23-27-30.bpo-44667.tu0Xrv.rst b/Misc/NEWS.d/next/Library/2021-07-30-23-27-30.bpo-44667.tu0Xrv.rst deleted file mode 100644 index 5b7e20e0afdf5e..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-30-23-27-30.bpo-44667.tu0Xrv.rst +++ /dev/null @@ -1,4 +0,0 @@ -The :func:`tokenize.tokenize` doesn't incorrectly generate a ``NEWLINE`` -token if the source doesn't end with a new line character but the last line -is a comment, as the function is already generating a ``NL`` token. Patch by -Pablo Galindo diff --git a/Misc/NEWS.d/next/Library/2021-07-31-08-45-31.bpo-44784.fIMIDS.rst b/Misc/NEWS.d/next/Library/2021-07-31-08-45-31.bpo-44784.fIMIDS.rst deleted file mode 100644 index 6ad10ef3f59805..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-31-08-45-31.bpo-44784.fIMIDS.rst +++ /dev/null @@ -1,2 +0,0 @@ -In importlib.metadata tests, override warnings behavior under expected -DeprecationWarnings (importlib_metadata 4.6.3). diff --git a/Misc/NEWS.d/next/Library/2021-07-31-20-28-20.bpo-44793.woaQSg.rst b/Misc/NEWS.d/next/Library/2021-07-31-20-28-20.bpo-44793.woaQSg.rst deleted file mode 100644 index 1d94d67615a479..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-31-20-28-20.bpo-44793.woaQSg.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix checking the number of arguments when subscribe a generic type with -``ParamSpec`` parameter. diff --git a/Misc/NEWS.d/next/Library/2021-08-01-19-49-09.bpo-27275.QsvE0k.rst b/Misc/NEWS.d/next/Library/2021-08-01-19-49-09.bpo-27275.QsvE0k.rst deleted file mode 100644 index 1f5afaf4d108e4..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-01-19-49-09.bpo-27275.QsvE0k.rst +++ /dev/null @@ -1,3 +0,0 @@ -:meth:`collections.OrderedDict.popitem` and :meth:`collections.OrderedDict.pop` -no longer call ``__getitem__`` and ``__delitem__`` methods of the OrderedDict -subclasses. diff --git a/Misc/NEWS.d/next/Library/2021-08-02-14-37-32.bpo-44806.wOW_Qn.rst b/Misc/NEWS.d/next/Library/2021-08-02-14-37-32.bpo-44806.wOW_Qn.rst deleted file mode 100644 index 6d818c3fc57982..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-02-14-37-32.bpo-44806.wOW_Qn.rst +++ /dev/null @@ -1,2 +0,0 @@ -Non-protocol subclasses of :class:`typing.Protocol` ignore now the -``__init__`` method inherited from protocol base classes. diff --git a/Misc/NEWS.d/next/Library/2021-08-03-20-37-45.bpo-44801.i49Aug.rst b/Misc/NEWS.d/next/Library/2021-08-03-20-37-45.bpo-44801.i49Aug.rst deleted file mode 100644 index 05e372a5fabb03..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-03-20-37-45.bpo-44801.i49Aug.rst +++ /dev/null @@ -1,3 +0,0 @@ -Ensure that the :class:`~typing.ParamSpec` variable in Callable -can only be substituted with a parameters expression (a list of types, -an ellipsis, ParamSpec or Concatenate). diff --git a/Misc/NEWS.d/next/Library/2021-08-04-12-29-00.bpo-44822.zePNXA.rst b/Misc/NEWS.d/next/Library/2021-08-04-12-29-00.bpo-44822.zePNXA.rst deleted file mode 100644 index d078142886d2e0..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-04-12-29-00.bpo-44822.zePNXA.rst +++ /dev/null @@ -1,3 +0,0 @@ -:mod:`sqlite3` user-defined functions and aggregators returning -:class:`strings ` with embedded NUL characters are no longer -truncated. Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2021-08-05-14-59-39.bpo-44839.MURNL9.rst b/Misc/NEWS.d/next/Library/2021-08-05-14-59-39.bpo-44839.MURNL9.rst deleted file mode 100644 index 62ad62c5d48d54..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-05-14-59-39.bpo-44839.MURNL9.rst +++ /dev/null @@ -1,4 +0,0 @@ -:class:`MemoryError` raised in user-defined functions will now produce a -``MemoryError`` in :mod:`sqlite3`. :class:`OverflowError` will now be converted -to :class:`~sqlite3.DataError`. Previously -:class:`~sqlite3.OperationalError` was produced in these cases. diff --git a/Misc/NEWS.d/next/Library/2021-08-05-18-20-17.bpo-44524.9T1tfe.rst b/Misc/NEWS.d/next/Library/2021-08-05-18-20-17.bpo-44524.9T1tfe.rst deleted file mode 100644 index 0c9e82050883d5..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-05-18-20-17.bpo-44524.9T1tfe.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed an issue wherein the ``__name__`` and ``__qualname__`` attributes of -subscribed specialforms could be ``None``. diff --git a/Misc/NEWS.d/next/Library/2021-08-06-09-43-50.bpo-44605.q4YSBZ.rst b/Misc/NEWS.d/next/Library/2021-08-06-09-43-50.bpo-44605.q4YSBZ.rst deleted file mode 100644 index 93783923e15b3d..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-06-09-43-50.bpo-44605.q4YSBZ.rst +++ /dev/null @@ -1 +0,0 @@ -The @functools.total_ordering() decorator now works with metaclasses. diff --git a/Misc/NEWS.d/next/Library/2021-08-06-13-00-28.bpo-44849.O78F_f.rst b/Misc/NEWS.d/next/Library/2021-08-06-13-00-28.bpo-44849.O78F_f.rst deleted file mode 100644 index b1f225485ddef5..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-06-13-00-28.bpo-44849.O78F_f.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix the :func:`os.set_inheritable` function on FreeBSD 14 for file descriptor -opened with the :data:`~os.O_PATH` flag: ignore the :data:`~errno.EBADF` -error on ``ioctl()``, fallback on the ``fcntl()`` implementation. Patch by -Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-08-06-19-15-52.bpo-44581.oFDBTB.rst b/Misc/NEWS.d/next/Library/2021-08-06-19-15-52.bpo-44581.oFDBTB.rst deleted file mode 100644 index 99f08065b9d2f0..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-06-19-15-52.bpo-44581.oFDBTB.rst +++ /dev/null @@ -1 +0,0 @@ -Upgrade bundled pip to 21.2.3 and setuptools to 57.4.0 diff --git a/Misc/NEWS.d/next/Library/2021-08-07-17-28-56.bpo-44859.CCopjk.rst b/Misc/NEWS.d/next/Library/2021-08-07-17-28-56.bpo-44859.CCopjk.rst deleted file mode 100644 index ec9f774d66b8c4..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-07-17-28-56.bpo-44859.CCopjk.rst +++ /dev/null @@ -1,8 +0,0 @@ -Improve error handling in :mod:`sqlite3` and raise more accurate exceptions. - -* :exc:`MemoryError` is now raised instead of :exc:`sqlite3.Warning` when memory is not enough for encoding a statement to UTF-8 in ``Connection.__call__()`` and ``Cursor.execute()``. -* :exc:`UnicodEncodeError` is now raised instead of :exc:`sqlite3.Warning` when the statement contains surrogate characters in ``Connection.__call__()`` and ``Cursor.execute()``. -* :exc:`TypeError` is now raised instead of :exc:`ValueError` for non-string script argument in ``Cursor.executescript()``. -* :exc:`ValueError` is now raised for script containing the null character instead of truncating it in ``Cursor.executescript()``. -* Correctly handle exceptions raised when getting boolean value of the result of the progress handler. -* Add many tests covering different corner cases. diff --git a/Misc/NEWS.d/next/Library/2021-08-07-22-51-32.bpo-44860.PTvRrU.rst b/Misc/NEWS.d/next/Library/2021-08-07-22-51-32.bpo-44860.PTvRrU.rst deleted file mode 100644 index 70e0be0dab40c3..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-07-22-51-32.bpo-44860.PTvRrU.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix the ``posix_user`` scheme in :mod:`sysconfig` to not depend on -:data:`sys.platlibdir`. diff --git a/Misc/NEWS.d/next/Library/2021-08-09-13-17-10.bpo-38956.owWLNv.rst b/Misc/NEWS.d/next/Library/2021-08-09-13-17-10.bpo-38956.owWLNv.rst deleted file mode 100644 index 3f57c0ea5d5a38..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-09-13-17-10.bpo-38956.owWLNv.rst +++ /dev/null @@ -1 +0,0 @@ -:class:`argparse.BooleanOptionalAction`'s default value is no longer printed twice when used with :class:`argparse.ArgumentDefaultsHelpFormatter`. diff --git a/Misc/NEWS.d/next/Library/2021-08-10-16-57-10.bpo-44524.dk9QX4.rst b/Misc/NEWS.d/next/Library/2021-08-10-16-57-10.bpo-44524.dk9QX4.rst deleted file mode 100644 index bc3659fca52098..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-10-16-57-10.bpo-44524.dk9QX4.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make exception message more useful when subclass from typing special form -alias. Patch provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Library/2021-08-12-16-22-16.bpo-41322.utscTd.rst b/Misc/NEWS.d/next/Library/2021-08-12-16-22-16.bpo-41322.utscTd.rst deleted file mode 100644 index e16efd2c7bd556..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-12-16-22-16.bpo-41322.utscTd.rst +++ /dev/null @@ -1,3 +0,0 @@ -Added ``DeprecationWarning`` for tests and async tests that return a -value!=None (as this may indicate an improperly written test, for example a -test written as a generator function). diff --git a/Misc/NEWS.d/next/Library/2021-08-14-00-55-16.bpo-44911.uk3hYk.rst b/Misc/NEWS.d/next/Library/2021-08-14-00-55-16.bpo-44911.uk3hYk.rst deleted file mode 100644 index f8aed69a40a3be..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-14-00-55-16.bpo-44911.uk3hYk.rst +++ /dev/null @@ -1 +0,0 @@ -:class:`~unittest.IsolatedAsyncioTestCase` will no longer throw an exception while cancelling leaked tasks. Patch by Bar Harel. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-08-17-16-01-44.bpo-44935.roUl0G.rst b/Misc/NEWS.d/next/Library/2021-08-17-16-01-44.bpo-44935.roUl0G.rst deleted file mode 100644 index 3d41c3be1403dc..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-17-16-01-44.bpo-44935.roUl0G.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`subprocess` on Solaris now also uses :func:`os.posix_spawn()` for -better performance. diff --git a/Misc/NEWS.d/next/Library/2021-08-18-10-36-14.bpo-39039.A63LYh.rst b/Misc/NEWS.d/next/Library/2021-08-18-10-36-14.bpo-39039.A63LYh.rst deleted file mode 100644 index 7250055c2a4a9e..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-18-10-36-14.bpo-39039.A63LYh.rst +++ /dev/null @@ -1,2 +0,0 @@ -tarfile.open raises :exc:`~tarfile.ReadError` when a zlib error occurs -during file extraction. diff --git a/Misc/NEWS.d/next/Library/2021-08-19-15-03-54.bpo-44955.1mxFQS.rst b/Misc/NEWS.d/next/Library/2021-08-19-15-03-54.bpo-44955.1mxFQS.rst deleted file mode 100644 index 57d1da533cde0d..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-19-15-03-54.bpo-44955.1mxFQS.rst +++ /dev/null @@ -1,5 +0,0 @@ -Method :meth:`~unittest.TestResult.stopTestRun` is now always called in pair -with method :meth:`~unittest.TestResult.startTestRun` for -:class:`~unittest.TestResult` objects implicitly created in -:meth:`~unittest.TestCase.run`. Previously it was not called for test -methods and classes decorated with a skipping decorator. diff --git a/Misc/NEWS.d/next/Library/2021-08-19-23-49-10.bpo-42255.ofe3ms.rst b/Misc/NEWS.d/next/Library/2021-08-19-23-49-10.bpo-42255.ofe3ms.rst deleted file mode 100644 index 84a02c4c3fb2b4..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-19-23-49-10.bpo-42255.ofe3ms.rst +++ /dev/null @@ -1,3 +0,0 @@ -:class:`webbrowser.MacOSX` is deprecated and will be removed in Python 3.13. -It is untested and undocumented and also not used by webbrowser itself. -Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2021-08-22-13-25-17.bpo-44019.BN8HDy.rst b/Misc/NEWS.d/next/Library/2021-08-22-13-25-17.bpo-44019.BN8HDy.rst deleted file mode 100644 index 37556d76905d73..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-22-13-25-17.bpo-44019.BN8HDy.rst +++ /dev/null @@ -1,2 +0,0 @@ -A new function ``operator.call`` has been added, such that -``operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)``. diff --git a/Misc/NEWS.d/next/Library/2021-08-23-21-39-59.bpo-37596.ojRcwB.rst b/Misc/NEWS.d/next/Library/2021-08-23-21-39-59.bpo-37596.ojRcwB.rst deleted file mode 100644 index 81fdfeb6294569..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-23-21-39-59.bpo-37596.ojRcwB.rst +++ /dev/null @@ -1,2 +0,0 @@ -Ensure that :class:`set` and :class:`frozenset` objects are always -:mod:`marshalled ` reproducibly. diff --git a/Misc/NEWS.d/next/Library/2021-08-25-10-28-49.bpo-43613.WkYmI0.rst b/Misc/NEWS.d/next/Library/2021-08-25-10-28-49.bpo-43613.WkYmI0.rst deleted file mode 100644 index d6af35c12b3c70..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-25-10-28-49.bpo-43613.WkYmI0.rst +++ /dev/null @@ -1,3 +0,0 @@ -Improve the speed of :func:`gzip.compress` and :func:`gzip.decompress` by -compressing and decompressing at once in memory instead of in a streamed -fashion. diff --git a/Misc/NEWS.d/next/Library/2021-08-25-20-18-31.bpo-39218.BlO6jW.rst b/Misc/NEWS.d/next/Library/2021-08-25-20-18-31.bpo-39218.BlO6jW.rst deleted file mode 100644 index f45dbfe463c87e..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-25-20-18-31.bpo-39218.BlO6jW.rst +++ /dev/null @@ -1 +0,0 @@ -Improve accuracy of variance calculations by using ``x*x`` instead of ``x**2``. diff --git a/Misc/NEWS.d/next/Library/2021-08-26-09-54-14.bpo-45010.Cn23bQ.rst b/Misc/NEWS.d/next/Library/2021-08-26-09-54-14.bpo-45010.Cn23bQ.rst deleted file mode 100644 index bdf1bfe1ffe06e..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-26-09-54-14.bpo-45010.Cn23bQ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove support of special method ``__div__`` in :mod:`unittest.mock`. It is -not used in Python 3. diff --git a/Misc/NEWS.d/next/Library/2021-08-26-16-25-48.bpo-45001.tn_dKp.rst b/Misc/NEWS.d/next/Library/2021-08-26-16-25-48.bpo-45001.tn_dKp.rst deleted file mode 100644 index 55cc409d0da30f..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-26-16-25-48.bpo-45001.tn_dKp.rst +++ /dev/null @@ -1,2 +0,0 @@ -Made email date parsing more robust against malformed input, namely a -whitespace-only ``Date:`` header. Patch by Wouter Bolsterlee. diff --git a/Misc/NEWS.d/next/Library/2021-08-27-19-01-23.bpo-45030.tAmBbY.rst b/Misc/NEWS.d/next/Library/2021-08-27-19-01-23.bpo-45030.tAmBbY.rst deleted file mode 100644 index dec8c88b155888..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-27-19-01-23.bpo-45030.tAmBbY.rst +++ /dev/null @@ -1 +0,0 @@ -Fix integer overflow in pickling and copying the range iterator. diff --git a/Misc/NEWS.d/next/Library/2021-08-27-23-40-51.bpo-43913.Uo1Gt5.rst b/Misc/NEWS.d/next/Library/2021-08-27-23-40-51.bpo-43913.Uo1Gt5.rst deleted file mode 100644 index cf3d5ee0e456f1..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-27-23-40-51.bpo-43913.Uo1Gt5.rst +++ /dev/null @@ -1,8 +0,0 @@ -Fix bugs in cleaning up classes and modules in :mod:`unittest`: - -* Functions registered with :func:`~unittest.addModuleCleanup` were not called unless the user defines ``tearDownModule()`` in their test module. -* Functions registered with :meth:`~unittest.TestCase.addClassCleanup` were not called if ``tearDownClass`` is set to ``None``. -* Buffering in :class:`~unittest.TestResult` did not work with functions registered with ``addClassCleanup()`` and ``addModuleCleanup()``. -* Errors in functions registered with ``addClassCleanup()`` and ``addModuleCleanup()`` were not handled correctly in buffered and debug modes. -* Errors in ``setUpModule()`` and functions registered with ``addModuleCleanup()`` were reported in wrong order. -* And several lesser bugs. diff --git a/Misc/NEWS.d/next/Library/2021-08-28-13-00-12.bpo-45021.rReeaj.rst b/Misc/NEWS.d/next/Library/2021-08-28-13-00-12.bpo-45021.rReeaj.rst deleted file mode 100644 index 54fd9109a9ae5f..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-28-13-00-12.bpo-45021.rReeaj.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a potential deadlock at shutdown of forked children when using :mod:`concurrent.futures` module \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-08-29-14-49-22.bpo-41620.WJ6PFL.rst b/Misc/NEWS.d/next/Library/2021-08-29-14-49-22.bpo-41620.WJ6PFL.rst deleted file mode 100644 index 7674d4c9532a27..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-29-14-49-22.bpo-41620.WJ6PFL.rst +++ /dev/null @@ -1,3 +0,0 @@ -:meth:`~unittest.TestCase.run` now always return a -:class:`~unittest.TestResult` instance. Previously it returned ``None`` if -the test class or method was decorated with a skipping decorator. diff --git a/Misc/NEWS.d/next/Library/2021-08-30-13-55-09.bpo-31299.9QzjZs.rst b/Misc/NEWS.d/next/Library/2021-08-30-13-55-09.bpo-31299.9QzjZs.rst deleted file mode 100644 index 1ffa0b15172ee7..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-30-13-55-09.bpo-31299.9QzjZs.rst +++ /dev/null @@ -1 +0,0 @@ -Add option to completely drop frames from a traceback by returning ``None`` from a :meth:`~traceback.StackSummary.format_frame` override. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-09-01-15-27-00.bpo-45075.9xUpvt.rst b/Misc/NEWS.d/next/Library/2021-09-01-15-27-00.bpo-45075.9xUpvt.rst deleted file mode 100644 index 369b4506066e5b..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-01-15-27-00.bpo-45075.9xUpvt.rst +++ /dev/null @@ -1,5 +0,0 @@ -Rename :meth:`traceback.StackSummary.format_frame` to -:meth:`traceback.StackSummary.format_frame_summary`. This method was added -for 3.11 so it was not released yet. - -Updated code and docs to better distinguish frame and FrameSummary. diff --git a/Misc/NEWS.d/next/Library/2021-09-02-00-18-32.bpo-40360.9nmMtB.rst b/Misc/NEWS.d/next/Library/2021-09-02-00-18-32.bpo-40360.9nmMtB.rst deleted file mode 100644 index 4e9422dc06d7f4..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-02-00-18-32.bpo-40360.9nmMtB.rst +++ /dev/null @@ -1,3 +0,0 @@ -The :mod:`lib2to3` package is now deprecated and may not be able to parse -Python 3.10 or newer. See the :pep:`617` (New PEG parser for CPython). Patch -by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-09-02-00-47-14.bpo-45085.mMnaDv.rst b/Misc/NEWS.d/next/Library/2021-09-02-00-47-14.bpo-45085.mMnaDv.rst deleted file mode 100644 index 22eada24f0f5a2..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-02-00-47-14.bpo-45085.mMnaDv.rst +++ /dev/null @@ -1,10 +0,0 @@ -The ``binhex`` module, deprecated in Python 3.9, is now removed. The -following :mod:`binascii` functions, deprecated in Python 3.9, are now also -removed: - -* ``a2b_hqx()``, ``b2a_hqx()``; -* ``rlecode_hqx()``, ``rledecode_hqx()``. - -The :func:`binascii.crc_hqx` function remains available. - -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-09-02-12-42-25.bpo-45081.tOjJ1k.rst b/Misc/NEWS.d/next/Library/2021-09-02-12-42-25.bpo-45081.tOjJ1k.rst deleted file mode 100644 index 86d7182003bb93..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-02-12-42-25.bpo-45081.tOjJ1k.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix issue when dataclasses that inherit from ``typing.Protocol`` subclasses -have wrong ``__init__``. Patch provided by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Library/2021-09-05-13-15-08.bpo-25894.zjbi2f.rst b/Misc/NEWS.d/next/Library/2021-09-05-13-15-08.bpo-25894.zjbi2f.rst deleted file mode 100644 index b0a036fae6cfa7..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-05-13-15-08.bpo-25894.zjbi2f.rst +++ /dev/null @@ -1,4 +0,0 @@ -:mod:`unittest` now always reports skipped and failed subtests separately: -separate characters in default mode and separate lines in verbose mode. Also -the test description is now output for errors in test method, class and -module cleanups. diff --git a/Misc/NEWS.d/next/Library/2021-09-05-20-33-25.bpo-45034.62NLD5.rst b/Misc/NEWS.d/next/Library/2021-09-05-20-33-25.bpo-45034.62NLD5.rst deleted file mode 100644 index 8d94821470a2ad..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-05-20-33-25.bpo-45034.62NLD5.rst +++ /dev/null @@ -1,2 +0,0 @@ -Changes how error is formatted for ``struct.pack`` with ``'H'`` and ``'h'`` modes and -too large / small numbers. Now it shows the actual numeric limits, while previously it was showing arithmetic expressions. diff --git a/Misc/NEWS.d/next/Library/2021-09-05-21-37-28.bpo-30856.jj86y0.rst b/Misc/NEWS.d/next/Library/2021-09-05-21-37-28.bpo-30856.jj86y0.rst deleted file mode 100644 index 1ac4eb672d2ec9..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-05-21-37-28.bpo-30856.jj86y0.rst +++ /dev/null @@ -1,6 +0,0 @@ -:class:`unittest.TestResult` methods -:meth:`~unittest.TestResult.addFailure`, -:meth:`~unittest.TestResult.addError`, :meth:`~unittest.TestResult.addSkip` -and :meth:`~unittest.TestResult.addSubTest` are now called immediately after -raising an exception in test or finishing a subtest. Previously they were -called only after finishing the test clean up. diff --git a/Misc/NEWS.d/next/Library/2021-09-07-09-13-27.bpo-45124.Kw5AUs.rst b/Misc/NEWS.d/next/Library/2021-09-07-09-13-27.bpo-45124.Kw5AUs.rst deleted file mode 100644 index 2f6ab411b3deb1..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-07-09-13-27.bpo-45124.Kw5AUs.rst +++ /dev/null @@ -1,5 +0,0 @@ -The ``bdist_msi`` command, deprecated in Python 3.9, is now removed. - -Use ``bdist_wheel`` (wheel packages) instead. - -Patch by Hugo van Kemenade. diff --git a/Misc/NEWS.d/next/Library/2021-09-07-14-27-39.bpo-45129.vXH0gw.rst b/Misc/NEWS.d/next/Library/2021-09-07-14-27-39.bpo-45129.vXH0gw.rst deleted file mode 100644 index 5ba6721923dbdb..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-07-14-27-39.bpo-45129.vXH0gw.rst +++ /dev/null @@ -1,6 +0,0 @@ -Due to significant security concerns, the *reuse_address* parameter of -:meth:`asyncio.loop.create_datagram_endpoint`, disabled in Python 3.9, is -now entirely removed. This is because of the behavior of the socket option -``SO_REUSEADDR`` in UDP. - -Patch by Hugo van Kemenade. diff --git a/Misc/NEWS.d/next/Library/2021-09-07-16-33-51.bpo-45132.WI9zQY.rst b/Misc/NEWS.d/next/Library/2021-09-07-16-33-51.bpo-45132.WI9zQY.rst deleted file mode 100644 index 10f24003dc71fe..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-07-16-33-51.bpo-45132.WI9zQY.rst +++ /dev/null @@ -1,5 +0,0 @@ -Remove :meth:`__getitem__` methods of -:class:`xml.dom.pulldom.DOMEventStream`, :class:`wsgiref.util.FileWrapper` -and :class:`fileinput.FileInput`, deprecated since Python 3.9. - -Patch by Hugo van Kemenade. diff --git a/Misc/NEWS.d/next/Library/2021-09-08-01-19-31.bpo-20499.tSxx8Y.rst b/Misc/NEWS.d/next/Library/2021-09-08-01-19-31.bpo-20499.tSxx8Y.rst deleted file mode 100644 index cbbe61ac4a2697..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-08-01-19-31.bpo-20499.tSxx8Y.rst +++ /dev/null @@ -1 +0,0 @@ -Improve the speed and accuracy of statistics.pvariance(). diff --git a/Misc/NEWS.d/next/Library/2021-09-08-13-19-29.bpo-38371.y1kEfP.rst b/Misc/NEWS.d/next/Library/2021-09-08-13-19-29.bpo-38371.y1kEfP.rst deleted file mode 100644 index 65f35488c6f255..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-08-13-19-29.bpo-38371.y1kEfP.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove the deprecated ``split()`` method of :class:`_tkinter.TkappType`. -Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2021-09-10-13-20-53.bpo-45162.2Jh-lq.rst b/Misc/NEWS.d/next/Library/2021-09-10-13-20-53.bpo-45162.2Jh-lq.rst deleted file mode 100644 index b22269d65b041b..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-10-13-20-53.bpo-45162.2Jh-lq.rst +++ /dev/null @@ -1,6 +0,0 @@ -Remove many old deprecated :mod:`unittest` features: - -* "``fail*``" and "``assert*``" aliases of :class:`~unittest.TestCase` methods. -* Broken from start :class:`~unittest.TestCase` method ``assertDictContainsSubset()``. -* Ignored :meth:` TestLoader.loadTestsFromModule` parameter *use_load_tests*. -* Old alias ``_TextTestResult`` of :class:`~unittest.TextTestResult`. diff --git a/Misc/NEWS.d/next/Library/2021-09-10-21-35-53.bpo-45166.UHipXF.rst b/Misc/NEWS.d/next/Library/2021-09-10-21-35-53.bpo-45166.UHipXF.rst deleted file mode 100644 index b7242d45ea9be8..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-10-21-35-53.bpo-45166.UHipXF.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`typing.get_type_hints` now works with :data:`~typing.Final` wrapped in -:class:`~typing.ForwardRef`. diff --git a/Misc/NEWS.d/next/Library/2021-09-11-10-45-12.bpo-35474.tEY3SD.rst b/Misc/NEWS.d/next/Library/2021-09-11-10-45-12.bpo-35474.tEY3SD.rst deleted file mode 100644 index f4dd3b947a4936..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-11-10-45-12.bpo-35474.tEY3SD.rst +++ /dev/null @@ -1,3 +0,0 @@ -Calling :func:`mimetypes.guess_all_extensions` with ``strict=False`` no -longer affects the result of the following call with ``strict=True``. -Also, mutating the returned list no longer affects the global state. diff --git a/Misc/NEWS.d/next/Library/2021-09-11-14-41-02.bpo-44987.Mt8DiX.rst b/Misc/NEWS.d/next/Library/2021-09-11-14-41-02.bpo-44987.Mt8DiX.rst deleted file mode 100644 index dec50d87c916c0..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-11-14-41-02.bpo-44987.Mt8DiX.rst +++ /dev/null @@ -1,2 +0,0 @@ -Pure ASCII strings are now normalized in constant time by :func:`unicodedata.normalize`. -Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2021-09-11-17-46-20.bpo-45173.UptGAn.rst b/Misc/NEWS.d/next/Library/2021-09-11-17-46-20.bpo-45173.UptGAn.rst deleted file mode 100644 index 0b29ec2364edcf..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-11-17-46-20.bpo-45173.UptGAn.rst +++ /dev/null @@ -1,7 +0,0 @@ -Remove 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. - -Patch by Hugo van Kemenade. diff --git a/Misc/NEWS.d/next/Library/2021-09-11-18-44-40.bpo-21302.QxHRpR.rst b/Misc/NEWS.d/next/Library/2021-09-11-18-44-40.bpo-21302.QxHRpR.rst deleted file mode 100644 index 86f0a5ac4c2a5a..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-11-18-44-40.bpo-21302.QxHRpR.rst +++ /dev/null @@ -1,2 +0,0 @@ -In Unix operating systems, :func:`time.sleep` now uses the ``clock_nanosleep()`` function, -if available, which allows to sleep for an interval specified with nanosecond precision. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-09-13-14-28-49.bpo-45168.Z1mfW4.rst b/Misc/NEWS.d/next/Library/2021-09-13-14-28-49.bpo-45168.Z1mfW4.rst deleted file mode 100644 index 4e12e7d51e2c79..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-13-14-28-49.bpo-45168.Z1mfW4.rst +++ /dev/null @@ -1 +0,0 @@ -Change :func:`dis.dis` output to omit op arg values that cannot be resolved due to ``co_consts``, ``co_names`` etc not being provided. Previously the oparg itself was repeated in the value field, which is not useful and can be confusing. diff --git a/Misc/NEWS.d/next/Library/2021-09-13-14-59-01.bpo-20524.PMQ1Fh.rst b/Misc/NEWS.d/next/Library/2021-09-13-14-59-01.bpo-20524.PMQ1Fh.rst deleted file mode 100644 index 9a41c8e64f7e34..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-13-14-59-01.bpo-20524.PMQ1Fh.rst +++ /dev/null @@ -1,3 +0,0 @@ -Improves error messages on ``.format()`` operation for ``str``, ``float``, -``int``, and ``complex``. New format now shows the problematic pattern and -the object type. diff --git a/Misc/NEWS.d/next/Library/2021-09-13-19-32-58.bpo-42135.1ZAHqR.rst b/Misc/NEWS.d/next/Library/2021-09-13-19-32-58.bpo-42135.1ZAHqR.rst deleted file mode 100644 index 983b46e140e747..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-13-19-32-58.bpo-42135.1ZAHqR.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix typo: ``importlib.find_loader`` is really slated for removal in Python 3.12 not 3.10, like the others in GH-25169. - -Patch by Hugo van Kemenade. diff --git a/Misc/NEWS.d/next/Library/2021-09-16-19-02-14.bpo-45225.xmKV4i.rst b/Misc/NEWS.d/next/Library/2021-09-16-19-02-14.bpo-45225.xmKV4i.rst deleted file mode 100644 index 734fdd9b007d6b..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-16-19-02-14.bpo-45225.xmKV4i.rst +++ /dev/null @@ -1 +0,0 @@ -use map function instead of genexpr in capwords. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-09-17-09-59-33.bpo-45228.WV1dcT.rst b/Misc/NEWS.d/next/Library/2021-09-17-09-59-33.bpo-45228.WV1dcT.rst deleted file mode 100644 index 9336c0aed92bc4..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-17-09-59-33.bpo-45228.WV1dcT.rst +++ /dev/null @@ -1 +0,0 @@ -Fix stack buffer overflow in parsing J1939 network address. diff --git a/Misc/NEWS.d/next/Library/2021-09-17-11-20-55.bpo-45234.qUcTVt.rst b/Misc/NEWS.d/next/Library/2021-09-17-11-20-55.bpo-45234.qUcTVt.rst deleted file mode 100644 index 3817b5de6449d4..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-17-11-20-55.bpo-45234.qUcTVt.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixed a regression in :func:`~shutil.copyfile`, :func:`~shutil.copy`, -:func:`~shutil.copy2` raising :exc:`FileNotFoundError` when source is a -directory, which should raise :exc:`IsADirectoryError` diff --git a/Misc/NEWS.d/next/Library/2021-09-17-15-58-53.bpo-45183.Vv_vch.rst b/Misc/NEWS.d/next/Library/2021-09-17-15-58-53.bpo-45183.Vv_vch.rst deleted file mode 100644 index f3194b34318f40..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-17-15-58-53.bpo-45183.Vv_vch.rst +++ /dev/null @@ -1,3 +0,0 @@ -Have zipimport.zipimporter.find_spec() not raise an exception when the underlying zip -file has been deleted and the internal cache has been reset via -invalidate_cache(). diff --git a/Misc/NEWS.d/next/Library/2021-09-17-16-55-37.bpo-45235.sXnmPA.rst b/Misc/NEWS.d/next/Library/2021-09-17-16-55-37.bpo-45235.sXnmPA.rst deleted file mode 100644 index 871ec5281d3344..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-17-16-55-37.bpo-45235.sXnmPA.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix an issue where argparse would not preserve values in a provided namespace -when using a subparser with defaults. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-09-18-13-14-57.bpo-36674.a2k5Zb.rst b/Misc/NEWS.d/next/Library/2021-09-18-13-14-57.bpo-36674.a2k5Zb.rst deleted file mode 100644 index bc8c9247b080d4..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-18-13-14-57.bpo-36674.a2k5Zb.rst +++ /dev/null @@ -1,2 +0,0 @@ -:meth:`unittest.TestCase.debug` raises now a :class:`unittest.SkipTest` if -the class or the test method are decorated with the skipping decorator. diff --git a/Misc/NEWS.d/next/Library/2021-09-18-16-56-33.bpo-45238.Hng_9V.rst b/Misc/NEWS.d/next/Library/2021-09-18-16-56-33.bpo-45238.Hng_9V.rst deleted file mode 100644 index 857f315c520bba..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-18-16-56-33.bpo-45238.Hng_9V.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :meth:`unittest.IsolatedAsyncioTestCase.debug`: it runs now asynchronous -methods and callbacks. diff --git a/Misc/NEWS.d/next/Library/2021-09-20-22-46-40.bpo-21302.h56430.rst b/Misc/NEWS.d/next/Library/2021-09-20-22-46-40.bpo-21302.h56430.rst deleted file mode 100644 index 07f18d4a9074a0..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-20-22-46-40.bpo-21302.h56430.rst +++ /dev/null @@ -1,4 +0,0 @@ -On Windows, :func:`time.sleep` now uses a waitable timer which has a resolution -of 100 nanoseconds (10\ :sup:`-7` seconds). Previously, it had a resolution of -1 millisecond (10\ :sup:`-3` seconds). -Patch by Livius and Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-09-22-23-56-15.bpo-21302.vvQ3Su.rst b/Misc/NEWS.d/next/Library/2021-09-22-23-56-15.bpo-21302.vvQ3Su.rst deleted file mode 100644 index 52ee8d7cc64f15..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-22-23-56-15.bpo-21302.vvQ3Su.rst +++ /dev/null @@ -1 +0,0 @@ -In Unix operating systems, :func:`time.sleep` now uses the ``nanosleep()`` function, if ``clock_nanosleep()`` is not available but ``nanosleep()`` is available. ``nanosleep()`` allows to sleep with nanosecond precision. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-09-23-22-17-26.bpo-45274.gPpa4E.rst b/Misc/NEWS.d/next/Library/2021-09-23-22-17-26.bpo-45274.gPpa4E.rst deleted file mode 100644 index 94d06cef89b7be..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-23-22-17-26.bpo-45274.gPpa4E.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fix a race condition in the :meth:`Thread.join() ` -method of the :mod:`threading` module. If the function is interrupted by a -signal and the signal handler raises an exception, make sure that the thread -remains in a consistent state to prevent a deadlock. Patch by Victor -Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-09-24-17-20-23.bpo-1596321.3nhPUk.rst b/Misc/NEWS.d/next/Library/2021-09-24-17-20-23.bpo-1596321.3nhPUk.rst deleted file mode 100644 index 61a3e5abf395e1..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-24-17-20-23.bpo-1596321.3nhPUk.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix the :func:`threading._shutdown` function when the :mod:`threading` module -was imported first from a thread different than the main thread: no longer log -an error at Python exit. diff --git a/Misc/NEWS.d/next/Library/2021-09-30-23-00-18.bpo-41710.svuloZ.rst b/Misc/NEWS.d/next/Library/2021-09-30-23-00-18.bpo-41710.svuloZ.rst deleted file mode 100644 index d8a4f9507c1898..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-30-23-00-18.bpo-41710.svuloZ.rst +++ /dev/null @@ -1,5 +0,0 @@ -On Unix, if the ``sem_clockwait()`` function is available in the C library -(glibc 2.30 and newer), the :meth:`threading.Lock.acquire` method now uses the -monotonic clock (:data:`time.CLOCK_MONOTONIC`) for the timeout, rather than -using the system clock (:data:`time.CLOCK_REALTIME`), to not be affected by -system clock changes. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-10-01-13-09-53.bpo-45329.9iMYaO.rst b/Misc/NEWS.d/next/Library/2021-10-01-13-09-53.bpo-45329.9iMYaO.rst deleted file mode 100644 index b4bedbc278edf1..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-10-01-13-09-53.bpo-45329.9iMYaO.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix freed memory access in :class:`pyexpat.xmlparser` when building it with an -installed expat library <= 2.2.0. diff --git a/Misc/NEWS.d/next/Library/2021-10-05-11-03-48.bpo-45371.NOwcDJ.rst b/Misc/NEWS.d/next/Library/2021-10-05-11-03-48.bpo-45371.NOwcDJ.rst deleted file mode 100644 index 045489be81a190..00000000000000 --- a/Misc/NEWS.d/next/Library/2021-10-05-11-03-48.bpo-45371.NOwcDJ.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix clang rpath issue in :mod:`distutils`. The UnixCCompiler now uses -correct clang option to add a runtime library directory (rpath) to a shared -library. diff --git a/Misc/NEWS.d/next/Security/2021-05-05-17-37-04.bpo-44022.bS3XJ9.rst b/Misc/NEWS.d/next/Security/2021-05-05-17-37-04.bpo-44022.bS3XJ9.rst deleted file mode 100644 index 9669fc5ef37dde..00000000000000 --- a/Misc/NEWS.d/next/Security/2021-05-05-17-37-04.bpo-44022.bS3XJ9.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`http.client` now avoids infinitely reading potential HTTP headers after a -``100 Continue`` status response from the server. diff --git a/Misc/NEWS.d/next/Security/2021-05-08-11-50-46.bpo-43124.2CTM6M.rst b/Misc/NEWS.d/next/Security/2021-05-08-11-50-46.bpo-43124.2CTM6M.rst deleted file mode 100644 index e897d6cd3641d7..00000000000000 --- a/Misc/NEWS.d/next/Security/2021-05-08-11-50-46.bpo-43124.2CTM6M.rst +++ /dev/null @@ -1,2 +0,0 @@ -Made the internal ``putcmd`` function in :mod:`smtplib` sanitize input for -presence of ``\r`` and ``\n`` characters to avoid (unlikely) command injection. diff --git a/Misc/NEWS.d/next/Security/2021-06-29-02-45-53.bpo-44394.A220N1.rst b/Misc/NEWS.d/next/Security/2021-06-29-02-45-53.bpo-44394.A220N1.rst deleted file mode 100644 index e32563d2535c7e..00000000000000 --- a/Misc/NEWS.d/next/Security/2021-06-29-02-45-53.bpo-44394.A220N1.rst +++ /dev/null @@ -1,3 +0,0 @@ -Update the vendored copy of libexpat to 2.4.1 (from 2.2.8) to get the fix -for the CVE-2013-0340 "Billion Laughs" vulnerability. This copy is most used -on Windows and macOS. diff --git a/Misc/NEWS.d/next/Security/2021-06-29-23-40-22.bpo-41180.uTWHv_.rst b/Misc/NEWS.d/next/Security/2021-06-29-23-40-22.bpo-41180.uTWHv_.rst deleted file mode 100644 index 88b70c7cea2610..00000000000000 --- a/Misc/NEWS.d/next/Security/2021-06-29-23-40-22.bpo-41180.uTWHv_.rst +++ /dev/null @@ -1,5 +0,0 @@ -Add auditing events to the :mod:`marshal` module, and stop raising -``code.__init__`` events for every unmarshalled code object. Directly -instantiated code objects will continue to raise an event, and audit event -handlers should inspect or collect the raw marshal data. This reduces a -significant performance overhead when loading from ``.pyc`` files. diff --git a/Misc/NEWS.d/next/Security/2021-07-25-20-04-54.bpo-44600.0WMldg.rst b/Misc/NEWS.d/next/Security/2021-07-25-20-04-54.bpo-44600.0WMldg.rst deleted file mode 100644 index ea4e04f6da911c..00000000000000 --- a/Misc/NEWS.d/next/Security/2021-07-25-20-04-54.bpo-44600.0WMldg.rst +++ /dev/null @@ -1 +0,0 @@ -Fix incorrect line numbers while tracing some failed patterns in :ref:`match ` statements. Patch by Charles Burkland. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Security/2021-08-29-12-39-44.bpo-42278.jvmQz_.rst b/Misc/NEWS.d/next/Security/2021-08-29-12-39-44.bpo-42278.jvmQz_.rst deleted file mode 100644 index db880cd9026da4..00000000000000 --- a/Misc/NEWS.d/next/Security/2021-08-29-12-39-44.bpo-42278.jvmQz_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Replaced usage of :func:`tempfile.mktemp` with -:class:`~tempfile.TemporaryDirectory` to avoid a potential race condition. diff --git a/Misc/NEWS.d/next/Tests/2019-09-25-18-10-10.bpo-30256.A5i76Q.rst b/Misc/NEWS.d/next/Tests/2019-09-25-18-10-10.bpo-30256.A5i76Q.rst deleted file mode 100644 index 4a7cfd52fcea22..00000000000000 --- a/Misc/NEWS.d/next/Tests/2019-09-25-18-10-10.bpo-30256.A5i76Q.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add test for nested queues when using ``multiprocessing`` shared objects -``AutoProxy[Queue]`` inside ``ListProxy`` and ``DictProxy`` diff --git a/Misc/NEWS.d/next/Tests/2020-10-25-19-20-26.bpo-35753.2LT-hO.rst b/Misc/NEWS.d/next/Tests/2020-10-25-19-20-26.bpo-35753.2LT-hO.rst deleted file mode 100644 index eddfc25906da9e..00000000000000 --- a/Misc/NEWS.d/next/Tests/2020-10-25-19-20-26.bpo-35753.2LT-hO.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix crash in doctest when doctest parses modules that include unwrappable -functions by skipping those functions. diff --git a/Misc/NEWS.d/next/Tests/2021-05-04-18-10-57.bpo-42083.EMS2TK.rst b/Misc/NEWS.d/next/Tests/2021-05-04-18-10-57.bpo-42083.EMS2TK.rst deleted file mode 100644 index 8457508237a888..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-05-04-18-10-57.bpo-42083.EMS2TK.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add test to check that ``PyStructSequence_NewType`` accepts a -``PyStructSequence_Desc`` with ``doc`` field set to ``NULL``. diff --git a/Misc/NEWS.d/next/Tests/2021-05-07-15-46-04.bpo-31904.8dk3la.rst b/Misc/NEWS.d/next/Tests/2021-05-07-15-46-04.bpo-31904.8dk3la.rst deleted file mode 100644 index 334878f91ddacd..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-05-07-15-46-04.bpo-31904.8dk3la.rst +++ /dev/null @@ -1 +0,0 @@ -Ignore error string case in test_file_not_exists(). diff --git a/Misc/NEWS.d/next/Tests/2021-05-14-14-13-44.bpo-44131.YPizoC.rst b/Misc/NEWS.d/next/Tests/2021-05-14-14-13-44.bpo-44131.YPizoC.rst deleted file mode 100644 index a646acf8e44431..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-05-14-14-13-44.bpo-44131.YPizoC.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add test_frozenmain to test_embed to test the :c:func:`Py_FrozenMain` C -function. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2021-06-02-17-41-42.bpo-43921.xP7yZ4.rst b/Misc/NEWS.d/next/Tests/2021-06-02-17-41-42.bpo-43921.xP7yZ4.rst deleted file mode 100644 index 83146c78524671..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-06-02-17-41-42.bpo-43921.xP7yZ4.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix test_pha_required_nocert() of test_ssl: catch two more EOF cases (when -the ``recv()`` method returns an empty string). Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2021-06-03-03-29-34.bpo-43921.nwH1FS.rst b/Misc/NEWS.d/next/Tests/2021-06-03-03-29-34.bpo-43921.nwH1FS.rst deleted file mode 100644 index 30e0fadd661258..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-06-03-03-29-34.bpo-43921.nwH1FS.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix test_ssl.test_wrong_cert_tls13(): use ``suppress_ragged_eofs=False``, -since ``read()`` can raise :exc:`ssl.SSLEOFError` on Windows. Patch by -Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2021-06-09-15-32-05.bpo-44364.zu9Zee.rst b/Misc/NEWS.d/next/Tests/2021-06-09-15-32-05.bpo-44364.zu9Zee.rst deleted file mode 100644 index 12b80e8e6533b8..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-06-09-15-32-05.bpo-44364.zu9Zee.rst +++ /dev/null @@ -1 +0,0 @@ -Add non integral tests for :func:`math.sqrt` function. diff --git a/Misc/NEWS.d/next/Tests/2021-06-10-11-19-43.bpo-44363.-K9jD0.rst b/Misc/NEWS.d/next/Tests/2021-06-10-11-19-43.bpo-44363.-K9jD0.rst deleted file mode 100644 index 28468cbd2b682b..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-06-10-11-19-43.bpo-44363.-K9jD0.rst +++ /dev/null @@ -1,2 +0,0 @@ -Account for address sanitizer in test_capi. test_capi now passes when run -GCC address sanitizer. diff --git a/Misc/NEWS.d/next/Tests/2021-06-18-15-19-35.bpo-44451.aj5pqE.rst b/Misc/NEWS.d/next/Tests/2021-06-18-15-19-35.bpo-44451.aj5pqE.rst deleted file mode 100644 index 0f635cfe18d141..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-06-18-15-19-35.bpo-44451.aj5pqE.rst +++ /dev/null @@ -1,3 +0,0 @@ -Reset ``DeprecationWarning`` filters in -``test.test_importlib.test_metadata_api.APITests.test_entry_points_by_index`` -to avoid ``StopIteration`` error if ``DeprecationWarnings`` are ignored. diff --git a/Misc/NEWS.d/next/Tests/2021-06-21-17-53-41.bpo-44287.YON57s.rst b/Misc/NEWS.d/next/Tests/2021-06-21-17-53-41.bpo-44287.YON57s.rst deleted file mode 100644 index 66b3afe139aa8d..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-06-21-17-53-41.bpo-44287.YON57s.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix asyncio test_popen() of test_windows_utils by using a longer timeout. -Use military grade battle-tested :data:`test.support.SHORT_TIMEOUT` timeout -rather than a hardcoded timeout of 10 seconds: it's 30 seconds by default, but -it is made longer on slow buildbots. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2021-06-26-18-37-36.bpo-44515.e9fO6f.rst b/Misc/NEWS.d/next/Tests/2021-06-26-18-37-36.bpo-44515.e9fO6f.rst deleted file mode 100644 index d2867b6e89f872..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-06-26-18-37-36.bpo-44515.e9fO6f.rst +++ /dev/null @@ -1,2 +0,0 @@ -Adjust recently added contextlib tests to avoid assuming the use of a -refcounted GC diff --git a/Misc/NEWS.d/next/Tests/2021-07-16-14-02-33.bpo-44647.5LzqIy.rst b/Misc/NEWS.d/next/Tests/2021-07-16-14-02-33.bpo-44647.5LzqIy.rst deleted file mode 100644 index e4b2be2b409997..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-07-16-14-02-33.bpo-44647.5LzqIy.rst +++ /dev/null @@ -1,4 +0,0 @@ -Added a permanent Unicode-valued environment variable to regression tests to -ensure they handle this use case in the future. If your test environment -breaks because of that, report a bug to us, and temporarily set -PYTHONREGRTEST_UNICODE_GUARD=0 in your test environment. diff --git a/Misc/NEWS.d/next/Tests/2021-07-17-11-41-20.bpo-42095.kCB7oj.rst b/Misc/NEWS.d/next/Tests/2021-07-17-11-41-20.bpo-42095.kCB7oj.rst deleted file mode 100644 index bf7bc5b2ff4491..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-07-17-11-41-20.bpo-42095.kCB7oj.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added interop tests for Apple plists: generate plist files with Python -plistlib and parse with Apple plutil; and the other way round. diff --git a/Misc/NEWS.d/next/Tests/2021-07-22-16-38-39.bpo-44708.SYNaac.rst b/Misc/NEWS.d/next/Tests/2021-07-22-16-38-39.bpo-44708.SYNaac.rst deleted file mode 100644 index 8b26c4de64b983..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-07-22-16-38-39.bpo-44708.SYNaac.rst +++ /dev/null @@ -1,2 +0,0 @@ -Regression tests, when run with -w, are now re-running only the affected -test methods instead of re-running the entire test file. diff --git a/Misc/NEWS.d/next/Tests/2021-07-24-20-09-15.bpo-44734.KKsNOV.rst b/Misc/NEWS.d/next/Tests/2021-07-24-20-09-15.bpo-44734.KKsNOV.rst deleted file mode 100644 index 94e9ce08f4bf6b..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-07-24-20-09-15.bpo-44734.KKsNOV.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed floating point precision issue in turtle tests. diff --git a/Misc/NEWS.d/next/Tests/2021-08-06-00-07-15.bpo-40928.aIwb6G.rst b/Misc/NEWS.d/next/Tests/2021-08-06-00-07-15.bpo-40928.aIwb6G.rst deleted file mode 100644 index c9a5e1b01e58aa..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-08-06-00-07-15.bpo-40928.aIwb6G.rst +++ /dev/null @@ -1,2 +0,0 @@ -Notify users running test_decimal regression tests on macOS of potential -harmless "malloc can't allocate region" messages spewed by test_decimal. diff --git a/Misc/NEWS.d/next/Tests/2021-08-06-18-36-04.bpo-44852.sUL8YX.rst b/Misc/NEWS.d/next/Tests/2021-08-06-18-36-04.bpo-44852.sUL8YX.rst deleted file mode 100644 index 41b5c2fb51c5c7..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-08-06-18-36-04.bpo-44852.sUL8YX.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add ability to wholesale silence DeprecationWarnings while running the -regression test suite. diff --git a/Misc/NEWS.d/next/Tests/2021-08-13-12-11-06.bpo-44891.T9_mBT.rst b/Misc/NEWS.d/next/Tests/2021-08-13-12-11-06.bpo-44891.T9_mBT.rst deleted file mode 100644 index 2f83389ec15855..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-08-13-12-11-06.bpo-44891.T9_mBT.rst +++ /dev/null @@ -1,2 +0,0 @@ -Tests were added to clarify :func:`id` is preserved when ``obj * 1`` is used -on :class:`str` and :class:`bytes` objects. Patch by Nikita Sobolev. diff --git a/Misc/NEWS.d/next/Tests/2021-08-18-18-30-12.bpo-44949.VE5ENv.rst b/Misc/NEWS.d/next/Tests/2021-08-18-18-30-12.bpo-44949.VE5ENv.rst deleted file mode 100644 index 7fdf1810b165e5..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-08-18-18-30-12.bpo-44949.VE5ENv.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix auto history tests of test_readline: sometimes, the newline character is -not written at the end, so don't expect it in the output. diff --git a/Misc/NEWS.d/next/Tests/2021-08-26-14-20-44.bpo-45011.mQZdXU.rst b/Misc/NEWS.d/next/Tests/2021-08-26-14-20-44.bpo-45011.mQZdXU.rst deleted file mode 100644 index 64e701e2f29f49..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-08-26-14-20-44.bpo-45011.mQZdXU.rst +++ /dev/null @@ -1,3 +0,0 @@ -Made tests relying on the :mod:`_asyncio` C extension module optional to -allow running on alternative Python implementations. Patch by Serhiy -Storchaka. diff --git a/Misc/NEWS.d/next/Tests/2021-08-27-22-37-19.bpo-25130.ig4oJe.rst b/Misc/NEWS.d/next/Tests/2021-08-27-22-37-19.bpo-25130.ig4oJe.rst deleted file mode 100644 index 43ce68bef46099..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-08-27-22-37-19.bpo-25130.ig4oJe.rst +++ /dev/null @@ -1 +0,0 @@ -Add calls of :func:`gc.collect` in tests to support PyPy. diff --git a/Misc/NEWS.d/next/Tests/2021-08-30-11-54-14.bpo-45042.QMz3X8.rst b/Misc/NEWS.d/next/Tests/2021-08-30-11-54-14.bpo-45042.QMz3X8.rst deleted file mode 100644 index e2c0dffced96e7..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-08-30-11-54-14.bpo-45042.QMz3X8.rst +++ /dev/null @@ -1 +0,0 @@ -Fixes that test classes decorated with ``@hashlib_helper.requires_hashdigest`` were skipped all the time. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Tests/2021-09-01-17-17-44.bpo-44895.kV7H77.rst b/Misc/NEWS.d/next/Tests/2021-09-01-17-17-44.bpo-44895.kV7H77.rst deleted file mode 100644 index 038466f8d6a4f3..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-09-01-17-17-44.bpo-44895.kV7H77.rst +++ /dev/null @@ -1,5 +0,0 @@ -libregrtest now clears the type cache later to reduce the risk of false alarm -when checking for reference leaks. Previously, the type cache was cleared too -early and libregrtest raised a false alarm about reference leaks under very -specific conditions. -Patch by Irit Katriel and Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2021-09-06-19-00-29.bpo-45052.yrOK3J.rst b/Misc/NEWS.d/next/Tests/2021-09-06-19-00-29.bpo-45052.yrOK3J.rst deleted file mode 100644 index 5c2e4f3e0e67bc..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-09-06-19-00-29.bpo-45052.yrOK3J.rst +++ /dev/null @@ -1,7 +0,0 @@ -``WithProcessesTestSharedMemory.test_shared_memory_basics`` test was -ignored, because ``self.assertEqual(sms.size, sms2.size)`` line was failing. -It is now removed and test is unskipped. - -The main motivation for this line to be removed from the test is that the -``size`` of ``SharedMemory`` is not ever guaranteed to be the same. It is -decided by the platform. diff --git a/Misc/NEWS.d/next/Tests/2021-09-08-13-01-37.bpo-44860.qXd0kx.rst b/Misc/NEWS.d/next/Tests/2021-09-08-13-01-37.bpo-44860.qXd0kx.rst deleted file mode 100644 index 153a9c55733fbb..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-09-08-13-01-37.bpo-44860.qXd0kx.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update ``test_sysconfig.test_user_similar()`` for the posix_user scheme: -``platlib`` doesn't use :data:`sys.platlibdir`. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2021-09-11-22-08-18.bpo-45125.FVSzs2.rst b/Misc/NEWS.d/next/Tests/2021-09-11-22-08-18.bpo-45125.FVSzs2.rst deleted file mode 100644 index 5dfbe0e5db4631..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-09-11-22-08-18.bpo-45125.FVSzs2.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improves pickling tests and docs of ``SharedMemory`` and ``SharableList`` -objects. diff --git a/Misc/NEWS.d/next/Tests/2021-09-13-00-28-17.bpo-45156.8oomV3.rst b/Misc/NEWS.d/next/Tests/2021-09-13-00-28-17.bpo-45156.8oomV3.rst deleted file mode 100644 index b2094b5765331c..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-09-13-00-28-17.bpo-45156.8oomV3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixes infinite loop on :func:`unittest.mock.seal` of mocks created by -:func:`~unittest.create_autospec`. diff --git a/Misc/NEWS.d/next/Tests/2021-09-14-13-16-18.bpo-45195.EyQR1G.rst b/Misc/NEWS.d/next/Tests/2021-09-14-13-16-18.bpo-45195.EyQR1G.rst deleted file mode 100644 index 16a1f4440483ca..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-09-14-13-16-18.bpo-45195.EyQR1G.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix test_readline.test_nonascii(): sometimes, the newline character is not -written at the end, so don't expect it in the output. Patch by Victor -Stinner. diff --git a/Misc/NEWS.d/next/Tests/2021-09-14-14-54-04.bpo-45185.qFx5I6.rst b/Misc/NEWS.d/next/Tests/2021-09-14-14-54-04.bpo-45185.qFx5I6.rst deleted file mode 100644 index e723f24759e9e9..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-09-14-14-54-04.bpo-45185.qFx5I6.rst +++ /dev/null @@ -1 +0,0 @@ -Enables ``TestEnumerations`` test cases in ``test_ssl`` suite. diff --git a/Misc/NEWS.d/next/Tests/2021-09-15-23-32-39.bpo-45209.55ntL5.rst b/Misc/NEWS.d/next/Tests/2021-09-15-23-32-39.bpo-45209.55ntL5.rst deleted file mode 100644 index 4c3bed0983b899..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-09-15-23-32-39.bpo-45209.55ntL5.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``UserWarning: resource_tracker`` warning in -``_test_multiprocessing._TestSharedMemory.test_shared_memory_cleaned_after_process_termination`` diff --git a/Misc/NEWS.d/next/Tests/2021-09-16-17-22-35.bpo-45128.Jz6fl2.rst b/Misc/NEWS.d/next/Tests/2021-09-16-17-22-35.bpo-45128.Jz6fl2.rst deleted file mode 100644 index b50eb32b3faa8e..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-09-16-17-22-35.bpo-45128.Jz6fl2.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``test_multiprocessing_fork`` failure due to ``test_logging`` and -``sys.modules`` manipulation. diff --git a/Misc/NEWS.d/next/Tests/2021-09-24-10-41-49.bpo-45269.8jKEr8.rst b/Misc/NEWS.d/next/Tests/2021-09-24-10-41-49.bpo-45269.8jKEr8.rst deleted file mode 100644 index 72dd9471134fff..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-09-24-10-41-49.bpo-45269.8jKEr8.rst +++ /dev/null @@ -1 +0,0 @@ -Cover case when invalid ``markers`` type is supplied to ``c_make_encoder``. diff --git a/Misc/NEWS.d/next/Tests/2021-09-25-11-05-31.bpo-45280.3MA6lC.rst b/Misc/NEWS.d/next/Tests/2021-09-25-11-05-31.bpo-45280.3MA6lC.rst deleted file mode 100644 index 71691f5ba2b89c..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-09-25-11-05-31.bpo-45280.3MA6lC.rst +++ /dev/null @@ -1 +0,0 @@ -Add a test case for empty :class:`typing.NamedTuple`. diff --git a/Misc/NEWS.d/next/Tests/2021-09-30-16-54-39.bpo-40173.J_slCw.rst b/Misc/NEWS.d/next/Tests/2021-09-30-16-54-39.bpo-40173.J_slCw.rst deleted file mode 100644 index 21671473c16ccd..00000000000000 --- a/Misc/NEWS.d/next/Tests/2021-09-30-16-54-39.bpo-40173.J_slCw.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :func:`test.support.import_helper.import_fresh_module`. - diff --git a/Misc/NEWS.d/next/Tools-Demos/2020-02-25-18-22-09.bpo-20291.AyrDiZ.rst b/Misc/NEWS.d/next/Tools-Demos/2020-02-25-18-22-09.bpo-20291.AyrDiZ.rst deleted file mode 100644 index c64c5488bfaa1b..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2020-02-25-18-22-09.bpo-20291.AyrDiZ.rst +++ /dev/null @@ -1 +0,0 @@ -Added support for variadic positional parameters in Argument Clinic. diff --git a/Misc/NEWS.d/next/Tools-Demos/2021-05-08-13-57-00.bpo-44074.F09kCK.rst b/Misc/NEWS.d/next/Tools-Demos/2021-05-08-13-57-00.bpo-44074.F09kCK.rst deleted file mode 100644 index 8bccb080a54186..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2021-05-08-13-57-00.bpo-44074.F09kCK.rst +++ /dev/null @@ -1 +0,0 @@ -Make patchcheck automatically detect the correct base branch name (previously it was hardcoded to 'master') \ No newline at end of file diff --git a/Misc/NEWS.d/next/Tools-Demos/2021-07-01-22-21-25.bpo-43425.t65len.rst b/Misc/NEWS.d/next/Tools-Demos/2021-07-01-22-21-25.bpo-43425.t65len.rst deleted file mode 100644 index b9ce6c467f90b9..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2021-07-01-22-21-25.bpo-43425.t65len.rst +++ /dev/null @@ -1,3 +0,0 @@ -Removed the 'test2to3' demo project that demonstrated using lib2to3 -to support Python 2.x and Python 3.x from a single source in -a distutils package. Patch by Dong-hee Na diff --git a/Misc/NEWS.d/next/Tools-Demos/2021-08-22-11-45-31.bpo-44978.QupKV3.rst b/Misc/NEWS.d/next/Tools-Demos/2021-08-22-11-45-31.bpo-44978.QupKV3.rst deleted file mode 100644 index c7a844c1230e2e..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2021-08-22-11-45-31.bpo-44978.QupKV3.rst +++ /dev/null @@ -1 +0,0 @@ -Allow the Argument Clinic tool to handle ``__complex__`` special methods. diff --git a/Misc/NEWS.d/next/Tools-Demos/2021-08-26-11-57-31.bpo-44967.UT1RMV.rst b/Misc/NEWS.d/next/Tools-Demos/2021-08-26-11-57-31.bpo-44967.UT1RMV.rst deleted file mode 100644 index 564a5c7d768943..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2021-08-26-11-57-31.bpo-44967.UT1RMV.rst +++ /dev/null @@ -1 +0,0 @@ -pydoc now returns a non-zero status code when a module cannot be found. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Tools-Demos/2021-09-14-11-44-26.bpo-44786.DU0LC0.rst b/Misc/NEWS.d/next/Tools-Demos/2021-09-14-11-44-26.bpo-44786.DU0LC0.rst deleted file mode 100644 index 96ebf2c33cc5ae..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2021-09-14-11-44-26.bpo-44786.DU0LC0.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a warning in regular expression in the c-analyzer script. diff --git a/Misc/NEWS.d/next/Windows/2020-04-13-15-20-28.bpo-40263.1KKEbu.rst b/Misc/NEWS.d/next/Windows/2020-04-13-15-20-28.bpo-40263.1KKEbu.rst deleted file mode 100644 index 0c31606d4928c8..00000000000000 --- a/Misc/NEWS.d/next/Windows/2020-04-13-15-20-28.bpo-40263.1KKEbu.rst +++ /dev/null @@ -1,3 +0,0 @@ -This is a follow-on bug from https://bugs.python.org/issue26903. Once that -is applied we run into an off-by-one assertion problem. The assert was not -correct. diff --git a/Misc/NEWS.d/next/Windows/2021-01-01-21-21-03.bpo-42686.G_f-TC.rst b/Misc/NEWS.d/next/Windows/2021-01-01-21-21-03.bpo-42686.G_f-TC.rst deleted file mode 100644 index 2fcf6e946ec838..00000000000000 --- a/Misc/NEWS.d/next/Windows/2021-01-01-21-21-03.bpo-42686.G_f-TC.rst +++ /dev/null @@ -1 +0,0 @@ -Build :mod:`sqlite3` with math functions enabled. Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Windows/2021-06-06-16-36-13.bpo-41299.Rg-vb_.rst b/Misc/NEWS.d/next/Windows/2021-06-06-16-36-13.bpo-41299.Rg-vb_.rst deleted file mode 100644 index 1104882b1ba302..00000000000000 --- a/Misc/NEWS.d/next/Windows/2021-06-06-16-36-13.bpo-41299.Rg-vb_.rst +++ /dev/null @@ -1 +0,0 @@ -Fix 16 milliseconds jitter when using timeouts in :mod:`threading`, such as with :meth:`threading.Lock.acquire` or :meth:`threading.Condition.wait`. diff --git a/Misc/NEWS.d/next/Windows/2021-07-07-21-07-18.bpo-44582.4Mm6Hh.rst b/Misc/NEWS.d/next/Windows/2021-07-07-21-07-18.bpo-44582.4Mm6Hh.rst deleted file mode 100644 index f79c88931c5310..00000000000000 --- a/Misc/NEWS.d/next/Windows/2021-07-07-21-07-18.bpo-44582.4Mm6Hh.rst +++ /dev/null @@ -1,2 +0,0 @@ -Accelerate speed of :mod:`mimetypes` initialization using a native -implementation of the registry scan. diff --git a/Misc/NEWS.d/next/Windows/2021-07-13-15-32-49.bpo-44572.gXvhDc.rst b/Misc/NEWS.d/next/Windows/2021-07-13-15-32-49.bpo-44572.gXvhDc.rst deleted file mode 100644 index 6e074c59b8445b..00000000000000 --- a/Misc/NEWS.d/next/Windows/2021-07-13-15-32-49.bpo-44572.gXvhDc.rst +++ /dev/null @@ -1 +0,0 @@ -Avoid consuming standard input in the :mod:`platform` module \ No newline at end of file diff --git a/Misc/NEWS.d/next/Windows/2021-08-06-10-11-07.bpo-44848.ib3Jcz.rst b/Misc/NEWS.d/next/Windows/2021-08-06-10-11-07.bpo-44848.ib3Jcz.rst deleted file mode 100644 index 6eadfedda865e9..00000000000000 --- a/Misc/NEWS.d/next/Windows/2021-08-06-10-11-07.bpo-44848.ib3Jcz.rst +++ /dev/null @@ -1 +0,0 @@ -Upgrade Windows installer to use SQLite 3.36.0. diff --git a/Misc/NEWS.d/next/Windows/2021-08-27-23-50-02.bpo-45007.NIBlVG.rst b/Misc/NEWS.d/next/Windows/2021-08-27-23-50-02.bpo-45007.NIBlVG.rst deleted file mode 100644 index fa076ee4c8b8ad..00000000000000 --- a/Misc/NEWS.d/next/Windows/2021-08-27-23-50-02.bpo-45007.NIBlVG.rst +++ /dev/null @@ -1 +0,0 @@ -Update to OpenSSL 1.1.1l in Windows build diff --git a/Misc/NEWS.d/next/Windows/2021-09-03-18-05-21.bpo-45022.bgpD_r.rst b/Misc/NEWS.d/next/Windows/2021-09-03-18-05-21.bpo-45022.bgpD_r.rst deleted file mode 100644 index 8c19faad771763..00000000000000 --- a/Misc/NEWS.d/next/Windows/2021-09-03-18-05-21.bpo-45022.bgpD_r.rst +++ /dev/null @@ -1 +0,0 @@ -Update Windows release to include libffi 3.4.2 diff --git a/Misc/NEWS.d/next/Windows/2021-10-05-12-41-53.bpo-45375.CohPP-.rst b/Misc/NEWS.d/next/Windows/2021-10-05-12-41-53.bpo-45375.CohPP-.rst deleted file mode 100644 index c72164373abe6b..00000000000000 --- a/Misc/NEWS.d/next/Windows/2021-10-05-12-41-53.bpo-45375.CohPP-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixes an assertion failure due to searching for the standard library in -unnormalised paths. diff --git a/Misc/NEWS.d/next/macOS/2021-03-29-21-11-23.bpo-34932.f3Hdyd.rst b/Misc/NEWS.d/next/macOS/2021-03-29-21-11-23.bpo-34932.f3Hdyd.rst deleted file mode 100644 index d3a52c9fc37b5f..00000000000000 --- a/Misc/NEWS.d/next/macOS/2021-03-29-21-11-23.bpo-34932.f3Hdyd.rst +++ /dev/null @@ -1 +0,0 @@ -Add socket.TCP_KEEPALIVE support for macOS. Patch by Shane Harvey. diff --git a/Misc/NEWS.d/next/macOS/2021-05-24-21-15-41.bpo-43109.npKJ9c.rst b/Misc/NEWS.d/next/macOS/2021-05-24-21-15-41.bpo-43109.npKJ9c.rst deleted file mode 100644 index bb4d24fa95513f..00000000000000 --- a/Misc/NEWS.d/next/macOS/2021-05-24-21-15-41.bpo-43109.npKJ9c.rst +++ /dev/null @@ -1,2 +0,0 @@ -Allow --with-lto configure option to work with Apple-supplied Xcode or -Command Line Tools. diff --git a/Misc/NEWS.d/next/macOS/2021-07-12-15-42-02.bpo-41972.yUjE8j.rst b/Misc/NEWS.d/next/macOS/2021-07-12-15-42-02.bpo-41972.yUjE8j.rst deleted file mode 100644 index 6c70c07669f9c1..00000000000000 --- a/Misc/NEWS.d/next/macOS/2021-07-12-15-42-02.bpo-41972.yUjE8j.rst +++ /dev/null @@ -1,2 +0,0 @@ -The framework build's user header path in sysconfig is changed to add a -'pythonX.Y' component to match distutils's behavior. diff --git a/Misc/NEWS.d/next/macOS/2021-07-20-22-27-01.bpo-44689.mmT_xH.rst b/Misc/NEWS.d/next/macOS/2021-07-20-22-27-01.bpo-44689.mmT_xH.rst deleted file mode 100644 index b1e878d1ee44af..00000000000000 --- a/Misc/NEWS.d/next/macOS/2021-07-20-22-27-01.bpo-44689.mmT_xH.rst +++ /dev/null @@ -1,5 +0,0 @@ - :meth:`ctypes.util.find_library` now works correctly on macOS 11 Big Sur - even if Python is built on an older version of macOS. Previously, when - built on older macOS systems, ``find_library`` was not able to find - macOS system libraries when running on Big Sur due to changes in - how system libraries are stored. diff --git a/Misc/NEWS.d/next/macOS/2021-08-06-10-08-41.bpo-44848.0uYXsE.rst b/Misc/NEWS.d/next/macOS/2021-08-06-10-08-41.bpo-44848.0uYXsE.rst deleted file mode 100644 index 7e9c41a8e9a480..00000000000000 --- a/Misc/NEWS.d/next/macOS/2021-08-06-10-08-41.bpo-44848.0uYXsE.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer to use SQLite 3.36.0. diff --git a/Misc/NEWS.d/next/macOS/2021-08-27-16-55-10.bpo-34602.ZjHsYJ.rst b/Misc/NEWS.d/next/macOS/2021-08-27-16-55-10.bpo-34602.ZjHsYJ.rst deleted file mode 100644 index 29a6ff92554e1c..00000000000000 --- a/Misc/NEWS.d/next/macOS/2021-08-27-16-55-10.bpo-34602.ZjHsYJ.rst +++ /dev/null @@ -1,3 +0,0 @@ -When building CPython on macOS with ``./configure ---with-undefined-behavior-sanitizer --with-pydebug``, the stack size is now -quadrupled to allow for the entire test suite to pass. diff --git a/Misc/NEWS.d/next/macOS/2021-08-30-00-04-10.bpo-45007.pixqUB.rst b/Misc/NEWS.d/next/macOS/2021-08-30-00-04-10.bpo-45007.pixqUB.rst deleted file mode 100644 index e4f1ac6de313d4..00000000000000 --- a/Misc/NEWS.d/next/macOS/2021-08-30-00-04-10.bpo-45007.pixqUB.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer builds to use OpenSSL 1.1.1l. diff --git a/README.rst b/README.rst index 067d7d8ca2b818..c2b26a46515119 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.11.0 alpha 0 +This is Python version 3.11.0 alpha 1 ===================================== .. image:: https://travis-ci.com/python/cpython.svg?branch=main From b9bb74871b27d9226df2dd3fce9d42bda8b43c2b Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Tue, 5 Oct 2021 21:19:32 +0800 Subject: [PATCH 071/263] bpo-44050: Extension modules can share state when they don't support sub-interpreters. (GH-27794) Automerge-Triggered-By: GH:encukou --- Lib/test/test_capi.py | 31 +++++++++++++++++++ .../2021-09-08-00-30-09.bpo-44050.mFI15u.rst | 3 ++ Modules/_testmultiphase.c | 22 +++++++++++++ Python/import.c | 4 ++- 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-08-00-30-09.bpo-44050.mFI15u.rst diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index db029ef731c382..bdb8f768fc3138 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -766,6 +766,37 @@ def test_mutate_exception(self): self.assertFalse(hasattr(binascii.Error, "foobar")) + def test_module_state_shared_in_global(self): + """ + bpo-44050: Extension module state should be shared between interpreters + when it doesn't support sub-interpreters. + """ + r, w = os.pipe() + self.addCleanup(os.close, r) + self.addCleanup(os.close, w) + + script = textwrap.dedent(f""" + import importlib.machinery + import importlib.util + import os + + fullname = '_test_module_state_shared' + origin = importlib.util.find_spec('_testmultiphase').origin + loader = importlib.machinery.ExtensionFileLoader(fullname, origin) + spec = importlib.util.spec_from_loader(fullname, loader) + module = importlib.util.module_from_spec(spec) + attr_id = str(id(module.Error)).encode() + + os.write({w}, attr_id) + """) + exec(script) + main_attr_id = os.read(r, 100) + + ret = support.run_in_subinterp(script) + self.assertEqual(ret, 0) + subinterp_attr_id = os.read(r, 100) + self.assertEqual(main_attr_id, subinterp_attr_id) + class TestThreadState(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-08-00-30-09.bpo-44050.mFI15u.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-08-00-30-09.bpo-44050.mFI15u.rst new file mode 100644 index 00000000000000..d6eed9f1bcfe9d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-09-08-00-30-09.bpo-44050.mFI15u.rst @@ -0,0 +1,3 @@ +Extensions that indicate they use global state (by setting ``m_size`` to -1) +can again be used in multiple interpreters. This reverts to behavior of +Python 3.8. diff --git a/Modules/_testmultiphase.c b/Modules/_testmultiphase.c index ad60f32f7e7a62..e0ed77d265cdcc 100644 --- a/Modules/_testmultiphase.c +++ b/Modules/_testmultiphase.c @@ -844,6 +844,28 @@ PyInit__testmultiphase_meth_state_access(PyObject *spec) return PyModuleDef_Init(&def_meth_state_access); } +static PyModuleDef def_module_state_shared = { + PyModuleDef_HEAD_INIT, + .m_name = "_test_module_state_shared", + .m_doc = PyDoc_STR("Regression Test module for single-phase init."), + .m_size = -1, +}; + +PyMODINIT_FUNC +PyInit__test_module_state_shared(PyObject *spec) +{ + PyObject *module = PyModule_Create(&def_module_state_shared); + if (module == NULL) { + return NULL; + } + + if (PyModule_AddObjectRef(module, "Error", PyExc_Exception) < 0) { + Py_DECREF(module); + return NULL; + } + return module; +} + /*** Helper for imp test ***/ diff --git a/Python/import.c b/Python/import.c index 317a836617c51d..d7f126784192b5 100644 --- a/Python/import.c +++ b/Python/import.c @@ -442,7 +442,9 @@ _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name, return -1; } - if (_Py_IsMainInterpreter(tstate->interp)) { + // bpo-44050: Extensions and def->m_base.m_copy can be updated + // when the extension module doesn't support sub-interpreters. + if (_Py_IsMainInterpreter(tstate->interp) || def->m_size == -1) { if (def->m_size == -1) { if (def->m_base.m_copy) { /* Somebody already imported the module, From c3d9ac8b340fcbf54cee865737e67f11fcd70ed3 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 5 Oct 2021 10:01:27 -0600 Subject: [PATCH 072/263] bpo-45324: Capture data in FrozenImporter.find_spec() to use in exec_module(). (gh-28633) Before this change we end up duplicating effort and throwing away data in FrozenImporter.find_spec(). Now we do the work once in find_spec() and the only thing we do in FrozenImporter.exec_module() is turn the raw frozen data into a code object and then exec it. We've added _imp.find_frozen(), add an arg to _imp.get_frozen_object(), and updated FrozenImporter. We've also moved some code around to reduce duplication, get a little more consistency in outcomes, and be more efficient. Note that this change is mostly necessary if we want to set __file__ on frozen stdlib modules. (See https://bugs.python.org/issue21736.) https://bugs.python.org/issue45324 --- Lib/importlib/_bootstrap.py | 32 ++- Lib/test/test_importlib/frozen/test_finder.py | 76 +++-- Lib/test/test_importlib/frozen/test_loader.py | 7 + .../2021-09-29-12-02-39.bpo-45324.BTQElX.rst | 3 + Python/clinic/import.c.h | 67 ++++- Python/import.c | 268 ++++++++++++------ 6 files changed, 332 insertions(+), 121 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-09-29-12-02-39.bpo-45324.BTQElX.rst diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index e64f7ad151755d..5807577c74bce1 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -826,10 +826,15 @@ def module_repr(m): @classmethod def find_spec(cls, fullname, path=None, target=None): - if _imp.is_frozen(fullname): - return spec_from_loader(fullname, cls, origin=cls._ORIGIN) - else: + info = _call_with_frames_removed(_imp.find_frozen, fullname) + if info is None: return None + data, ispkg = info + spec = spec_from_loader(fullname, cls, + origin=cls._ORIGIN, + is_package=ispkg) + spec.loader_state = data + return spec @classmethod def find_module(cls, fullname, path=None): @@ -849,11 +854,22 @@ def create_module(spec): @staticmethod def exec_module(module): - name = module.__spec__.name - if not _imp.is_frozen(name): - raise ImportError('{!r} is not a frozen module'.format(name), - name=name) - code = _call_with_frames_removed(_imp.get_frozen_object, name) + spec = module.__spec__ + name = spec.name + try: + data = spec.loader_state + except AttributeError: + if not _imp.is_frozen(name): + raise ImportError('{!r} is not a frozen module'.format(name), + name=name) + data = None + else: + # We clear the extra data we got from the finder, to save memory. + # Note that if this method is called again (e.g. by + # importlib.reload()) then _imp.get_frozen_object() will notice + # no data was provided and will look it up. + spec.loader_state = None + code = _call_with_frames_removed(_imp.get_frozen_object, name, data) exec(code, module.__dict__) @classmethod diff --git a/Lib/test/test_importlib/frozen/test_finder.py b/Lib/test/test_importlib/frozen/test_finder.py index 7d43fb0ff3e11e..23d1bf7fb77734 100644 --- a/Lib/test/test_importlib/frozen/test_finder.py +++ b/Lib/test/test_importlib/frozen/test_finder.py @@ -1,13 +1,15 @@ from .. import abc -import os.path from .. import util machinery = util.import_importlib('importlib.machinery') +import _imp +import marshal +import os.path import unittest import warnings -from test.support import import_helper +from test.support import import_helper, REPO_ROOT class FindSpecTests(abc.FinderTests): @@ -19,39 +21,67 @@ def find(self, name, **kwargs): with import_helper.frozen_modules(): return finder.find_spec(name, **kwargs) - def check(self, spec, name): + def check_basic(self, spec, name, ispkg=False): self.assertEqual(spec.name, name) self.assertIs(spec.loader, self.machinery.FrozenImporter) self.assertEqual(spec.origin, 'frozen') self.assertFalse(spec.has_location) + if ispkg: + self.assertIsNotNone(spec.submodule_search_locations) + else: + self.assertIsNone(spec.submodule_search_locations) + self.assertIsNotNone(spec.loader_state) + + def check_search_location(self, spec, source=None): + # Frozen packages do not have any path entries. + # (See https://bugs.python.org/issue21736.) + expected = [] + self.assertListEqual(spec.submodule_search_locations, expected) + + def check_data(self, spec, source=None, ispkg=None): + with import_helper.frozen_modules(): + expected = _imp.get_frozen_object(spec.name) + data = spec.loader_state + # We can't compare the marshaled data directly because + # marshal.dumps() would mark "expected" as a ref, which slightly + # changes the output. (See https://bugs.python.org/issue34093.) + code = marshal.loads(data) + self.assertEqual(code, expected) def test_module(self): - names = [ - '__hello__', - '__hello_alias__', - '__hello_only__', - '__phello__.__init__', - '__phello__.spam', - '__phello__.ham.__init__', - '__phello__.ham.eggs', - ] - for name in names: + modules = { + '__hello__': None, + '__phello__.__init__': None, + '__phello__.spam': None, + '__phello__.ham.__init__': None, + '__phello__.ham.eggs': None, + '__hello_alias__': '__hello__', + } + for name, source in modules.items(): with self.subTest(name): spec = self.find(name) - self.check(spec, name) - self.assertEqual(spec.submodule_search_locations, None) + self.check_basic(spec, name) + self.check_data(spec, source) def test_package(self): - names = [ - '__phello__', - '__phello__.ham', - '__phello_alias__', - ] - for name in names: + modules = { + '__phello__': None, + '__phello__.ham': None, + '__phello_alias__': '__hello__', + } + for name, source in modules.items(): with self.subTest(name): spec = self.find(name) - self.check(spec, name) - self.assertEqual(spec.submodule_search_locations, []) + self.check_basic(spec, name, ispkg=True) + self.check_search_location(spec, source) + self.check_data(spec, source, ispkg=True) + + def test_frozen_only(self): + name = '__hello_only__' + source = os.path.join(REPO_ROOT, 'Tools', 'freeze', 'flag.py') + spec = self.find(name) + self.check_basic(spec, name) + self.check_data(spec, source) # These are covered by test_module() and test_package(). test_module_in_package = None diff --git a/Lib/test/test_importlib/frozen/test_loader.py b/Lib/test/test_importlib/frozen/test_loader.py index cfa5e5bb31bea9..992dcef05bcb19 100644 --- a/Lib/test/test_importlib/frozen/test_loader.py +++ b/Lib/test/test_importlib/frozen/test_loader.py @@ -4,7 +4,9 @@ machinery = util.import_importlib('importlib.machinery') from test.support import captured_stdout, import_helper +import _imp import contextlib +import marshal import types import unittest import warnings @@ -33,11 +35,14 @@ class ExecModuleTests(abc.LoaderTests): def exec_module(self, name): with import_helper.frozen_modules(): is_package = self.machinery.FrozenImporter.is_package(name) + code = _imp.get_frozen_object(name) + data = marshal.dumps(code) spec = self.machinery.ModuleSpec( name, self.machinery.FrozenImporter, origin='frozen', is_package=is_package, + loader_state=data, ) module = types.ModuleType(name) module.__spec__ = spec @@ -61,6 +66,7 @@ def test_module(self): self.assertEqual(getattr(module, attr), value) self.assertEqual(output, 'Hello world!\n') self.assertTrue(hasattr(module, '__spec__')) + self.assertIsNone(module.__spec__.loader_state) def test_package(self): name = '__phello__' @@ -73,6 +79,7 @@ def test_package(self): name=name, attr=attr, given=attr_value, expected=value)) self.assertEqual(output, 'Hello world!\n') + self.assertIsNone(module.__spec__.loader_state) def test_lacking_parent(self): name = '__phello__.spam' diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-29-12-02-39.bpo-45324.BTQElX.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-29-12-02-39.bpo-45324.BTQElX.rst new file mode 100644 index 00000000000000..7b16847bb73397 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-09-29-12-02-39.bpo-45324.BTQElX.rst @@ -0,0 +1,3 @@ +In FrozenImporter.find_spec(), we now preserve the information needed in +exec_module() to load the module. This change mostly impacts internal +details, rather than changing the importer's behavior. diff --git a/Python/clinic/import.c.h b/Python/clinic/import.c.h index 438a348fa097fb..09738834195c77 100644 --- a/Python/clinic/import.c.h +++ b/Python/clinic/import.c.h @@ -169,33 +169,80 @@ _imp_init_frozen(PyObject *module, PyObject *arg) return return_value; } -PyDoc_STRVAR(_imp_get_frozen_object__doc__, -"get_frozen_object($module, name, /)\n" +PyDoc_STRVAR(_imp_find_frozen__doc__, +"find_frozen($module, name, /)\n" "--\n" "\n" -"Create a code object for a frozen module."); +"Return info about the corresponding frozen module (if there is one) or None.\n" +"\n" +"The returned info (a 2-tuple):\n" +"\n" +" * data the raw marshalled bytes\n" +" * is_package whether or not it is a package"); -#define _IMP_GET_FROZEN_OBJECT_METHODDEF \ - {"get_frozen_object", (PyCFunction)_imp_get_frozen_object, METH_O, _imp_get_frozen_object__doc__}, +#define _IMP_FIND_FROZEN_METHODDEF \ + {"find_frozen", (PyCFunction)_imp_find_frozen, METH_O, _imp_find_frozen__doc__}, static PyObject * -_imp_get_frozen_object_impl(PyObject *module, PyObject *name); +_imp_find_frozen_impl(PyObject *module, PyObject *name); static PyObject * -_imp_get_frozen_object(PyObject *module, PyObject *arg) +_imp_find_frozen(PyObject *module, PyObject *arg) { PyObject *return_value = NULL; PyObject *name; if (!PyUnicode_Check(arg)) { - _PyArg_BadArgument("get_frozen_object", "argument", "str", arg); + _PyArg_BadArgument("find_frozen", "argument", "str", arg); goto exit; } if (PyUnicode_READY(arg) == -1) { goto exit; } name = arg; - return_value = _imp_get_frozen_object_impl(module, name); + return_value = _imp_find_frozen_impl(module, name); + +exit: + return return_value; +} + +PyDoc_STRVAR(_imp_get_frozen_object__doc__, +"get_frozen_object($module, name, data=None, /)\n" +"--\n" +"\n" +"Create a code object for a frozen module."); + +#define _IMP_GET_FROZEN_OBJECT_METHODDEF \ + {"get_frozen_object", (PyCFunction)(void(*)(void))_imp_get_frozen_object, METH_FASTCALL, _imp_get_frozen_object__doc__}, + +static PyObject * +_imp_get_frozen_object_impl(PyObject *module, PyObject *name, + PyObject *dataobj); + +static PyObject * +_imp_get_frozen_object(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *name; + PyObject *dataobj = Py_None; + + if (!_PyArg_CheckPositional("get_frozen_object", nargs, 1, 2)) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("get_frozen_object", "argument 1", "str", args[0]); + goto exit; + } + if (PyUnicode_READY(args[0]) == -1) { + goto exit; + } + name = args[0]; + if (nargs < 2) { + goto skip_optional; + } + dataobj = args[1]; +skip_optional: + return_value = _imp_get_frozen_object_impl(module, name, dataobj); exit: return return_value; @@ -498,4 +545,4 @@ _imp_source_hash(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb #ifndef _IMP_EXEC_DYNAMIC_METHODDEF #define _IMP_EXEC_DYNAMIC_METHODDEF #endif /* !defined(_IMP_EXEC_DYNAMIC_METHODDEF) */ -/*[clinic end generated code: output=96038c277119d6e3 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a31e1c00653359ff input=a9049054013a1b77]*/ diff --git a/Python/import.c b/Python/import.c index d7f126784192b5..22cefdf08b48f5 100644 --- a/Python/import.c +++ b/Python/import.c @@ -887,10 +887,6 @@ _imp__fix_co_filename_impl(PyObject *module, PyCodeObject *code, } -/* Forward */ -static const struct _frozen * find_frozen(PyObject *); - - /* Helper to test for built-in module */ static int @@ -1119,75 +1115,125 @@ list_frozen_module_names() return names; } -static const struct _frozen * -find_frozen(PyObject *modname) +typedef enum { + FROZEN_OKAY, + FROZEN_BAD_NAME, // The given module name wasn't valid. + FROZEN_NOT_FOUND, // It wasn't in PyImport_FrozenModules. + FROZEN_DISABLED, // -X frozen_modules=off (and not essential) + FROZEN_EXCLUDED, // The PyImport_FrozenModules entry has NULL "code". + FROZEN_INVALID, // The PyImport_FrozenModules entry is bogus. +} frozen_status; + +static inline void +set_frozen_error(frozen_status status, PyObject *modname) +{ + const char *err = NULL; + switch (status) { + case FROZEN_BAD_NAME: + case FROZEN_NOT_FOUND: + case FROZEN_DISABLED: + err = "No such frozen object named %R"; + break; + case FROZEN_EXCLUDED: + err = "Excluded frozen object named %R"; + break; + case FROZEN_INVALID: + err = "Frozen object named %R is invalid"; + break; + case FROZEN_OKAY: + // There was no error. + break; + default: + Py_UNREACHABLE(); + } + if (err != NULL) { + PyObject *msg = PyUnicode_FromFormat(err, modname); + if (msg == NULL) { + PyErr_Clear(); + } + PyErr_SetImportError(msg, modname, NULL); + Py_XDECREF(msg); + } +} + +struct frozen_info { + PyObject *nameobj; + const char *data; + Py_ssize_t size; + bool is_package; +}; + +static frozen_status +find_frozen(PyObject *nameobj, struct frozen_info *info) { - if (modname == NULL) { - return NULL; + if (info != NULL) { + info->nameobj = NULL; + info->data = NULL; + info->size = 0; + info->is_package = false; + } + + if (nameobj == NULL || nameobj == Py_None) { + return FROZEN_BAD_NAME; } - const char *name = PyUnicode_AsUTF8(modname); + const char *name = PyUnicode_AsUTF8(nameobj); if (name == NULL) { + // Note that this function previously used + // _PyUnicode_EqualToASCIIString(). We clear the error here + // (instead of propagating it) to match the earlier behavior + // more closely. PyErr_Clear(); - return NULL; + return FROZEN_BAD_NAME; } + if (!use_frozen() && !is_essential_frozen_module(name)) { - return NULL; + return FROZEN_DISABLED; } + const struct _frozen *p; for (p = PyImport_FrozenModules; ; p++) { if (p->name == NULL) { - return NULL; + // We hit the end-of-list sentinel value. + return FROZEN_NOT_FOUND; } if (strcmp(name, p->name) == 0) { break; } } - return p; -} - -static PyObject * -get_frozen_object(PyObject *name) -{ - const struct _frozen *p = find_frozen(name); - int size; - - if (p == NULL) { - PyErr_Format(PyExc_ImportError, - "No such frozen object named %R", - name); - return NULL; + if (info != NULL) { + info->nameobj = nameobj; // borrowed + info->data = (const char *)p->code; + info->size = p->size < 0 ? -(p->size) : p->size; + info->is_package = p->size < 0 ? true : false; } + if (p->code == NULL) { - PyErr_Format(PyExc_ImportError, - "Excluded frozen object named %R", - name); - return NULL; + /* It is frozen but marked as un-importable. */ + return FROZEN_EXCLUDED; } - size = p->size; - if (size < 0) - size = -size; - return PyMarshal_ReadObjectFromString((const char *)p->code, size); + if (p->code[0] == '\0' || p->size == 0) { + return FROZEN_INVALID; + } + return FROZEN_OKAY; } static PyObject * -is_frozen_package(PyObject *name) +unmarshal_frozen_code(struct frozen_info *info) { - const struct _frozen *p = find_frozen(name); - int size; - - if (p == NULL) { - PyErr_Format(PyExc_ImportError, - "No such frozen object named %R", - name); + PyObject *co = PyMarshal_ReadObjectFromString(info->data, info->size); + if (co == NULL) { + set_frozen_error(FROZEN_INVALID, info->nameobj); return NULL; } - - size = p->size; - - if (size < 0) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; + if (!PyCode_Check(co)) { + // We stick with TypeError for backward compatibility. + PyErr_Format(PyExc_TypeError, + "frozen object %R is not a code object", + info->nameobj); + Py_DECREF(co); + return NULL; + } + return co; } @@ -1200,35 +1246,25 @@ int PyImport_ImportFrozenModuleObject(PyObject *name) { PyThreadState *tstate = _PyThreadState_GET(); - const struct _frozen *p; PyObject *co, *m, *d; - int ispackage; - int size; - - p = find_frozen(name); - if (p == NULL) + struct frozen_info info; + frozen_status status = find_frozen(name, &info); + if (status == FROZEN_NOT_FOUND || status == FROZEN_DISABLED) { return 0; - if (p->code == NULL) { - _PyErr_Format(tstate, PyExc_ImportError, - "Excluded frozen object named %R", - name); + } + else if (status == FROZEN_BAD_NAME) { + return 0; + } + else if (status != FROZEN_OKAY) { + set_frozen_error(status, name); return -1; } - size = p->size; - ispackage = (size < 0); - if (ispackage) - size = -size; - co = PyMarshal_ReadObjectFromString((const char *)p->code, size); - if (co == NULL) + co = unmarshal_frozen_code(&info); + if (co == NULL) { return -1; - if (!PyCode_Check(co)) { - _PyErr_Format(tstate, PyExc_TypeError, - "frozen object %R is not a code object", - name); - goto err_return; } - if (ispackage) { + if (info.is_package) { /* Set __path__ to the empty list */ PyObject *l; int err; @@ -1966,20 +2002,83 @@ _imp_init_frozen_impl(PyObject *module, PyObject *name) return import_add_module(tstate, name); } +/*[clinic input] +_imp.find_frozen + + name: unicode + / + +Return info about the corresponding frozen module (if there is one) or None. + +The returned info (a 2-tuple): + + * data the raw marshalled bytes + * is_package whether or not it is a package +[clinic start generated code]*/ + +static PyObject * +_imp_find_frozen_impl(PyObject *module, PyObject *name) +/*[clinic end generated code: output=3fd17da90d417e4e input=4e52b3ac95f6d7ab]*/ +{ + struct frozen_info info; + frozen_status status = find_frozen(name, &info); + if (status == FROZEN_NOT_FOUND || status == FROZEN_DISABLED) { + Py_RETURN_NONE; + } + else if (status == FROZEN_BAD_NAME) { + Py_RETURN_NONE; + } + else if (status != FROZEN_OKAY) { + set_frozen_error(status, name); + return NULL; + } + PyObject *data = PyBytes_FromStringAndSize(info.data, info.size); + if (data == NULL) { + return NULL; + } + PyObject *result = PyTuple_Pack(2, data, + info.is_package ? Py_True : Py_False); + Py_DECREF(data); + return result; +} + /*[clinic input] _imp.get_frozen_object name: unicode + data as dataobj: object = None / Create a code object for a frozen module. [clinic start generated code]*/ static PyObject * -_imp_get_frozen_object_impl(PyObject *module, PyObject *name) -/*[clinic end generated code: output=2568cc5b7aa0da63 input=ed689bc05358fdbd]*/ -{ - return get_frozen_object(name); +_imp_get_frozen_object_impl(PyObject *module, PyObject *name, + PyObject *dataobj) +/*[clinic end generated code: output=54368a673a35e745 input=034bdb88f6460b7b]*/ +{ + struct frozen_info info; + if (PyBytes_Check(dataobj)) { + info.nameobj = name; + info.data = PyBytes_AS_STRING(dataobj); + info.size = PyBytes_Size(dataobj); + if (info.size == 0) { + set_frozen_error(FROZEN_INVALID, name); + return NULL; + } + } + else if (dataobj != Py_None) { + _PyArg_BadArgument("get_frozen_object", "argument 2", "bytes", dataobj); + return NULL; + } + else { + frozen_status status = find_frozen(name, &info); + if (status != FROZEN_OKAY) { + set_frozen_error(status, name); + return NULL; + } + } + return unmarshal_frozen_code(&info); } /*[clinic input] @@ -1995,7 +2094,13 @@ static PyObject * _imp_is_frozen_package_impl(PyObject *module, PyObject *name) /*[clinic end generated code: output=e70cbdb45784a1c9 input=81b6cdecd080fbb8]*/ { - return is_frozen_package(name); + struct frozen_info info; + frozen_status status = find_frozen(name, &info); + if (status != FROZEN_OKAY && status != FROZEN_EXCLUDED) { + set_frozen_error(status, name); + return NULL; + } + return PyBool_FromLong(info.is_package); } /*[clinic input] @@ -2027,10 +2132,12 @@ static PyObject * _imp_is_frozen_impl(PyObject *module, PyObject *name) /*[clinic end generated code: output=01f408f5ec0f2577 input=7301dbca1897d66b]*/ { - const struct _frozen *p; - - p = find_frozen(name); - return PyBool_FromLong((long) (p == NULL ? 0 : p->size)); + struct frozen_info info; + frozen_status status = find_frozen(name, &info); + if (status != FROZEN_OKAY) { + Py_RETURN_FALSE; + } + Py_RETURN_TRUE; } /*[clinic input] @@ -2221,6 +2328,7 @@ static PyMethodDef imp_methods[] = { _IMP_LOCK_HELD_METHODDEF _IMP_ACQUIRE_LOCK_METHODDEF _IMP_RELEASE_LOCK_METHODDEF + _IMP_FIND_FROZEN_METHODDEF _IMP_GET_FROZEN_OBJECT_METHODDEF _IMP_IS_FROZEN_PACKAGE_METHODDEF _IMP_CREATE_BUILTIN_METHODDEF From 69f6dabb9c469f308650b820287e4cb0eac7e655 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 5 Oct 2021 10:37:14 -0600 Subject: [PATCH 073/263] Rearrage the finder tests. (gh-28740) This makes the tests a bit cleaner and makes adding more tests a little simpler. https://bugs.python.org/issue45324 --- Lib/test/test_importlib/frozen/test_finder.py | 86 ++++++++++++------- 1 file changed, 56 insertions(+), 30 deletions(-) diff --git a/Lib/test/test_importlib/frozen/test_finder.py b/Lib/test/test_importlib/frozen/test_finder.py index 23d1bf7fb77734..0b15aeb598dd9c 100644 --- a/Lib/test/test_importlib/frozen/test_finder.py +++ b/Lib/test/test_importlib/frozen/test_finder.py @@ -32,13 +32,7 @@ def check_basic(self, spec, name, ispkg=False): self.assertIsNone(spec.submodule_search_locations) self.assertIsNotNone(spec.loader_state) - def check_search_location(self, spec, source=None): - # Frozen packages do not have any path entries. - # (See https://bugs.python.org/issue21736.) - expected = [] - self.assertListEqual(spec.submodule_search_locations, expected) - - def check_data(self, spec, source=None, ispkg=None): + def check_data(self, spec): with import_helper.frozen_modules(): expected = _imp.get_frozen_object(spec.name) data = spec.loader_state @@ -48,40 +42,72 @@ def check_data(self, spec, source=None, ispkg=None): code = marshal.loads(data) self.assertEqual(code, expected) + def check_search_locations(self, spec): + # Frozen packages do not have any path entries. + # (See https://bugs.python.org/issue21736.) + expected = [] + self.assertListEqual(spec.submodule_search_locations, expected) + def test_module(self): + modules = [ + '__hello__', + '__phello__.spam', + '__phello__.ham.eggs', + ] + for name in modules: + with self.subTest(f'{name} -> {name}'): + spec = self.find(name) + self.check_basic(spec, name) + self.check_data(spec) modules = { - '__hello__': None, - '__phello__.__init__': None, - '__phello__.spam': None, - '__phello__.ham.__init__': None, - '__phello__.ham.eggs': None, '__hello_alias__': '__hello__', - } - for name, source in modules.items(): - with self.subTest(name): + '_frozen_importlib': 'importlib._bootstrap', + } + for name, origname in modules.items(): + with self.subTest(f'{name} -> {origname}'): + spec = self.find(name) + self.check_basic(spec, name) + self.check_data(spec) + modules = [ + '__phello__.__init__', + '__phello__.ham.__init__', + ] + for name in modules: + origname = name.rpartition('.')[0] + with self.subTest(f'{name} -> {origname}'): spec = self.find(name) self.check_basic(spec, name) - self.check_data(spec, source) + self.check_data(spec) + modules = { + '__hello_only__': ('Tools', 'freeze', 'flag.py'), + } + for name, path in modules.items(): + filename = os.path.join(REPO_ROOT, *path) + with self.subTest(f'{name} -> {filename}'): + spec = self.find(name) + self.check_basic(spec, name) + self.check_data(spec) def test_package(self): - modules = { - '__phello__': None, - '__phello__.ham': None, + packages = [ + '__phello__', + '__phello__.ham', + ] + for name in packages: + with self.subTest(f'{name} -> {name}'): + spec = self.find(name) + self.check_basic(spec, name, ispkg=True) + self.check_data(spec) + self.check_search_locations(spec) + packages = { '__phello_alias__': '__hello__', } - for name, source in modules.items(): - with self.subTest(name): + for name, origname in packages.items(): + with self.subTest(f'{name} -> {origname}'): spec = self.find(name) self.check_basic(spec, name, ispkg=True) - self.check_search_location(spec, source) - self.check_data(spec, source, ispkg=True) - - def test_frozen_only(self): - name = '__hello_only__' - source = os.path.join(REPO_ROOT, 'Tools', 'freeze', 'flag.py') - spec = self.find(name) - self.check_basic(spec, name) - self.check_data(spec, source) + self.check_data(spec) + self.check_search_locations(spec) # These are covered by test_module() and test_package(). test_module_in_package = None From 4103280b83e1419bef535a42813d6dbe83bfe880 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Tue, 5 Oct 2021 13:53:35 -0300 Subject: [PATCH 074/263] [doc] Fix gethostbyname_ex description (GH-28700) It seems part of `gethostbyname_ex` doc was copied from `gethostbyaddr`. The latter has an `ip_address` parameter whereas the former doesn't. --- Doc/library/socket.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 397ba54733ca8c..27ad5c7fd1d91f 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -827,8 +827,8 @@ The :mod:`socket` module also offers various network-related services: .. function:: gethostbyname_ex(hostname) Translate a host name to IPv4 address format, extended interface. Return a - triple ``(hostname, aliaslist, ipaddrlist)`` where *hostname* is the primary - host name responding to the given *ip_address*, *aliaslist* is a (possibly + triple ``(hostname, aliaslist, ipaddrlist)`` where *hostname* is the host's + primary host name, *aliaslist* is a (possibly empty) list of alternative host names for the same address, and *ipaddrlist* is a list of IPv4 addresses for the same interface on the same host (often but not always a single address). :func:`gethostbyname_ex` does not support IPv6 name From 444429142c88b7e22117a6e14c95d1fbdd638c60 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 5 Oct 2021 18:08:06 +0100 Subject: [PATCH 075/263] Post 3.11.0a1 --- Include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 28a081d0afa312..591b41736f338e 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.11.0a1" +#define PY_VERSION "3.11.0a1+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. From 08285d563e64c179a56ab2f952345b3dbcdb54f3 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 5 Oct 2021 11:26:37 -0600 Subject: [PATCH 076/263] bpo-45020: Identify which frozen modules are actually aliases. (gh-28655) In the list of generated frozen modules at the top of Tools/scripts/freeze_modules.py, you will find that some of the modules have a different name than the module (or .py file) that is actually frozen. Let's call each case an "alias". Aliases do not come into play until we get to the (generated) list of modules in Python/frozen.c. (The tool for freezing modules, Programs/_freeze_module, is only concerned with the source file, not the module it will be used for.) Knowledge of which frozen modules are aliases (and the identity of the original module) normally isn't important. However, this information is valuable when we go to set __file__ on frozen stdlib modules. This change updates Tools/scripts/freeze_modules.py to map aliases to the original module name (or None if not a stdlib module) in Python/frozen.c. We also add a helper function in Python/import.c to look up a frozen module's alias and add the result of that function to the frozen info returned from find_frozen(). https://bugs.python.org/issue45020 --- Include/internal/pycore_import.h | 7 ++ Lib/importlib/_bootstrap.py | 33 +++++++- Lib/test/test_importlib/frozen/test_finder.py | 52 +++++++++--- Lib/test/test_importlib/frozen/test_loader.py | 14 ++-- .../2021-10-01-09-06-54.bpo-45020.Cj5VQN.rst | 5 ++ Programs/_freeze_module.c | 6 ++ Python/clinic/import.c.h | 7 +- Python/frozen.c | 18 ++++- Python/import.c | 81 ++++++++++++++++--- Tools/scripts/freeze_modules.py | 39 ++++++++- 10 files changed, 225 insertions(+), 37 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-10-01-09-06-54.bpo-45020.Cj5VQN.rst diff --git a/Include/internal/pycore_import.h b/Include/internal/pycore_import.h index e21ed0a7a06a2a..6439b7369fb593 100644 --- a/Include/internal/pycore_import.h +++ b/Include/internal/pycore_import.h @@ -10,6 +10,13 @@ extern PyStatus _PyImport_ReInitLock(void); #endif extern PyObject* _PyImport_BootstrapImp(PyThreadState *tstate); +struct _module_alias { + const char *name; /* ASCII encoded string */ + const char *orig; /* ASCII encoded string */ +}; + +extern const struct _module_alias * _PyImport_FrozenAliases; + #ifdef __cplusplus } #endif diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 5807577c74bce1..49f08814e95186 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -824,16 +824,39 @@ def module_repr(m): "slated for removal in Python 3.12", DeprecationWarning) return ''.format(m.__name__, FrozenImporter._ORIGIN) + @classmethod + def _setup_module(cls, module): + assert not hasattr(module, '__file__'), module.__file__ + ispkg = hasattr(module, '__path__') + assert not ispkg or not module.__path__, module.__path__ + spec = module.__spec__ + assert not ispkg or not spec.submodule_search_locations + + if spec.loader_state is None: + spec.loader_state = type(sys.implementation)( + data=None, + origname=None, + ) + elif not hasattr(spec.loader_state, 'data'): + spec.loader_state.data = None + if not getattr(spec.loader_state, 'origname', None): + origname = vars(module).pop('__origname__', None) + assert origname, 'see PyImport_ImportFrozenModuleObject()' + spec.loader_state.origname = origname + @classmethod def find_spec(cls, fullname, path=None, target=None): info = _call_with_frames_removed(_imp.find_frozen, fullname) if info is None: return None - data, ispkg = info + data, ispkg, origname = info spec = spec_from_loader(fullname, cls, origin=cls._ORIGIN, is_package=ispkg) - spec.loader_state = data + spec.loader_state = type(sys.implementation)( + data=data, + origname=origname, + ) return spec @classmethod @@ -857,7 +880,7 @@ def exec_module(module): spec = module.__spec__ name = spec.name try: - data = spec.loader_state + data = spec.loader_state.data except AttributeError: if not _imp.is_frozen(name): raise ImportError('{!r} is not a frozen module'.format(name), @@ -868,7 +891,7 @@ def exec_module(module): # Note that if this method is called again (e.g. by # importlib.reload()) then _imp.get_frozen_object() will notice # no data was provided and will look it up. - spec.loader_state = None + spec.loader_state.data = None code = _call_with_frames_removed(_imp.get_frozen_object, name, data) exec(code, module.__dict__) @@ -1220,6 +1243,8 @@ def _setup(sys_module, _imp_module): continue spec = _spec_from_module(module, loader) _init_module_attrs(spec, module) + if loader is FrozenImporter: + loader._setup_module(module) # Directly load built-in modules needed during bootstrap. self_module = sys.modules[__name__] diff --git a/Lib/test/test_importlib/frozen/test_finder.py b/Lib/test/test_importlib/frozen/test_finder.py index 0b15aeb598dd9c..cd5586d524ce2c 100644 --- a/Lib/test/test_importlib/frozen/test_finder.py +++ b/Lib/test/test_importlib/frozen/test_finder.py @@ -9,7 +9,15 @@ import unittest import warnings -from test.support import import_helper, REPO_ROOT +from test.support import import_helper, REPO_ROOT, STDLIB_DIR + + +def resolve_stdlib_file(name, ispkg=False): + assert name + if ispkg: + return os.path.join(STDLIB_DIR, *name.split('.'), '__init__.py') + else: + return os.path.join(STDLIB_DIR, *name.split('.')) + '.py' class FindSpecTests(abc.FinderTests): @@ -32,16 +40,30 @@ def check_basic(self, spec, name, ispkg=False): self.assertIsNone(spec.submodule_search_locations) self.assertIsNotNone(spec.loader_state) - def check_data(self, spec): + def check_loader_state(self, spec, origname=None, filename=None): + if not filename: + if not origname: + origname = spec.name + + actual = dict(vars(spec.loader_state)) + + # Check the code object used to import the frozen module. + # We can't compare the marshaled data directly because + # marshal.dumps() would mark "expected" (below) as a ref, + # which slightly changes the output. + # (See https://bugs.python.org/issue34093.) + data = actual.pop('data') with import_helper.frozen_modules(): expected = _imp.get_frozen_object(spec.name) - data = spec.loader_state - # We can't compare the marshaled data directly because - # marshal.dumps() would mark "expected" as a ref, which slightly - # changes the output. (See https://bugs.python.org/issue34093.) code = marshal.loads(data) self.assertEqual(code, expected) + # Check the rest of spec.loader_state. + expected = dict( + origname=origname, + ) + self.assertDictEqual(actual, expected) + def check_search_locations(self, spec): # Frozen packages do not have any path entries. # (See https://bugs.python.org/issue21736.) @@ -58,7 +80,7 @@ def test_module(self): with self.subTest(f'{name} -> {name}'): spec = self.find(name) self.check_basic(spec, name) - self.check_data(spec) + self.check_loader_state(spec) modules = { '__hello_alias__': '__hello__', '_frozen_importlib': 'importlib._bootstrap', @@ -67,26 +89,28 @@ def test_module(self): with self.subTest(f'{name} -> {origname}'): spec = self.find(name) self.check_basic(spec, name) - self.check_data(spec) + self.check_loader_state(spec, origname) modules = [ '__phello__.__init__', '__phello__.ham.__init__', ] for name in modules: - origname = name.rpartition('.')[0] + origname = '<' + name.rpartition('.')[0] + filename = resolve_stdlib_file(name) with self.subTest(f'{name} -> {origname}'): spec = self.find(name) self.check_basic(spec, name) - self.check_data(spec) + self.check_loader_state(spec, origname, filename) modules = { '__hello_only__': ('Tools', 'freeze', 'flag.py'), } for name, path in modules.items(): + origname = None filename = os.path.join(REPO_ROOT, *path) with self.subTest(f'{name} -> {filename}'): spec = self.find(name) self.check_basic(spec, name) - self.check_data(spec) + self.check_loader_state(spec, origname, filename) def test_package(self): packages = [ @@ -94,19 +118,21 @@ def test_package(self): '__phello__.ham', ] for name in packages: + filename = resolve_stdlib_file(name, ispkg=True) with self.subTest(f'{name} -> {name}'): spec = self.find(name) self.check_basic(spec, name, ispkg=True) - self.check_data(spec) + self.check_loader_state(spec, name, filename) self.check_search_locations(spec) packages = { '__phello_alias__': '__hello__', } for name, origname in packages.items(): + filename = resolve_stdlib_file(origname, ispkg=False) with self.subTest(f'{name} -> {origname}'): spec = self.find(name) self.check_basic(spec, name, ispkg=True) - self.check_data(spec) + self.check_loader_state(spec, origname, filename) self.check_search_locations(spec) # These are covered by test_module() and test_package(). diff --git a/Lib/test/test_importlib/frozen/test_loader.py b/Lib/test/test_importlib/frozen/test_loader.py index 992dcef05bcb19..d6f39fa98a6f1b 100644 --- a/Lib/test/test_importlib/frozen/test_loader.py +++ b/Lib/test/test_importlib/frozen/test_loader.py @@ -32,17 +32,19 @@ def fresh(name, *, oldapi=False): class ExecModuleTests(abc.LoaderTests): - def exec_module(self, name): + def exec_module(self, name, origname=None): with import_helper.frozen_modules(): is_package = self.machinery.FrozenImporter.is_package(name) code = _imp.get_frozen_object(name) - data = marshal.dumps(code) spec = self.machinery.ModuleSpec( name, self.machinery.FrozenImporter, origin='frozen', is_package=is_package, - loader_state=data, + loader_state=types.SimpleNamespace( + data=marshal.dumps(code), + origname=origname or name, + ), ) module = types.ModuleType(name) module.__spec__ = spec @@ -66,7 +68,8 @@ def test_module(self): self.assertEqual(getattr(module, attr), value) self.assertEqual(output, 'Hello world!\n') self.assertTrue(hasattr(module, '__spec__')) - self.assertIsNone(module.__spec__.loader_state) + self.assertIsNone(module.__spec__.loader_state.data) + self.assertEqual(module.__spec__.loader_state.origname, name) def test_package(self): name = '__phello__' @@ -79,7 +82,8 @@ def test_package(self): name=name, attr=attr, given=attr_value, expected=value)) self.assertEqual(output, 'Hello world!\n') - self.assertIsNone(module.__spec__.loader_state) + self.assertIsNone(module.__spec__.loader_state.data) + self.assertEqual(module.__spec__.loader_state.origname, name) def test_lacking_parent(self): name = '__phello__.spam' diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-10-01-09-06-54.bpo-45020.Cj5VQN.rst b/Misc/NEWS.d/next/Core and Builtins/2021-10-01-09-06-54.bpo-45020.Cj5VQN.rst new file mode 100644 index 00000000000000..839604357d1214 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-10-01-09-06-54.bpo-45020.Cj5VQN.rst @@ -0,0 +1,5 @@ +For frozen stdlib modules, record the original module name as +``module.__spec__.loader_state.origname``. If the value is different than +``module.__spec__.name`` then the module was defined as an alias in +Tools/scripts/freeze_modules.py. If it is ``None`` then the module comes +from a source file outside the stdlib. diff --git a/Programs/_freeze_module.c b/Programs/_freeze_module.c index 4b0633e7e7a3d8..dd90d92e512c09 100644 --- a/Programs/_freeze_module.c +++ b/Programs/_freeze_module.c @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -24,8 +25,12 @@ static const struct _frozen _PyImport_FrozenModules[] = { {0, 0, 0} /* sentinel */ }; +static const struct _module_alias aliases[] = { + {0, 0} /* sentinel */ +}; const struct _frozen *PyImport_FrozenModules; +const struct _module_alias *_PyImport_FrozenAliases; static const char header[] = "/* Auto-generated by Programs/_freeze_module.c */"; @@ -183,6 +188,7 @@ main(int argc, char *argv[]) const char *name, *inpath, *outpath; PyImport_FrozenModules = _PyImport_FrozenModules; + _PyImport_FrozenAliases = aliases; if (argc != 4) { fprintf(stderr, "need to specify the name, input and output paths\n"); diff --git a/Python/clinic/import.c.h b/Python/clinic/import.c.h index 09738834195c77..dfb59de3b5ce80 100644 --- a/Python/clinic/import.c.h +++ b/Python/clinic/import.c.h @@ -178,7 +178,10 @@ PyDoc_STRVAR(_imp_find_frozen__doc__, "The returned info (a 2-tuple):\n" "\n" " * data the raw marshalled bytes\n" -" * is_package whether or not it is a package"); +" * is_package whether or not it is a package\n" +" * origname the originally frozen module\'s name, or None if not\n" +" a stdlib module (this will usually be the same as\n" +" the module\'s current name)"); #define _IMP_FIND_FROZEN_METHODDEF \ {"find_frozen", (PyCFunction)_imp_find_frozen, METH_O, _imp_find_frozen__doc__}, @@ -545,4 +548,4 @@ _imp_source_hash(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb #ifndef _IMP_EXEC_DYNAMIC_METHODDEF #define _IMP_EXEC_DYNAMIC_METHODDEF #endif /* !defined(_IMP_EXEC_DYNAMIC_METHODDEF) */ -/*[clinic end generated code: output=a31e1c00653359ff input=a9049054013a1b77]*/ +/*[clinic end generated code: output=8c8dd08158f9ac7c input=a9049054013a1b77]*/ diff --git a/Python/frozen.c b/Python/frozen.c index b4f7121fda35f3..499b3b99570573 100644 --- a/Python/frozen.c +++ b/Python/frozen.c @@ -36,6 +36,7 @@ and __phello__.spam. Loading any will print some famous words... */ #include "Python.h" +#include "pycore_import.h" /* Includes for frozen modules: */ #include "frozen_modules/importlib._bootstrap.h" @@ -102,9 +103,24 @@ static const struct _frozen _PyImport_FrozenModules[] = { {"__phello__.spam", _Py_M____phello___spam, (int)sizeof(_Py_M____phello___spam)}, {"__hello_only__", _Py_M__frozen_only, (int)sizeof(_Py_M__frozen_only)}, - {0, 0, 0} /* sentinel */ + {0, 0, 0} /* modules sentinel */ }; +static const struct _module_alias aliases[] = { + {"_frozen_importlib", "importlib._bootstrap"}, + {"_frozen_importlib_external", "importlib._bootstrap_external"}, + {"os.path", "posixpath"}, + {"__hello_alias__", "__hello__"}, + {"__phello_alias__", "__hello__"}, + {"__phello_alias__.spam", "__hello__"}, + {"__phello__.__init__", "<__phello__"}, + {"__phello__.ham.__init__", "<__phello__.ham"}, + {"__hello_only__", NULL}, + {0, 0} /* aliases sentinel */ +}; +const struct _module_alias *_PyImport_FrozenAliases = aliases; + + /* Embedding apps may change this pointer to point to their favorite collection of frozen modules: */ diff --git a/Python/import.c b/Python/import.c index 22cefdf08b48f5..a6170a39c7fdbd 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1046,6 +1046,29 @@ _imp_create_builtin(PyObject *module, PyObject *spec) } +/* Return true if the name is an alias. In that case, "alias" is set + to the original module name. If it is an alias but the original + module isn't known then "alias" is set to NULL while true is returned. */ +static bool +resolve_module_alias(const char *name, const struct _module_alias *aliases, + const char **alias) +{ + const struct _module_alias *entry; + for (entry = aliases; ; entry++) { + if (entry->name == NULL) { + /* It isn't an alias. */ + return false; + } + if (strcmp(name, entry->name) == 0) { + if (alias != NULL) { + *alias = entry->orig; + } + return true; + } + } +} + + /* Frozen modules */ static bool @@ -1161,16 +1184,15 @@ struct frozen_info { const char *data; Py_ssize_t size; bool is_package; + bool is_alias; + const char *origname; }; static frozen_status find_frozen(PyObject *nameobj, struct frozen_info *info) { if (info != NULL) { - info->nameobj = NULL; - info->data = NULL; - info->size = 0; - info->is_package = false; + memset(info, 0, sizeof(*info)); } if (nameobj == NULL || nameobj == Py_None) { @@ -1205,6 +1227,9 @@ find_frozen(PyObject *nameobj, struct frozen_info *info) info->data = (const char *)p->code; info->size = p->size < 0 ? -(p->size) : p->size; info->is_package = p->size < 0 ? true : false; + info->origname = name; + info->is_alias = resolve_module_alias(name, _PyImport_FrozenAliases, + &info->origname); } if (p->code == NULL) { @@ -1246,7 +1271,8 @@ int PyImport_ImportFrozenModuleObject(PyObject *name) { PyThreadState *tstate = _PyThreadState_GET(); - PyObject *co, *m, *d; + PyObject *co, *m, *d = NULL; + int err; struct frozen_info info; frozen_status status = find_frozen(name, &info); @@ -1267,7 +1293,6 @@ PyImport_ImportFrozenModuleObject(PyObject *name) if (info.is_package) { /* Set __path__ to the empty list */ PyObject *l; - int err; m = import_add_module(tstate, name); if (m == NULL) goto err_return; @@ -1288,15 +1313,33 @@ PyImport_ImportFrozenModuleObject(PyObject *name) goto err_return; } m = exec_code_in_module(tstate, name, d, co); - Py_DECREF(d); if (m == NULL) { goto err_return; } - Py_DECREF(co); Py_DECREF(m); + /* Set __origname__ (consumed in FrozenImporter._setup_module()). */ + PyObject *origname; + if (info.origname) { + origname = PyUnicode_FromString(info.origname); + if (origname == NULL) { + goto err_return; + } + } + else { + Py_INCREF(Py_None); + origname = Py_None; + } + err = PyDict_SetItemString(d, "__origname__", origname); + Py_DECREF(origname); + if (err != 0) { + goto err_return; + } + Py_DECREF(d); + Py_DECREF(co); return 1; err_return: + Py_XDECREF(d); Py_DECREF(co); return -1; } @@ -2014,11 +2057,14 @@ The returned info (a 2-tuple): * data the raw marshalled bytes * is_package whether or not it is a package + * origname the originally frozen module's name, or None if not + a stdlib module (this will usually be the same as + the module's current name) [clinic start generated code]*/ static PyObject * _imp_find_frozen_impl(PyObject *module, PyObject *name) -/*[clinic end generated code: output=3fd17da90d417e4e input=4e52b3ac95f6d7ab]*/ +/*[clinic end generated code: output=3fd17da90d417e4e input=6aa7b9078a89280a]*/ { struct frozen_info info; frozen_status status = find_frozen(name, &info); @@ -2032,12 +2078,25 @@ _imp_find_frozen_impl(PyObject *module, PyObject *name) set_frozen_error(status, name); return NULL; } + PyObject *data = PyBytes_FromStringAndSize(info.data, info.size); if (data == NULL) { return NULL; } - PyObject *result = PyTuple_Pack(2, data, - info.is_package ? Py_True : Py_False); + + PyObject *origname = NULL; + if (info.origname != NULL && info.origname[0] != '\0') { + origname = PyUnicode_FromString(info.origname); + if (origname == NULL) { + Py_DECREF(data); + return NULL; + } + } + + PyObject *result = PyTuple_Pack(3, data, + info.is_package ? Py_True : Py_False, + origname ? origname : Py_None); + Py_XDECREF(origname); Py_DECREF(data); return result; } diff --git a/Tools/scripts/freeze_modules.py b/Tools/scripts/freeze_modules.py index 6091d831a8d31a..36e284100ed52c 100644 --- a/Tools/scripts/freeze_modules.py +++ b/Tools/scripts/freeze_modules.py @@ -274,6 +274,15 @@ def symbol(self): name = self.frozenid.replace('.', '_') return '_Py_M__' + name + @property + def ispkg(self): + if not self.pyfile: + return False + elif self.frozenid.endswith('.__init__'): + return False + else: + return os.path.basename(self.pyfile) == '__init__.py' + def resolve_frozen_file(frozenid, destdir=MODULES_DIR): """Return the filename corresponding to the given frozen ID. @@ -305,6 +314,17 @@ def __getattr__(self, name): def modname(self): return self.name + @property + def orig(self): + return self.source.modname + + @property + def isalias(self): + orig = self.source.modname + if not orig: + return True + return self.name != orig + def summarize(self): source = self.source.modname if source: @@ -507,6 +527,7 @@ def regen_frozen(modules): headerlines.append(f'#include "{header}"') deflines = [] + aliaslines = [] indent = ' ' lastsection = None for mod in modules: @@ -528,6 +549,15 @@ def regen_frozen(modules): deflines.append(line1) deflines.append(indent + line2) + if mod.isalias: + if not mod.orig: + entry = '{"%s", NULL},' % (mod.name,) + elif mod.source.ispkg: + entry = '{"%s", "<%s"},' % (mod.name, mod.orig) + else: + entry = '{"%s", "%s"},' % (mod.name, mod.orig) + aliaslines.append(indent + entry) + if not deflines[0]: del deflines[0] for i, line in enumerate(deflines): @@ -549,10 +579,17 @@ def regen_frozen(modules): lines = replace_block( lines, "static const struct _frozen _PyImport_FrozenModules[] =", - "/* sentinel */", + "/* modules sentinel */", deflines, FROZEN_FILE, ) + lines = replace_block( + lines, + "const struct _module_alias aliases[] =", + "/* aliases sentinel */", + aliaslines, + FROZEN_FILE, + ) outfile.writelines(lines) From 48fadb1f19f75fcaacb7d523dcc9e05b97dcce74 Mon Sep 17 00:00:00 2001 From: Ikko Ashimine Date: Wed, 6 Oct 2021 06:06:19 +0900 Subject: [PATCH 077/263] [Tools/peg_generator/pegen/parser.py] Fix typo: s/wether/whether/ (GH-28739) --- Tools/peg_generator/pegen/parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/peg_generator/pegen/parser.py b/Tools/peg_generator/pegen/parser.py index 4ce60e35dd0e0f..034e8e6017a22d 100644 --- a/Tools/peg_generator/pegen/parser.py +++ b/Tools/peg_generator/pegen/parser.py @@ -168,7 +168,7 @@ def __init__(self, tokenizer: Tokenizer, *, verbose: bool = False): self._verbose = verbose self._level = 0 self._cache: Dict[Tuple[Mark, str, Tuple[Any, ...]], Tuple[Any, Mark]] = {} - # Integer tracking wether we are in a left recursive rule or not. Can be useful + # Integer tracking whether we are in a left recursive rule or not. Can be useful # for error reporting. self.in_recursive_rule = 0 # Pass through common tokenizer methods. From 4c8d543823dde5a30615da61727837a48f7ab847 Mon Sep 17 00:00:00 2001 From: Illia Volochii Date: Wed, 6 Oct 2021 00:30:38 +0300 Subject: [PATCH 078/263] bpo-45343: Update bundled pip to 21.2.4 and setuptools to 58.1.0 (GH-28684) --- Lib/ensurepip/__init__.py | 8 ++++---- .../_bundled/pip-21.2.3-py3-none-any.whl | Bin 1563443 -> 0 bytes .../_bundled/pip-21.2.4-py3-none-any.whl | Bin 0 -> 1555100 bytes ...whl => setuptools-58.1.0-py3-none-any.whl} | Bin 819017 -> 816725 bytes .../2021-10-01-23-07-02.bpo-45343.ixmctD.rst | 1 + 5 files changed, 5 insertions(+), 4 deletions(-) delete mode 100644 Lib/ensurepip/_bundled/pip-21.2.3-py3-none-any.whl create mode 100644 Lib/ensurepip/_bundled/pip-21.2.4-py3-none-any.whl rename Lib/ensurepip/_bundled/{setuptools-57.4.0-py3-none-any.whl => setuptools-58.1.0-py3-none-any.whl} (80%) create mode 100644 Misc/NEWS.d/next/Library/2021-10-01-23-07-02.bpo-45343.ixmctD.rst diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py index 651f876e24bc8b..94f1b6604cb7ab 100644 --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py @@ -10,8 +10,8 @@ __all__ = ["version", "bootstrap"] _PACKAGE_NAMES = ('setuptools', 'pip') -_SETUPTOOLS_VERSION = "57.4.0" -_PIP_VERSION = "21.2.3" +_SETUPTOOLS_VERSION = "58.1.0" +_PIP_VERSION = "21.2.4" _PROJECTS = [ ("setuptools", _SETUPTOOLS_VERSION, "py3"), ("pip", _PIP_VERSION, "py3"), @@ -41,7 +41,7 @@ def _find_packages(path): # comparison since this case should not happen. filenames = sorted(filenames) for filename in filenames: - # filename is like 'pip-20.2.3-py2.py3-none-any.whl' + # filename is like 'pip-21.2.4-py3-none-any.whl' if not filename.endswith(".whl"): continue for name in _PACKAGE_NAMES: @@ -51,7 +51,7 @@ def _find_packages(path): else: continue - # Extract '20.2.2' from 'pip-20.2.2-py2.py3-none-any.whl' + # Extract '21.2.4' from 'pip-21.2.4-py3-none-any.whl' version = filename.removeprefix(prefix).partition('-')[0] wheel_path = os.path.join(path, filename) packages[name] = _Package(version, None, wheel_path) diff --git a/Lib/ensurepip/_bundled/pip-21.2.3-py3-none-any.whl b/Lib/ensurepip/_bundled/pip-21.2.3-py3-none-any.whl deleted file mode 100644 index d417df63d9ec1933c4204682b9931aa385f2b187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1563443 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

rCssi!kO4wr;`PHdL*0h9uv6 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